美文网首页
纯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