昨天看虎牙直播,发现导航栏挺有意思,自己也做个玩玩

<view class="tab_list row">
  <view class="tab_item center" wx:for='{{tab_list}}' data-index="{{index}}" bindtap="tab">{{item}}</view>
  <view class="border_line" style="left: {{border_left}}px;  width: {{border_width}}px;"></view>
</view>
.tab_list{
  position: relative
}

.tab_item{
  width: 20%;
  height: 40px;
  font-size: 14px;
}

.border_line{
  position: absolute;
  bottom: 2px;
  height: 6px;
  background: linear-gradient(90deg,    #FFA500,        #FFD700    );
  border-radius: 10px;
  transition: all .2s;
}
// pages/tab/tab.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    tab_list: ['全部', '推荐', 'LOL', '户外', '一起看'],
    tab_index: 0,
    last_index: 0,
    pos_list: [],
    border_width: 16,
    border_left: 0,
    is_disable:false //禁止点击
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.getPosition();
  },
  getPosition() {
    let tab_index = this.data.tab_index, border_width = this.data.border_width, last_index = this.data.last_index;
    let tab_width2 = border_width / 2;
    let pos_list = this.data.pos_list;
    if (!pos_list.length) {
      const query = wx.createSelectorQuery()
      query.selectAll('.tab_item').boundingClientRect()
      query.exec(res => {
        let { width } = res[0][0];
        this.setData({
          border_left: width / 2 - tab_width2,
          pos_list: res[0]
        })     
      })
    } else {
      let current, last; 
      let tab_left = pos_list[tab_index].left, tab_width = pos_list[tab_index].width;
      let last_left = pos_list[last_index].left, last_width = pos_list[last_index].width;
      if (tab_index < last_index) {//向左
        current = tab_left + tab_width / 2 - tab_width2; 
        last = last_left + last_width / 2 + tab_width2;
        let width = Math.abs(current - last); //当前和上次的宽度
        this.setData({
          border_width: width,
          border_left: tab_left + tab_width / 2 - tab_width2,  //向左需要动画过渡
        }, () => {
          setTimeout(() => {
            this.setData({
              border_width,
              is_disable:false
            })
          }, 200)
        })
      } else {  //向右
        current = tab_left + tab_width / 2 + tab_width2;
        last = last_left + last_width / 2 - tab_width2;
        let width = Math.abs(current - last);
        this.setData({
          border_width: width,
        }, () => {
          setTimeout(() => {
            this.setData({
              border_width,
              border_left: tab_left + tab_width / 2 - tab_width2,
              is_disable: false
            })
          }, 300)
        })
      }
    }
  },
  tab(e) {
    if (this.data.is_disable) return;

    let index = e.currentTarget.dataset.index;
    let tab_index = this.data.tab_index;
    if (index != tab_index) {
      this.setData({
        last_index:tab_index,
        tab_index: index,
        is_disable:true
      })
      this.getPosition();
    }
  },
})