vue雙向錨點(diǎn)實(shí)現(xiàn)過(guò)程簡(jiǎn)易版(scrollIntoView)
一、需求
左邊是內(nèi)容板塊,右邊是目錄結(jié)構(gòu),點(diǎn)擊右邊內(nèi)容跳轉(zhuǎn)到左邊相應(yīng)位置展示,滑動(dòng)左邊內(nèi)容右邊目錄自動(dòng)跳轉(zhuǎn)。
二、實(shí)現(xiàn)
- 左邊每一個(gè)內(nèi)容模塊都給一個(gè)ref和應(yīng)該相同的class類(lèi)名,方便獲取dom;
- 左邊內(nèi)容區(qū)域使用滑動(dòng)事件@scroll="handleScroll",內(nèi)容區(qū)域滑動(dòng)即觸發(fā)該方法;
- 右邊使用點(diǎn)擊事件@click="goAnchor('anchor-' + index, index)"獲取當(dāng)前點(diǎn)擊的dom;
handleScroll()
滾動(dòng)監(jiān)聽(tīng)方法實(shí)現(xiàn)滑動(dòng)左邊內(nèi)容對(duì)應(yīng)上右邊目錄
goAnchor()
右邊錨點(diǎn)選中跳轉(zhuǎn)相應(yīng)內(nèi)容區(qū)域,通過(guò)scrollIntoView({ behavior: 'smooth' })平滑跳轉(zhuǎn)
實(shí)現(xiàn)代碼
<template> <div class="panel-block flex"> <div class="panel-left" ref="anchorRef" @scroll="handleScroll"> <div class="panel-item anchor-item" ref="anchor-0"> <div class="panel-item-title">內(nèi)容區(qū)域1</div> xxx </div> <div class="panel-item anchor-item" ref="anchor-1"> <div class="panel-item-title">內(nèi)容區(qū)域2</div> xxx </div> <div class="panel-item anchor-item" ref="anchor-2"> <div class="panel-item-title">內(nèi)容區(qū)域3</div> <div class="panel-item-content"> xxx </div> </div> <div class="panel-item anchor-item" ref="anchor-3"> <div class="panel-item-title">內(nèi)容區(qū)域4</div> <div class="panel-item-content"> xxx </div> </div> </div> <div class="panel-right"> <div class="step-line"></div> <ul class="step-ul"> <li class="flex_align_item_center" v-for="(item, index) in stepData" :key="index" :class="{ 'step-active': activeBtn == index }" @click="goAnchor('anchor-' + index, index)" > <div class="step-icon"></div> <div class="step-label">{{ item }}</div> </li> </ul> </div> </div> </template>
<script> export default { data() { return { activeBtn: 0, //錨點(diǎn)按鈕 stepData: ['區(qū)域1', '區(qū)域2', '區(qū)域3', '區(qū)域4'], contentDiv: null, //錨點(diǎn)區(qū)域 } }, methods: { //錨點(diǎn)跳轉(zhuǎn) goAnchor(selector, index) { this.activeBtn = index this.$refs[selector].scrollIntoView({ behavior: 'smooth' }) }, // 滾動(dòng)監(jiān)聽(tīng)器 handleScroll(i) { // 獲取所有錨點(diǎn)元素 const navContents = document.querySelectorAll('.anchor-item') // 所有錨點(diǎn)元素的 offsetTop const offsetTopArr = [] navContents.forEach((item) => { offsetTopArr.push(item.offsetTop) }) // 獲取當(dāng)前文檔流的 scrollTop const scrollTop = this.$refs.anchorRef.scrollTop offsetTopArr.forEach((item, index) => { if (scrollTop >= item) { this.activeBtn = index } }) }, } } </script>
-----------------以下為樣式代碼---------------------- <style lang="scss" scoped> .panel-block { height: 100%; .panel-left { width: calc(100% - 180px); overflow-y: auto; height: 100%; .panel-item { .panel-item-content { padding: 10px; border-top: 0; min-height: 40px; .table-params { .table-header { height: 40px; line-height: 40px; width: 100%; border: 1px solid #ebeef5; border-bottom: none; background: #f5f7fa; font-weight: 700; font-size: 14px; color: #303133; padding-left: 15px; } .table-body-type { height: 32px; line-height: 32px; width: 100%; border: 1px solid #ebeef5; border-bottom: none; color: #303133; padding-left: 15px; .type-title { font-weight: 700; font-size: 12px; } } } } } } .panel-right { padding-top: 10px; position: fixed; left: calc(100% - 210px); .step-line { position: absolute; left: 6px; top: 0; width: 1px; background: #dcdfe6; height: calc(50vh - 85px); z-index: 0; } .step-ul { li { padding-bottom: 20px; .step-icon { width: 13px; height: 13px; margin-right: 20px; border-radius: 50%; z-index: 1; } .step-label { font-weight: 700; font-size: 14px; line-height: 22px; color: #303133; } } .step-active { .step-icon { border: 1px solid #1989fe; background: #fff; } .step-label { color: #1989fe; } } } } ::-webkit-scrollbar { width: 0 !important; } } </style>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue結(jié)合g6實(shí)現(xiàn)樹(shù)級(jí)結(jié)構(gòu)(compactBox?緊湊樹(shù))
本文主要介紹了vue結(jié)合g6實(shí)現(xiàn)樹(shù)級(jí)結(jié)構(gòu),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06在vue中使用export?default導(dǎo)出的class類(lèi)方式
這篇文章主要介紹了在vue中使用export?default導(dǎo)出的class類(lèi)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03vue2+element?ui?中的el-table?選中當(dāng)前行當(dāng)前行變色的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue2+element?ui?中的el-table?選中當(dāng)前行當(dāng)前行變色的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07解決antd 下拉框 input [defaultValue] 的值的問(wèn)題
這篇文章主要介紹了解決antd 下拉框 input [defaultValue] 的值的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10elementui 開(kāi)始結(jié)束時(shí)間可以選擇同一天不同時(shí)間段的實(shí)現(xiàn)代碼
這篇文章主要介紹了elementui 開(kāi)始結(jié)束時(shí)間可以選擇同一天不同時(shí)間段的實(shí)現(xiàn)代碼,需要先在main.js中導(dǎo)入相應(yīng)代碼,代碼簡(jiǎn)單易懂,需要的朋友可以參考下2024-02-02淺談vue,angular,react數(shù)據(jù)雙向綁定原理分析
本篇文章主要介紹了淺談vue,angular,react數(shù)據(jù)雙向綁定原理分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Vue3+Tsx給路由加切換動(dòng)畫(huà)時(shí)的踩坑及解決
這篇文章主要介紹了Vue3+Tsx給路由加切換動(dòng)畫(huà)時(shí)的踩坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01vue-pdf實(shí)現(xiàn)文件在線(xiàn)預(yù)覽
這篇文章主要為大家詳細(xì)介紹了vue-pdf實(shí)現(xiàn)文件在線(xiàn)預(yù)覽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08