【css js vue】超详细!!实现 tab菜单 动态滑动效果

前言
最近产品经理给我提了个新需求,希望能实现tab菜单切换时的滑动效果。
在这里插入图片描述
上面这是我做的效果图,在查找了一些资料之后,发现实现起来并没有特别的麻烦,但是对于我这种CSS学的不是很好的人,前期看起来还是有点懵的,所以写篇文章记录下我最终实现的效果。
一、实现思路

一般来说,实现这样的菜单我们最常用的是flex布局,我就默认你用的是这个。然后我们会为flex box里的每个item都绑上一个点击事件,这样在切换菜单的时候能展示不同的数据。

为了实现滑动门的效果,核心在于三点:

1.核心一
除了所有的菜单项,我们需要额外增加一个div设置成滑来滑去的滑动门。重点是,需要用到CSS的positon:absolute为滑动门固定位置,每切换一次菜单,都会调整div的左边的间距。 比如当我点击第一个菜单,这个滑动门的左间距是100px,点击第二个菜单,间距变成了200px,依此类推。

 .bg {
        ...
        position: absolute;
        cursor: pointer;
        left: 140px; //控制滑动门的左间距
        ....
      }

2.核心二
我们需要用到CSS的动画效果,来实现延迟。

 .bg {
       ...
        transition: all .5s;  //CSS过渡动画
        ...
      }

3.核心三
由于我们设定了position为absolute,滑动门已经脱离文档流了,因此需要用z-index设置层级。需要把 滑动门的z-index设置的靠屏幕里,flexbox的z-index设置的靠屏幕外。越小越靠近屏幕里

 .bg {
       ...
        z-index: 1;
       ...
      }

二、完整代码
1.html
代码如下(示例):

下面的代码比较容易懂,我想唯一值得解释的是,:class="{ 'ac': active == item }",当active == item的时候返回true,即class='{ac:true}'那么这个div就有ac属性了。
<div class="tabs_box">
       //这里我用v-for遍历了菜单栏
        <div class="tab_item" :class="{ 'ac': active == item }" v-for="item in siteArr" :key="item"
          @click="handleClick(item)">{{ item }}</div>
          //这行代码大家不难发现,有几个菜单,我们的滑动块就有几个left属性,可能写的有点笨,大佬可以在评论区给我更好的建议。
        <div class="bg" :class="{ 'left1': active == siteArr[1] , 'left2': active == siteArr[2],'left3': active == siteArr[3],'left4': active == siteArr[4]}"></div>
      </div>

2.css
代码如下(示例):

.tabs_box {
      color: #fff;
      display: flex;
      align-items: center;
      justify-content: center;
      width: 100%;
      height: 40px;
      border-radius: 30px;
      background: #4186f5;

      .tab_item {
        z-index: 2; //设置层级非常重要,不然你会发现滑块跑到文字上方了
        cursor: pointer;
        width: 18%;
        height: 100%;
        line-height: 40px;
        text-align: center;
      }
      //这行代码其实是用来给我们在激活菜单的时候切换字体颜色的
      .ac {
        color: #fff;
      }

      .bg {
        position: absolute; //绝对定位
        cursor: pointer;
        left: 140px;
        top: 49px;
        z-index: 1; //改变层级,置于底层才不会遮挡文字
        width: 18%;
        height: 40px;
        background: #FF9900;
        box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.5);
        transition: all .5s; //实现动画效果
      }
      //改变滑块左边的距离
      .left1 {
        left: 450px;
      }
      .left2 {
        left: 760px;
      }
      .left3 {
        left: 1080px;
      }
      //因为我有四个菜单
      .left4 {
        left: 1390px;
      }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值