我在这里遵循了一些教程http://tympanus.net/codrops/2013/08/06/creative-link-effects/
并在悬停导航列表项时制作了一个漂亮的动画。
这是HTML:
<div id="nav">
<ul id="navbar">
<li><a href="#" data-hover="Home">Home</a></li>
<li><a href="#" data-hover="About">About</a></li>
<li><a href="#" data-hover="Contact">Contact</a></li>
<li><a href="#" data-hover="Sign Up">Sign Up</a></li>
</ul>
</div>
这是CSS:
#navbar {
list-style: none;
}
#navbar li {
display: inline-block;
padding: 15px;
}
#navbar li a {
position: relative;
display: inline-block;
margin: 15px 25px;
text-decoration: none;
letter-spacing: 1px;
font-weight: bold;
text-shadow: 0 0 1px rgba(255, 255, 255, 0.3);
font-size: 24px;
padding: 10px 0;
border-top: 1.5px solid #0972b4;
color: #0972b4;
}
#navbar li a:after {
position: absolute;
top: 0;
left: 0;
overflow: hidden;
padding: 10px 0;
max-width: 0;
border-bottom: 1.5px solid #000;
color: #000;
content: attr(data-hover);
-webkit-transition: max-width 0.5s;
-moz-transition: max-width 0.5s;
transition: max-width 0.5s;
}
#navbar li a:hover:after,
#navbar li a:focus:after {
max-width: 100%;
}
它非常适合“家庭”,“关于”和“联系”,但不适用于“注册”;显然是因为空间!
我理解代码是如何工作的,但我不知道为什么存在这样的错误!
伪类after
将相同的文本放在原始文本的顶部,然后根据转换规则对其进行着色并在悬停时扩展底部边框。
这是一个JSFiddle:https://jsfiddle.net/rnw00/3dhcz84b/1/
答案 0 :(得分:5)
之所以发生这种情况,是因为您正在将伪元素宽度从0
转换为100%
。当宽度小于100%
时,文字会换行到新行,从而导致您看到的问题。
您可以通过将white-space: pre
添加到后代锚元素来阻止这种情况。
#navbar li a {
position: relative;
display: inline-block;
/* ... */
white-space: pre;
}
#navbar {
list-style: none;
}
#navbar li {
display: inline-block;
padding: 15px;
}
#navbar li a {
position: relative;
display: inline-block;
margin: 15px 25px;
text-decoration: none;
letter-spacing: 1px;
font-weight: bold;
text-shadow: 0 0 1px rgba(255, 255, 255, 0.3);
font-size: 24px;
padding: 10px 0;
border-top: 1.5px solid #0972b4;
color: #0972b4;
white-space: pre;
}
#navbar li a:after {
position: absolute;
top: 0;
left: 0;
overflow: hidden;
padding: 10px 0;
width: 0;
border-bottom: 1.5px solid #000;
color: #000;
content: attr(data-hover);
-webkit-transition: width 0.5s linear;
-moz-transition: width 0.5s linear;
transition: width 0.5s linear;
}
#navbar li a:hover:after,
#navbar li a:focus:after {
width: 100%;
}
&#13;
<div id="nav">
<ul id="navbar">
<li><a href="#" data-hover="Home">Home</a>
</li>
<li><a href="#" data-hover="About">About</a>
</li>
<li><a href="#" data-hover="Contact">Contact</a>
</li>
<li><a href="#" data-hover="Sign Up">Sign Up</a>
</li>
</ul>
</div>
&#13;
通过将white-space
属性的值更改为pre
或nowrap
,您基本上可以防止伪元素的文本被包装(如果您需要的话)我想知道为什么我把它添加到锚元素而不是伪元素,因为值是继承的,因为伪元素本质上是一个子元素。它可能更安全直接添加到锚元素因为你不希望一个元素包装,另一个元素保持在一行。这可以确保元素之间的行为是一致的。)
答案 1 :(得分:3)
简单的解决方法是使用&#34;非破坏&#34;交换空格。空间..
<li><a href="#" data-hover="Sign Up">Sign Up</a></li>
答案 2 :(得分:1)
#navbar li a:after {
...
white-space: nowrap;
...
}
试试这个。你的内容线正在破裂。
有关详情,请参阅此处。 https://stackoverflow.com/questions/....