1. 程式人生 > 程式設計 >vue實現tab標籤(標籤超出自動滾動)

vue實現tab標籤(標籤超出自動滾動)

當建立的tab標籤超出頁面可視區域時自動滾動一個tab標籤距離,並可手動點選滾動tab標籤,實現效果請看GIF圖

效果預覽GIF圖

vue實現tab標籤(標籤超出自動滾動)

<template>
    <div class="main-box">
        <button @click="add">新增</button>
        <div class="main-box-tab">
            <i @click="previous"><<</i>
            <i @click="next">>></i>
            <div class="main-box-tab-content" ref="tabs">
                <div class="main-box-tab-roll">
                    <div v-for="(item,index) in tabs" :key="index"
                         :class="{'tab-item-action':actionName === item.name,'tab-item':actionName !== item.name}"
                         @click.stop="clickTab(item.name,index)">
                        <span>{{item.meta.title}}</span>
                        <i class="el-icon-close" @click.stop="close(item.
程式設計客棧
name)"></i> </div> </div> </div> </div> <div class="main-box-content"> <div>{{actionName}}</div> </div> </div> </template> <script> export default { name: "index",data() { return { tabs: [],moveX: 0,count: 1,unoccupied: 0,tabsCount: 0,actionName: 'test1' } },watch: { actionName(val) { let len = this.tabs.length // 如有重複資料退出後續函式執行 for (let i = 0; i < len; i++) { if (this.tabs[i].name === val) { this.$nextTick(() => { this.translateX((i + 1 - this.tabsCount) * this.width - this.unoccupied) }) return } } this.tabs.push({ name: `test${this.count}`,meta: { title: `test${this.count}` } }) this.$nextTick(() => { // (總共有多少個tabs - 未偏移時可見的元素個數) * 單個tab標籤元素長度 - 被遮擋tab元素的可見部分的寬度 this.translateX((this.tabs.length - this.tabsCount) * this.width - this.unoccupied) }) } },mounted() { this.tabs.push({ name: `test${this.count}`,meta: { title: `test${this.count}` } }) this.$nextTick(() => { let tabs = this.$refs.tabs let getStyle = getComputedStyle(tabs.children[0].children[0],null) let marginLeft = parseFloat(getStyle.marginLeft.substr(0,getStyle.marginLeft.length - 2)) let marginRight = parseFloat(getStyle.marginRight.substr(0,getStyle.marginRight.length - 2)) // 元素實際寬度 = 元素的寬度 + 外邊距 this.width = marginLeft + marginRight + tabs.children[0].children[0].offsetWidth /** * 以下注釋計算方式用於理解實現邏輯 **/ // // 可視區域能放入多少個元素 = 可視區域的寬度 / 子元素實際寬度 // let num = tabs.offsetWidth / this.width // // 被遮擋tab元素的可見部分的寬度 = 可見區域的寬度 - (子元素實際寬度 * num轉為整數) // this.unoccupied = tabs.offsetWidth - (this.width * parseInt(num)) // 最終精簡為取餘(得數跟上面的計算是一樣的) this.unoccupied = tabs.offsetWidth % this.width // 轉為整數 http://www.cppcns.com
this.tabsCount = parseInt(tabs.offsetWidth / this.width) }) },methods: { add() { this.count++ this.actionName = `test${this.count}` },/** * 切換tab標籤頁 **/ clickTab(name) { if (this.actionName !== name) { this.actionName = name } },/** * 關閉tab標籤頁 **/ close(name) { let len = this.tabs.length let jumpName = null if (len > 1) { for (let i = 0; i < len; i++) { if (this.tabs[i].name === name) { this.tabs.sp
程式設計客棧
lice(i,1) jumpName = this.tabs[i ? i - 1 : 0].name if (this.actionName !== jumpName && name === this.actionName) { this.actionName = jumpName } this.$nextTick(() => { this.previous() }) return } } } },/** * 往右偏移 **/ next() { // scrollWidth獲取不準確 // 使用this.width * this.tabs.length計算出總長度 let totalWidth = this.width * this.tabs.length this.$nextTick(() => { let dom = this.$refs.tabs // 可視區域 < 滾動區域(滾動區域大於可視區域才可以移動) // 移動距離 + 可視區域 = 滾動區域的寬度(上一次的寬度,當點選時才是實際寬度)< 滾動區域 if (dom.clientWidth < totalWidth && this.moveX + dom.clientWidth < totalWidth) { // this.moveX為0減去空餘空間的寬度 this.moveX += this.moveX ? this.width : this.width - this.unoccupied this.translateX(this.moveX) } }) },/** * 往左偏移 **/ previous() { if (this.moveX > 0) { this.moveX -= this.width this.translateX(this.moveX) } },/** * 開始移動dom **/ translateX(x) { this.moveX = x < 0 ? 0 : x this.$refs.tabs.children[0].style.transform = `translateX(-${this.moveX}px)` } } } </script> <style lang="scss" scoped> .main-box { height: 500px; width: 500px; padding: 10px 20px 20px 20px; .main-box-tab { position: relative; padding: 10px 20px; ovhXBhAjEGYerflow: hidden; & > i { position: absolute; cursor: pointer; bottom: 15px; &:nth-child(1) { left: 0; } &:nth-child(2) { right: 0; } } .main-box-tab-content { overflow: hidden; .main-box-tab-roll { transition: transform .5s; display: flex; align-items: center; div { flex-shrink: 0; cursor: pointer; width: 130px; height: 25px; margin: 0 5px; display: flex; align-items: center; justify-content: space-between; span,i { font-size: 12px; } span { margin-left: 10px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } i { margin-right: 10px; } } } } .tab-item { color: #cccccc; background-color: rgba(255,255,.5); border-radius: 0 1px 0 1px; border: 1px solid #052141; } .tab-item-action { color: #ffffff; background: rgba(0,180,0.8); border-radius: 0 1px 0 1px; border: 1px solid #1E2088; } } .main-box-content { height: calc(100% - 70px); padding: 10px; border: 1px saddlebrown 程式設計客棧solid; background-size: 100% 100%; } } </style>

到此這篇關於vue實現tab標籤(標籤超出自動滾動)的文章就介紹到這了,更多相關vue tab標籤 內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!