vue實現(xiàn)點擊導(dǎo)航欄滾動頁面到指定位置的功能(推薦)
實現(xiàn)效果

具體實現(xiàn)步驟
step1:獲取不同板塊的滾輪高度
當(dāng)編寫好html部分后,我們創(chuàng)建一個可以獲取當(dāng)前滾輪位置的方法handleScroll(),并在mounted鉤子函數(shù)中添加該方法的監(jiān)聽事件
methods: {
handleScroll() {
var scrollTop = document.documentElement.scrollTop;
this.scrollHeight = scrollTop;
console.log('當(dāng)前滾輪高度:',this.scrollHeight); // 使用后記得注釋掉哦
},
},
mounted(){
window.addEventListener("scroll", this.handleScroll);
}創(chuàng)建好監(jiān)聽事件后,我們手動滑動網(wǎng)頁右側(cè)滾動條到各版塊位置,并打印當(dāng)前板塊的滾輪高度
// 獲取到到的各版塊滾輪高度 // area1 scrollHeight == 208.3813934326172 // area2 scrollHeight == 960.2766723632812 // area3 scrollHeight == 1637.001708984375 // area4 scrollHeight == 2305.38330078125
step2:編寫執(zhí)行滾動操作的函數(shù)
1、具體思路
① 獲取到當(dāng)前滾輪位置后,計算其位置與目標區(qū)域位置的高度差 x
② 進行 n 次循環(huán),不斷減去設(shè)定的最小移動單位 dx ,來縮減它們之間的高度差,直至為 0
③ 但需要注意的是:因不同位置獲取到滾輪的高度不固定,所以 n -1 次減去最小移動單位 dx 后,高度差不一定為零,即 0 < x < dx (此時的高度差:是高度差對最小移動單位取余的余數(shù)),所以在執(zhí)行滾動前,需要先將高度差減去余數(shù),才能保證通過n次循環(huán),剛好能到達指定位置( x = 0)
2、實現(xiàn)方法
通過定時器進行 n 次循環(huán),高度差不斷減去最小移動距離至 0,同時控制滾動條不斷靠近目標位置(即向目標位置加/減單位距離)


這里先定義好需要使用的變量
data(){
return {
scrollHeight:0, //當(dāng)前滾輪高度
metaHeight:15, //最小滾動距離
metaTime: 10, //最小執(zhí)行時間
targetHeight:0, //目標區(qū)域滾輪高度
}
}編寫滾動方法
toArea(index) { // 這里的index是左側(cè)導(dǎo)航欄傳的參數(shù),是不同區(qū)域設(shè)定好的索引值
switch (index) { // 匹配不同區(qū)域的滾輪高度
case 1: //區(qū)域一
this.targetHeight= 208 //這里將第一步獲取到的滾輪高度取整
break;
case 2: //區(qū)域二
this.targetHeight= 960
break;
case 3: //區(qū)域三
this.targetHeight= 1637
break;
case 4: //區(qū)域四
this.targetHeight= 2305
break;
default: //默認:區(qū)域一
this.targetHeight= 208
break;
}
// 判斷執(zhí)行情況
// 當(dāng)指定區(qū)域和當(dāng)前滾動條位置一致時
if( (document.documentElement.scrollTop===208&&this.targetHeight === 208)||
(document.documentElement.scrollTop===960&&this.targetHeight === 960)||
(document.documentElement.scrollTop===1637&&this.targetHeight === 1637))
{
console.log('已經(jīng)到達該區(qū)域了哦')
}
// 當(dāng)指定區(qū)域高度大于當(dāng)前滾動條位置時(即目標區(qū)在當(dāng)前滾輪的下方)
else if(this.targetHeight> this.scrollHeight){
// 計算高度差
let x = this.targetHeight- this.scrollHeight;
// 先加上余數(shù),保證高度差能整除設(shè)定的最小移動單位
document.documentElement.scrollTop += x%this.metaHeight;
x -= x%this.metaHeight;
const goto = setInterval(() => { // 建立執(zhí)行操作的定時器
document.documentElement.scrollTop += this.metaHeight; // 控制移動滾動條
x-= this.metaHeight; // 縮減高度差
if (x == 0) { // 到達指定位置后清除定時器
clearInterval(goto); //清除定時器
}
}, this.metaTime);
}
// 當(dāng)指定區(qū)域高度小于當(dāng)前滾動條位置時(即目標區(qū)在當(dāng)前滾輪的上方)
else{
// 計算高度差
let x = this.scrollHeight - this.targetHeight;
// 先減去余數(shù),保證高度差能整除設(shè)定的最小移動單位
document.documentElement.scrollTop -= x%this.metaHeight;
x -= x%this.metaHeight;
const goto = setInterval(() => {
document.documentElement.scrollTop -= this.metaHeight;
x-= this.metaHeight;
if (x == 0) {
clearInterval(goto); //清除定時器
}
}, 1);
}
},為導(dǎo)航欄添加點擊事件 @click
<div id="leftNavbar" v-show="scrollHeight > 200">
<div v-for="(item,index) in navBarList" :key="index" :id="item.id"
@click="toArea(item.index)">
{{ item.title }}
</div>
</div>data(){
return {
navBarList:
[{
id:"lnb1",
title:"教育",
index:1
},
{
id:"lnb2",
title:"歷史",
index:2
},
{
id:"lnb3",
title:"風(fēng)景",
index:3
},
{
id:"lnb4",
title:"文創(chuàng)",
index:4
}],
}OK到這里就實現(xiàn)了在頁面不同位置點擊左側(cè)導(dǎo)航欄,滾動頁面到對應(yīng)板塊(指定位置),并可以自定義滾動操作的速度和距離。各位朋友覺得有幫助到您的話,勞煩點個贊贊鼓勵一下吧,嘻嘻。
到此這篇關(guān)于vue 兩步實現(xiàn)點擊導(dǎo)航欄,滾動頁面到指定位置的功能的文章就介紹到這了,更多相關(guān)vue點擊導(dǎo)航欄滾動指定位置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue在取對象長度length時候出現(xiàn)undefined的解決
這篇文章主要介紹了vue在取對象長度length時候出現(xiàn)undefined的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
vue3父子同信的雙向數(shù)據(jù)的項目實現(xiàn)
我們知道的是,父傳子的通信,和子傳父的通信,那如何實現(xiàn)父子相互通信的呢,本文就來詳細的介紹一下,感興趣的可以了解一下2023-08-08
從Echarts報錯中學(xué)習(xí)Vue3?ref和shallowRef區(qū)別及其組件二次封裝demo
這篇文章主要介紹了從Echarts報錯中學(xué)習(xí)Vue3?ref和shallowRef區(qū)別及其組件二次封裝demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
在 Vue3 中如何使用 styled-components
styled-components 的官方 Vue 版本目前已多年沒有更新,而且只支持到 Vue2,那么,在 Vue3 中怎么才能使用到 styled-components 呢,下面給大家介紹在 Vue3 中使用 styled-components的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧2024-05-05

