这篇主要记录在vue制作tab标签或者导航栏的下划线跟随效果

请添加图片描述

template中的html结构

要单独写一个标签做下划线,我用的是名为line的标签来做的
给它动态绑定left值

    <ul class="tabs">
      <i class="line" :style="{left: slideLeft}"></i>
      <li v-for="(item, index) in tabList" :key="index" class="tab" :class="{'tab-current':  index == currentIndex}" @click="clickTab(index)">{{item}}</li>
    </ul>

tablist数组长度发生变化时,依然适用
感觉比使用translateX计算滚动值更加简单一点

<script>
export default {
  name: '',
  data () {
    return {
      tabList: ['城市热销', '看了又看', '再看一遍'],
      tabLen: '',
      currentIndex: 0,
      slideLeft: ''
    }
  },
  methods: {
    // 点击时的下划线跟随效果
    clickTab (index) {
      this.currentIndex = index
      // 算出一个tab所占屏幕的宽度,除以2是为了让下划线待在tab标签宽度二分之一处,因为css中给line标签样式使用了绝对定位,并且设置了margin负值,所以这个位置可以让line正好在tab标签下面居中
      const left = 100 / this.tabLen / 2
      // 一次滑动二分一tab标签值
      // 三个标签,可以看成把屏幕分成了6份,每人占2份
      // 第一个下划线,从第1份的地方开始,是0*2+1
      // 第二个下划线,从第3份的地方开始,是1*2+1
      // 第三个下划线,从第5份的地方开始, 是2*2+1
      this.slideLeft = left * (index * 2 + 1) + '%'
    },
    // 刚进入页面没有点击时的下划线设置
    slideLineLeft () {
      this.tabLen = this.tabList.length
      const left = 100 / this.tabLen / 2
      this.slideLeft = left * (this.currentIndex * 2 + 1) + '%'
    }
  },
  mounted () {
    this.slideLineLeft()
    // 如果不写这个函数,页面刚加载时默认tab的下划线位置是不对的
  }
}
</script>

重点看line的样式,left值动态控制,所以在css样式中先不写

position: absolute
bottom: 0
width: .8rem
margin-left: -.4rem
transition: all 0.3s

.tabs
 display: flex
 justify-content: space-around
 text-align: center
 position: relative
 .tab
  font-size: .32rem
  line-height: .88rem
  color: #c3c6cd
 .tab-current
  font-weight: 700;
  color: #1c253a;
 .line
  position: absolute
  bottom: 0
  width: .8rem
  margin-left: -.4rem
  transition: all 0.3s
  height: .08rem
  border-radius: .04rem
  background: #fe686c
Logo

前往低代码交流专区

更多推荐