vue+導(dǎo)航錨點聯(lián)動-滾動監(jiān)聽和點擊平滑滾動跳轉(zhuǎn)實例
最終效果如下:(注意需要做錨點聯(lián)動的部分并不在頁面的頂部而是頁面的某個div內(nèi))-chrome

完成這個功能需要注意:
1、點擊導(dǎo)航平滑滾動到導(dǎo)航內(nèi)容處
2、div內(nèi)滾動時當(dāng)前導(dǎo)航需要做響應(yīng)
代碼如下:
1、html結(jié)構(gòu)(因為從項目里截取代碼數(shù)據(jù)內(nèi)容就不貼出來了,不算難點,這個可以根據(jù)自己的項目進(jìn)行調(diào)整,相應(yīng)的方法和類名別弄錯就行)
<div class="all-title">
全部應(yīng)用
<p class="fr">
<span v-for="(item, index) in allMenuList" :key="item.id" :class="[index===activeMenu?'active':'']" @click="jump(index)">{{ item.name }}</span>
</p>
</div>
<div id="scrollBox" class="applications-content">
<div v-for="(val, index) in allMenuList" :key="val.id" class="all-list do-jump">
<p class="applications-title">{{ val.name }}</p>
<ul class="applications-list">
<li v-for="item in val.children" :key="item.id" class="applications-item" @click="changeRouterForRight(item.pathName,item.menuCode)">
<img src="">
<span>{{ item.name }}</span>
<template v-if="showEdit">
<i v-if="addOrRemove(item.menuCode)==0" class="el-icon-circle-plus add-btn" @click="addMenu(item.menuCode)" />
<i v-if="addOrRemove(item.menuCode)==1" class="el-icon-remove remove-btn" @click="removeMenu(item.menuCode)" />
</template>
</li>
</ul>
</div>
</div>
需要說明的數(shù)據(jù):activeMenu-當(dāng)前導(dǎo)航序號,scrollBox-需要在里面滾動的元素即設(shè)為overflow-y:scroll的父元素div
2、點擊導(dǎo)航平滑滾動的方法:jump(index)
// 跳轉(zhuǎn)
jump(index) {
this.activeMenu = index // 當(dāng)前導(dǎo)航
const jump = jQuery('.do-jump').eq(index)
const scrollTop = jump.position().top + this.scrollBox.scrollTop // 獲取需要滾動的距離
// Chrome
this.scrollBox.scrollTo({
top: scrollTop,
behavior: 'smooth' // 平滑滾動
})
}
這里有兩點需要說明:一是因為我vue項目里裝了jquery所以這里直接用了jquery的position().top來獲取元素到父元素的距離,如果項目里沒裝jquery需要把這里換成js的方法來獲取元素到父元素的距離(萬事有Google和度娘),二是點擊之后需要滾動的距離計算時別忘了加上當(dāng)前div已經(jīng)滾動的距離即已經(jīng)被卷起的高度
-----到這里我們就可以實現(xiàn)1的功能
3、監(jiān)聽scrollBox的滾動:
寫在mounted里
// 獲取滾動dom元素
this.scrollBox = document.getElementById('scrollBox')
const jump = jQuery('.do-jump')
const topArr = []
for (let i = 0; i < jump.length; i++) {
topArr.push(jump.eq(i).position().top)
}
// 監(jiān)聽dom元素的scroll事件
this.scrollBox.addEventListener('scroll', () => {
const current_offset_top = that.scrollBox.scrollTop
for (let i = 0; i < topArr.length; i++) {
if (current_offset_top <= topArr[i]) { // 根據(jù)滾動距離判斷應(yīng)該滾動到第幾個導(dǎo)航的位置
that.activeMenu = i
break
}
}
}, true)
這里需要注意addEventListener里有三個參數(shù):'scroll' 、function、true
以上這篇vue+導(dǎo)航錨點聯(lián)動-滾動監(jiān)聽和點擊平滑滾動跳轉(zhuǎn)實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue + iView實現(xiàn)Excel上傳功能的完整代碼
前一段時間項目經(jīng)歷了前端上傳文件的過程,首先進(jìn)入頁面會展示默認(rèn)的樣子,選中要上傳的excel文件,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06
Vue CLI3移動端適配(px2rem或postcss-plugin-px2rem)
這篇文章主要介紹了Vue CLI3移動端適配(px2rem或postcss-plugin-px2rem),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
使用Vue3實現(xiàn)交互式雷達(dá)圖的代碼實現(xiàn)
雷達(dá)圖是一種可視化數(shù)據(jù)的方式,用于比較多個類別中不同指標(biāo)的相對值,它適用于需要展示多個指標(biāo)之間的關(guān)系和差異的場景,本文給大家介紹了如何用Vue3輕松創(chuàng)建交互式雷達(dá)圖,需要的朋友可以參考下2024-06-06
在vue中nextTick用法及nextTick 的原理是什么
這篇文章主要介紹了在vue中nextTick用法及nextTick 的原理是什么,Vue.js 是一個流行的前端框架,它提供了一種響應(yīng)式的數(shù)據(jù)綁定機(jī)制,使得頁面的數(shù)據(jù)與頁面的 UI 組件之間能夠自動同步,需要的朋友可以參考下2023-04-04

