为标签云创建路标样式轮廓

Creating road sign style outline for a tag cloud

我想使用 CSS3 创建一个标签云显示,其中略带圆形的箭头指向右侧作为每个标签的轮廓。我目前的努力如下所示。

body,html{margin:0;padding:0;}
  body
  {
   padding:1em;
   background-color:#23232f;
   font-family:arial;
  }
  div
  {
   display:inline-block;
   position:relative;
   margin-right:2em;
   margin-bottom:1em;
  }

  

  .tag
  {
   display:inline-block;
   position:relative;
   text-align:center;
   
   height:1.5em;
   z-index:100;
   background-color:transparent;
   color:white;
  }

  .tag > span
  {
   position:relative;
   display:flex; 
   align-items:center;
   justify-content:center;
   height:1.5em;
   border-radius:2px;
   border-top-right-radius:0;
   border-bottom-right-radius:0;
   padding-left:1em;
   padding-right:1em;
   border:1px solid silver;
   border-right-style:none;
   
  }

  .tag > span::after
  {
   content:' ';
   position:absolute;
   top:-0.17em;
   left:calc(100% - 1px);
   width:1.25em;
   height:1.25em;
   border:1px solid silver;
   border-left-style:none;
   
   border-bottom-style:none;
   border-radius:4px;
   transform:rotate(45deg);
   transform-origin:top left;
   z-index:-10;
  }
<div class='tag'>
 <span>Stack Exchange</span>
</div>
<div class='tag'>
 <span>Ask Ubuntu</span>
</div>
<div class='tag'>
 <span>Stack Overflow</span>
</div>

虽然这可行,但我通过反复试验得到了一些正确的东西。特别是我不清楚

纯几何建议为了获得 1.5em 的高度,伪元素的边应为 1.067em。这是

造成的吗

或者更一般地说,是否有更好的方法来做到这一点 - 请记住,我希望结果始终具有响应性。

要获得更准确的结果,您需要使用 top:-1px,因为主元素上有 1px 边框,position:absolute 考虑填充框,然后根据您的尺寸使用 calc(1.5em/1.41),这是主元素的高度除以 sqrt(2)。您也可以保留 left:100%

body {
  padding: 1em;
  background-color: #23232f;
  font-family: arial;
}

div {
  display: inline-block;
  position: relative;
  margin-right: 2em;
  margin-bottom: 1em;
}

.tag {
  display: inline-block;
  position: relative;
  text-align: center;
  height: 1.5em;
  z-index: 100;
  background-color: transparent;
  color: white;
}

.tag>span {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 1.5em;
  border-radius: 2px;
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
  padding-left: 1em;
  padding-right: 1em;
  border: 1px solid silver;
  border-right-style: none;
}

.tag>span::after {
  content: ' ';
  position: absolute;
  top: -1px; /* equal to border width */
  left: 100%;
  width: calc(1.5em/1.41);
  height: calc(1.5em/1.41);
  border: 1px solid silver;
  border-left-style: none;
  border-bottom-style: none;
  border-radius: 0 4px 0 0;
  transform: rotate(45deg);
  transform-origin: top left;
  z-index: -10;
}
<div class='tag'>
  <span>Stack Exchange</span>
</div>
<div class='tag'>
  <span>Ask Ubuntu</span>
</div>
<div class='tag'>
  <span>Stack Overflow</span>
</div>