note icon indicating copy to clipboard operation
note copied to clipboard

纯 CSS 导航栏下划线跟随效果

Open liuyib opened this issue 6 years ago • 0 comments

先看下效果图:

test

虽然纯 CSS 实现,但效果还是很棒呢!

下面来看一下具体实现。

首先准备一些 li 标签,然后使用伪类做出下划线效果:

test1

代码如下:

<ul>
  <li>不可思议的</li>
  <li>导航栏</li>
  <li>纯CSS实现</li>
  <li>下划线</li>
  <li>跟随光标</li>
</ul>
li {
  float: left;
  position: relative;
  padding: 10px;
  list-style: none;
  cursor: pointer;
}

li::after {
  content: "";
  display: block;
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  border-bottom: 2px solid #000;
}

这里使用伪类来做出下划线效果是很重要的。如果直接在 li 标签上使用 border-bottom: 2px solid #000; 来实现的话,后面是无法改变其宽度的。

当然,一开始是没有下划线的,所以需要将所有 li 伪类的宽度设为 0。

然后鼠标 hover 时,将 li 伪类的宽度从 width: 0 -> width: 100%,效果如下:

test

li:hover::after {
  width: 100%;
}

感觉离成功又进了一步,下面再来分析一下要实现的效果: 当鼠标移出时,下划线从右向左伸长,当鼠标移入时,下划线从左到右伸长。

asefae

想要实现下划线从右向左伸长,首先设置 li 伪类的属性 left: 100%,然后鼠标 hover 时 left: 100% -> left: 0,由于此时 width: 0 -> width: 100%,所以就有了这个效果:

test

代码如下:

li::after {
   content: '';
   display: block;
   position: absolute;
+ left: 100%;
   top: 0;
   width: 0;
   height: 100%;
   border-bottom: 2px solid #000;
   transition: all .2s linear;
}

li:hover::after {
+ left: 0;
   width: 100%;
}

虽然,两种效果都能实现,但也只能丢了西瓜捡了芝麻。所以下面就要请神奇的 ~ 选择器出面了。

当鼠标 hover 时,让当前 li 后面的所有 li::afterleft 都为 0(初始是 100%),然后当鼠标 hover 后面的 li 时,由于他们伪类的 left 已经是 0,所以只有宽度在变,这样就实现了想要的效果。

添加以下代码:

li:hover ~ li::after {
  left: 0;
}

完整的 CSS 代码如下:

li {
  float: left;
  position: relative;
  padding: 10px;
  list-style: none;
  cursor: pointer;
}

li::after {
  content: "";
  display: block;
  position: absolute;
  left: 100%;
  top: 0;
  width: 0;
  height: 100%;
  border-bottom: 2px solid #000;
  transition: all 0.2s linear;
}

li:hover::after {
  left: 0;
  width: 100%;
}

li:hover ~ li::after {
  left: 0;
}

Demo 体验地址:https://liuyib.github.io/demo/note/underline-follow/


原文链接:https://juejin.im/post/5ab9e9056fb9a028be360292

liuyib avatar Mar 13 '19 13:03 liuyib