悬停动画上的文字无法正常使用空间

时间:2016-01-04 21:20:22

标签: html css

我在这里遵循了一些教程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/

3 个答案:

答案 0 :(得分:5)

之所以发生这种情况,是因为您正在将伪元素宽度从0转换为100%。当宽度小于100%时,文字会换行到新行,从而导致您看到的问题。

您可以通过将white-space: pre添加到后代锚元素来阻止这种情况。

Updated Example

#navbar li a {
    position: relative;
    display: inline-block;
    /* ... */
    white-space: pre;
}

&#13;
&#13;
#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;
&#13;
&#13;

通过将white-space属性的值更改为prenowrap,您基本上可以防止伪元素的文本被包装(如果您需要的话)我想知道为什么我把它添加到锚元素而不是伪元素,因为值是继承的,因为伪元素本质上是一个子元素。它可能更安全直接添加到锚元素因为你不希望一个元素包装,另一个元素保持在一行。这可以确保元素之间的行为是一致的。)

答案 1 :(得分:3)

简单的解决方法是使用&#34;非破坏&#34;交换空格。空间..

<li><a href="#" data-hover="Sign&nbsp;Up">Sign&nbsp;Up</a></li>

https://jsfiddle.net/3dhcz84b/2/

答案 2 :(得分:1)

#navbar li a:after {
  ...
  white-space: nowrap;
  ...
}

试试这个。你的内容线正在破裂。

有关详情,请参阅此处。 https://stackoverflow.com/questions/....

http://codepen.io/faizanrupani/pen/qbRGyb