美文网首页
纯css 实现tab导航栏下划线跟随动画

纯css 实现tab导航栏下划线跟随动画

作者: liwuwuzhi | 来源:发表于2019-09-16 13:13 被阅读0次

起因:
闲来无事,看到简述我的 “我的主页” 导航栏上很经典的鼠标以上很经典的动画。
记得之前业务上也有要类似动画的时候,但那是用的是jQuery,就直接找了个jQuery的插件。
得闲刚好看到简书这动画,便 f12 看了下代码结构。



最终实现效果:



具体实现代码:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
*{
    padding: 0;
    margin: 0
}
.trigger-menu {
    border-bottom: 1px solid #f0f0f0;
    font-size: 0; /*消除li inline-block 为行内元素后的默认间距*/
    list-style: none;
}
.trigger-menu li {
    position: relative; /*关键点: 为每个li设置绝对定位*/
    display: inline-block; /*使li为块级元素,可以横向排列*/
    padding: 8px 0;
    border-bottom: 2px solid transparent
}
.trigger-menu li:after { /*hover状态下时的底部横线*/
    content: "";
    position: absolute; /*关键点: 该元素行对定位于 li*/
    left: 50%;
    bottom: -2px;
    width: 100%;
    opacity: 0;
    border-bottom: 2px solid #646464;
    transform: translate(-50%) scaleX(0);
    transition: .2s ease-in-out;
}
.trigger-menu li:hover::after {
    opacity: 1;
    transform: translate(-50%) scaleX(1);
}
.trigger-menu a {
    padding: 13px 20px;
    font-size: 15px;
    font-weight: 700;
    color: #969696;
    line-height: 25px;
    text-decoration: none;
}
.trigger-menu a:hover {
    color: #646464
}

/*点击后添加 .active 样式*/
.trigger-menu li.active{
    color: #646464;
    border-bottom: 2px solid #646464  
}
.trigger-menu li.active a{
    color: #646464;
}

    </style>

</head>
<body>
<ul class="trigger-menu">
    <li><a href="">文章</a></li>
    <li><a href="">动态</a></li>
    <li><a href="">最新评论</a></li>
    <li class="active"><a href="">热门</a></li>
</ul>
</body>
</html>



解析:

  1. 关键点
    利用元素的after伪类创建底部横线。

  2. 横线怎么刚好定在元素的底部呢?
    利用元素间的相对定位来使横线定位到li底部。 li 设置为绝对定位 relative,然后把 after 设置 absolute 相对于li来定位。
    bottom: -2px?要使横线刚好在ul底部边框上,因为横线高度为2px,所以横线定在底部然后上移两个像素。
    而 left: 50%;transform: translate(-50%); 是让元素位于父级居中。

3.动画是怎么实现的?
如果一开始就让横线展示出来要怎么写?

.trigger-menu li:after {
    content: "";
    position: absolute; 
    left: 50%;
    bottom: -2px;
    width: 100%;
    border-bottom: 2px solid #646464;
    transform: translate(-50%) scaleX(1);  /*原本为scaleX(0)*/
}

这样一开始横线就是出现的。而实例中我们hover时让横线出现的做法是 设置透明度可见和不缩放,如下

.trigger-menu li:hover::after {
    transform: translate(-50%) scaleX(1);
}

即一开始横线隐藏了,是因为 scaleX(0), 把after缩写到0,即视觉上看不见(实际上还是占这那块位置)。而hover时,把 scaleX(1)设为不缩放,即能看到完整的横线。

那么是怎么做到横线由中间向两边延展?就是让横线位于父级居中 “left: 50%; transform: translate(-50%)”

这样就完成了我们所看到的动效了。

相关文章

网友评论

      本文标题:纯css 实现tab导航栏下划线跟随动画

      本文链接:https://www.haomeiwen.com/subject/hiqwyctx.html