Vue中的element tabs點擊錨點定位,鼠標滾動定位
更新時間:2024年07月24日 10:22:37 作者:李澤舉
這篇文章主要介紹了Vue中的element tabs點擊錨點定位,鼠標滾動定位方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
一、效果圖
二、代碼
- html
<el-tabs class="customer-tab" type="card" @tab-click="jump" v-model="tabName" > <el-tab-pane v-for="(tab, index) in tabs" :name="tab.refName" :key="index" :label="tab.name" ></el-tab-pane> </el-tabs> <div class="scroll-content" @scroll="onScroll" :style=" 'overflow-x: hidden; overflow-y: auto;height:' + contentStyleObj.height " > <!-- 用戶管理 --> <div :ref="tabs[0].refName" class="scroll-item"> <div class="line-name"> <h2>{{ tabs[0].name }}</h2> </div> <div> <p style="height: 40px" v-for="item in [ 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]" :key="item" > 待發(fā)貨符合規(guī)范化如故 </p> </div> </div> <!-- 配置管理 --> <div :ref="tabs[1].refName" class="scroll-item"> <div class="line-name"> <h2>{{ tabs[1].name }}</h2> </div> <div> <p style="height: 40px" v-for="item in [ 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]" :key="item" > 新能說出的基本功發(fā)到你DNF不得發(fā)布 </p> </div> </div> <!-- 角色管理 --> <div :ref="tabs[2].refName" class="scroll-item" style="padding-top: 1rem; top: 5px" > <div class="line-name"> <h2>{{ tabs[2].name }}</h2> </div> <div> <p v-for="item in [ 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]" :key="item" > 新水泥廠劇場版 </p> </div> </div> <!-- 角色管理2 --> <div :ref="tabs[3].refName" class="scroll-item" style="padding-top: 1rem; top: 5px" > <div class="line-name"> <h2>{{ tabs[3].name }}</h2> </div> <div> <p v-for="item in [ 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]" :key="item" > 新水泥廠劇場版 </p> </div> </div> </div>
- js
<script> export default { name: 'index', props: {}, components: {}, data() { return { tabIndex: '0', contentStyleObj: { height: '100px', }, tabName: 'setOneRef', tabs: [ { name: '用戶管理', refName: 'setOneRef', }, { name: '配置管理', refName: 'setTwoRef', }, { name: '角色管理', refName: 'setThreeRef', }, { name: '角色管理2', refName: 'setFourRef', }, ], } }, computed: {}, watch: {}, created() { this.getHight() window.addEventListener('resize', this.getHight) }, destroyed() { window.removeEventListener('resize', this.getHight) }, methods: { // tab click jump(tab, event) { let target = document.querySelector('.scroll-content') let scrollItems = document.querySelectorAll('.scroll-item') // 判斷滾動條是否滾動到底部 if (target.scrollHeight <= target.scrollTop + target.clientHeight) { this.tabIndex = tab.index.toString() } let totalY = scrollItems[tab.index].offsetTop - scrollItems[0].offsetTop // 錨點元素距離其offsetParent(這里是body)頂部的距離(待滾動的距離) let distance = document.querySelector('.scroll-content').scrollTop // 滾動條距離滾動區(qū)域頂部的距離 // let distance = document.body.scrollTop || document.documentElement.scrollTop || window.pageYOffset // 滾動條距離滾動區(qū)域頂部的距離(滾動區(qū)域為窗口) // 滾動動畫實現(xiàn), 使用setTimeout的遞歸實現(xiàn)平滑滾動,將距離細分為50小段,10ms滾動一次 // 計算每一小段的距離 let step = totalY / 50 if (totalY > distance) { smoothDown(document.querySelector('.scroll-content')) } else { let newTotal = distance - totalY step = newTotal / 50 smoothUp(document.querySelector('.scroll-content')) } // 參數(shù)element為滾動區(qū)域 function smoothDown(element) { if (distance < totalY) { distance += step element.scrollTop = distance setTimeout(smoothDown.bind(this, element), 10) } else { element.scrollTop = totalY } } // 參數(shù)element為滾動區(qū)域 function smoothUp(element) { if (distance > totalY) { distance -= step element.scrollTop = distance setTimeout(smoothUp.bind(this, element), 10) } else { element.scrollTop = totalY } } }, // 滾動條滾動 onScroll(e) { let scrollItems = document.querySelectorAll('.scroll-item') for (let i = scrollItems.length - 1; i >= 0; i--) { // 判斷滾動條滾動距離是否大于當前滾動項可滾動距離 let judge = e.target.scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop - 400 if (judge) { this.tabIndex = i.toString() // 找對應的tab-name值 this.tabName = this.tabs[this.tabIndex].refName break } } }, getHight() { this.contentStyleObj.height = window.innerHeight - 190 + 'px' }, }, } </script>
- css
<style lang="scss" scoped> ::v-deep.customer-tab { width: 100%; height: 50px; background-color:#f5f7fa; padding: 4px; } ::v-deep.el-tabs--card > .el-tabs__header { border-bottom: none; margin: 0; .el-tabs__nav { width: 100%; display: flex; justify-content: space-around; border: none; .el-tabs__item { width: 25%; text-align: center; border: none; } .is-active { border-radius: 4px; background-color: #005BD9; color: #fff; } } } </style>
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue用vis插件如何實現(xiàn)網(wǎng)絡拓撲圖
這篇文章主要介紹了vue用vis插件如何實現(xiàn)網(wǎng)絡拓撲圖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10淺談Vue.js 關于頁面加載完成后執(zhí)行一個方法的問題
這篇文章主要介紹了Vue.js 關于頁面加載完成后執(zhí)行一個方法的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04vue?router進行路由跳轉并攜帶參數(shù)的實例詳解(params/query)
在使用`router.push`進行路由跳轉到另一個組件時,可以通過`params`或`query`來傳遞參數(shù),這篇文章主要介紹了vue?router進行路由跳轉并攜帶參數(shù)(params/query),需要的朋友可以參考下2023-09-09