tab组件

最新使用滚动条的方式写了tab组件,很新颖,分享记录

需求:

1、tab组件没有占满父级的宽度的时候,如图一,没有左右两侧的icon

2、tab组件占满父级的宽度的时候,如图二,有左右两侧的icon,点击icon可以进行左右移动

3、路由进行变化的时候,此时的路由对应的tab应该显示在可见区域内,即随着路由的变化,tab的可见区域的内容也随着变化

代码:

注:所有使用id找dom的都可以使用ref来替代

html:

<div class="notesParent">
  // 超出父级的宽度的时候显示icon,使用了visibility进行显隐控制
  <i class="el-icon-arrow-left" :style="{visibility: scrollBoole}" @click="inconClick('left')"></i>
  <div class="notesStyle" id="notesStyle">
    // 需要找到具体的tab,所以添加了动态id
    <div v-for="(item, index) in noteData" :key="index" :id="item.id" :class="classObj[index]? 'elseName': 'firstName'" @click="tabClick(item, index)">
      <span>{{item.name}}</span>
      // 第一个tab默认不能关闭
      <img :style="{display: (index === 0? 'none':'inline-block')}" />
    </div>
  </div>
 <i class="el-icon-arrow-right" :style="{visibility: scrollBoole}" @click="inconClick('right')"></i>
</div>

js:

data(){
  return {
    scrollBoole: false,
    notesData: [],
    classObj:{}
  }
},
watch:{
  // 检测tab数据的变化
  '$store.state.commonData.tabArrBase'(newVal){
    this.notesData = newVal
    setTimeout(()=>{
      // 数据变化的时候使用scrollWidth和clientWidth来实时判断滚动条是否存在
      this.scrollBoole = document.querySelect('#notesStyle').scrollWidth - document.querySelect('#notesStyle').clientWidth>0? true: false
    })
  },
  // 路由变化的时候,被选中tab跟路由保持一致
  '$route'(newVal){
     this.notesData.forEach((item, index) => {
          if (newVal.path === item.index) {
            this.startInit()
            this.classObject[index] = true
            setTimeout(() => {
              let chazhi = document.querySelector('#' + item.id).offsetLeft - document.querySelector('#notesStyle').offsetWidth
              if (chazhi > 0) {
                document.querySelector('#notesStyle').scrollLeft = document.querySelector('#notesStyle').scrollLeft + chazhi
              } else {
                document.querySelector('#notesStyle').scrollLeft = 0
              }
            })
          }
        })
  }
},
methods: {
      // 左右icon事件
      iconClick (type) {
        document.querySelector('#notesStyle').scrollLeft = type === 'left'
          ? document.querySelector('#notesStyle').scrollLeft - 15
          : document.querySelector('#notesStyle').scrollLeft + 15
      },
      startInit () {
        this.notedDate.forEach((item, index) => {
          this.$set(this.classObj, index, false)
        })
      },
      // 点击tab
      tabClick (item) {
        this.$route.push({ path: item.index })
      },
      // 删除tab
      closeTab (event, item, index) {
        window.event
          ? window.event.cancelBubble = true
          : event.stopPropagation();
        this.notedDate.splice(index, 1)
      }
    }

 css只写了比较重要的一句,即使用滚动条,当时却隐藏被看不到

 .notesStyle::-webkit-scrollbar {
    width: 6px;
    height: 3px;
    display: none;
  }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值