vue實(shí)現(xiàn)點(diǎn)擊導(dǎo)航欄滾動(dòng)頁面到指定位置的功能(推薦)
實(shí)現(xiàn)效果
具體實(shí)現(xiàn)步驟
step1:獲取不同板塊的滾輪高度
當(dāng)編寫好html部分后,我們創(chuàng)建一個(gè)可以獲取當(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)聽事件后,我們手動(dòng)滑動(dòng)網(wǎng)頁右側(cè)滾動(dòng)條到各版塊位置,并打印當(dāng)前板塊的滾輪高度
// 獲取到到的各版塊滾輪高度 // area1 scrollHeight == 208.3813934326172 // area2 scrollHeight == 960.2766723632812 // area3 scrollHeight == 1637.001708984375 // area4 scrollHeight == 2305.38330078125
step2:編寫執(zhí)行滾動(dòng)操作的函數(shù)
1、具體思路
① 獲取到當(dāng)前滾輪位置后,計(jì)算其位置與目標(biāo)區(qū)域位置的高度差 x
② 進(jìn)行 n 次循環(huán),不斷減去設(shè)定的最小移動(dòng)單位 dx ,來縮減它們之間的高度差,直至為 0
③ 但需要注意的是:因不同位置獲取到滾輪的高度不固定,所以 n -1 次減去最小移動(dòng)單位 dx 后,高度差不一定為零,即 0 < x < dx (此時(shí)的高度差:是高度差對最小移動(dòng)單位取余的余數(shù)),所以在執(zhí)行滾動(dòng)前,需要先將高度差減去余數(shù),才能保證通過n次循環(huán),剛好能到達(dá)指定位置( x = 0)
2、實(shí)現(xiàn)方法
通過定時(shí)器進(jìn)行 n 次循環(huán),高度差不斷減去最小移動(dòng)距離至 0,同時(shí)控制滾動(dòng)條不斷靠近目標(biāo)位置(即向目標(biāo)位置加/減單位距離)
這里先定義好需要使用的變量
data(){ return { scrollHeight:0, //當(dāng)前滾輪高度 metaHeight:15, //最小滾動(dòng)距離 metaTime: 10, //最小執(zhí)行時(shí)間 targetHeight:0, //目標(biāo)區(qū)域滾輪高度 } }
編寫滾動(dòng)方法
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: //默認(rèn):區(qū)域一 this.targetHeight= 208 break; } // 判斷執(zhí)行情況 // 當(dāng)指定區(qū)域和當(dāng)前滾動(dòng)條位置一致時(shí) 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)到達(dá)該區(qū)域了哦') } // 當(dāng)指定區(qū)域高度大于當(dāng)前滾動(dòng)條位置時(shí)(即目標(biāo)區(qū)在當(dāng)前滾輪的下方) else if(this.targetHeight> this.scrollHeight){ // 計(jì)算高度差 let x = this.targetHeight- this.scrollHeight; // 先加上余數(shù),保證高度差能整除設(shè)定的最小移動(dòng)單位 document.documentElement.scrollTop += x%this.metaHeight; x -= x%this.metaHeight; const goto = setInterval(() => { // 建立執(zhí)行操作的定時(shí)器 document.documentElement.scrollTop += this.metaHeight; // 控制移動(dòng)滾動(dòng)條 x-= this.metaHeight; // 縮減高度差 if (x == 0) { // 到達(dá)指定位置后清除定時(shí)器 clearInterval(goto); //清除定時(shí)器 } }, this.metaTime); } // 當(dāng)指定區(qū)域高度小于當(dāng)前滾動(dòng)條位置時(shí)(即目標(biāo)區(qū)在當(dāng)前滾輪的上方) else{ // 計(jì)算高度差 let x = this.scrollHeight - this.targetHeight; // 先減去余數(shù),保證高度差能整除設(shè)定的最小移動(dòng)單位 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); //清除定時(shí)器 } }, 1); } },
為導(dǎo)航欄添加點(diǎn)擊事件 @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到這里就實(shí)現(xiàn)了在頁面不同位置點(diǎn)擊左側(cè)導(dǎo)航欄,滾動(dòng)頁面到對應(yīng)板塊(指定位置),并可以自定義滾動(dòng)操作的速度和距離。各位朋友覺得有幫助到您的話,勞煩點(diǎn)個(gè)贊贊鼓勵(lì)一下吧,嘻嘻。
到此這篇關(guān)于vue 兩步實(shí)現(xiàn)點(diǎn)擊導(dǎo)航欄,滾動(dòng)頁面到指定位置的功能的文章就介紹到這了,更多相關(guān)vue點(diǎn)擊導(dǎo)航欄滾動(dòng)指定位置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3的ref、isRef、toRef、toRefs、toRaw詳細(xì)介紹
本文詳細(xì)講解了vue3的ref、isRef、toRef、toRefs、toRaw,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09vue跳轉(zhuǎn)時(shí)根據(jù)url錨點(diǎn)(#xxx)實(shí)現(xiàn)頁面內(nèi)容定位的方法
本前端仔在做頁面跳轉(zhuǎn)的時(shí)候,被要求跳轉(zhuǎn)到頁面時(shí)候,把對應(yīng)部分的內(nèi)容自動(dòng)滾動(dòng)到頂部,我一開始想到的就是根據(jù)錨點(diǎn)<a href="#xxid">進(jìn)行處理,但是發(fā)現(xiàn)不太好實(shí)現(xiàn),于是便自己研究了一個(gè)比較取巧的方法,需要的朋友可以參考下2024-04-04Vue重要修飾符.sync對比v-model的區(qū)別及使用詳解
這篇文章主要為大家介紹了Vue中重要修飾符.sync與v-model的區(qū)別對比及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07vue項(xiàng)目的創(chuàng)建的步驟(圖文教程)
本文主要介紹了vue項(xiàng)目的創(chuàng)建的步驟(圖文教程),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03