为标签云创建路标样式轮廓
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>
虽然这可行,但我通过反复试验得到了一些正确的东西。特别是我不清楚
- 为什么我不得不将
::after
伪元素向上移动 0.17em
- 为什么那个元素的 height/width 必须是 1.25em
纯几何建议为了获得 1.5em 的高度,伪元素的边应为 1.067em。这是
造成的吗
- 边框半径效果?
transform
和 height/width
的应用顺序?
或者更一般地说,是否有更好的方法来做到这一点 - 请记住,我希望结果始终具有响应性。
要获得更准确的结果,您需要使用 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>
我想使用 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>
虽然这可行,但我通过反复试验得到了一些正确的东西。特别是我不清楚
- 为什么我不得不将
::after
伪元素向上移动 0.17em - 为什么那个元素的 height/width 必须是 1.25em
纯几何建议为了获得 1.5em 的高度,伪元素的边应为 1.067em。这是
造成的吗- 边框半径效果?
transform
和height/width
的应用顺序?
或者更一般地说,是否有更好的方法来做到这一点 - 请记住,我希望结果始终具有响应性。
要获得更准确的结果,您需要使用 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>