试图获得 CSS3 过渡以在我的链接上方增加一行border-top
。 出于某种原因,它只是不断增长,就好像它border-bottom
一样。 下面是使用 SASS 混合的代码。 它目前正在工作,但从底部而不是顶部增长。
#linkReport {
padding-left: 20px;
border-top: 0px solid transparent;
display: inline-block;
text-decoration: none;
color: $defaultText;
padding: 3px;
&:after {
@include outsideLinks;
}
&:hover:after {
@include outsideHover;
}
}
@mixin outsideLinks() {
border-top: 2px solid grey;
content: '';
display: block;
width: 0;
-webkit-transition: 0.5s ease;
transition: 0.5s ease;
}
@mixin outsideHover() {
width: 100%;
}
下面是使用上述代码生成的编译 CSS 创建的演示。
#linkReport {
padding-left: 20px;
border-top: 0px solid transparent;
display: inline-block;
text-decoration: none;
color: black;
padding: 3px;
}
#linkReport:after {
border-top: 2px solid grey;
content: '';
display: block;
width: 0;
-webkit-transition: 0.5s ease;
transition: 0.5s ease;
}
#linkReport:hover:after {
width: 100%;
}
<a id='linkReport' href='#'>Some Text</a>
为什么顶部边框出现在底部?
伪元素设置为 display: block
,因此默认情况下,它将显示在主元素内容下方的下一行中。这就是为什么伪元素的border-top
看起来好像是border-bottom
的原因。
有问题的演示:(添加了高度和背景颜色,以便您了解我的意思)
#linkReport {
padding-left: 20px;
border-top: 0px solid transparent;
display: inline-block;
text-decoration: none;
color: black;
padding: 3px;
}
#linkReport:after {
border-top: 2px solid grey;
content: '';
display: block;
width: 0;
height: 10px;
background: cyan;
-webkit-transition: 0.5s ease;
transition: 0.5s ease;
}
#linkReport:hover:after {
width: 100%;
}
<a id="linkReport">Some text</a>
解决方案是什么?
而不是设置display: block
,而是绝对相对于父元素定位伪元素,如下面的代码片段所示。
#linkReport {
position: relative; /* add this */
padding-left: 20px;
border-top: 0px solid transparent;
display: inline-block;
text-decoration: none;
color: black;
padding: 3px;
}
#linkReport:after {
border-top: 2px solid grey;
content: '';
/* display: block; remove this */
position: absolute; /* add this */
top: 0px; /* add this */
left: 0px; /* add this */
width: 0;
-webkit-transition: 0.5s ease;
transition: 0.5s ease;
}
#linkReport:hover:after {
width: 100%;
}
<a id="linkReport">Some text</a>