這篇文章將為大家詳細講解有關如何解決Vue頁面固定滾動位置的問題,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創新互聯專注于企業網絡營銷推廣、網站重做改版、安達網站定制設計、自適應品牌網站建設、H5頁面制作、商城開發、集團公司官網建設、成都外貿網站建設、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為安達等各大城市提供網站開發制作服務。
問題描述:
通常見于 列表頁List -> 詳情頁Detail 的情況, 從列表的某一項x 進入到詳情頁, 再返回的時候, 希望列表的位置固定在x, 而不是回到頂部了.
vue-router 里面是有一個 scrollBehavior 的, 但是這個玩意只能在 history 模式下面使用, 而我用的 hash 模式.
所以我們要自己實現嘛, 思路簡單:List 里面監聽滾動, 記錄滾動位置 pos, 從 Detail 返回到 List 里面的時候, 讀取 pos.
mounted () { // 讀 setTimeut(function(){ document.body.scrollTop = parseInt(sessionStorage.getItem('pos')); }, 1000); // 存 window.onscroll = function () { sessionStorage.setItem('pos', document.body.scrollTop); } }
遇見了一個問題:
每次返回 List, 都是直接滾動到頂部, 每次都是, 每次都是! 把 pos 打印出來, 發現是 0, 而不是我們所存的值. 日了, 明明切換之前還是的, 回來就不是了.
然后發現了路由每次切換都會觸發 onscroll 事件, 日了狗, 為毛.我都沒有滾動頁面, 為什么會觸發 onscroll 事件。
剛開始懷疑 hash 變化會導致 onscroll 事件的觸發, 所以我就在瀏覽器里面手動輸入了幾個不存在的路由:
/foo /bar
沒有發現 scroll 被觸發, 所以這個嫌疑排出.
然后懷疑 vue-router 里面是不是綁定了 scroll 事件, 沒發現然后又想, 沒綁定 scroll 事件, 那么修改 scrollTop 值會不會也觸發 scroll 事件.
好吧還發現新知識點了:
scrollTop 值的改變, 的確會觸發 scroll 事件.
那么我就想, 是不是 vue-router 里面存在修改 scrollTop 值的行為, 也沒有發現.
然后我又想, 數據是動態渲染的, 所以是不是和元素的增刪改查相關。
元素增加-> 頁面高度變了 -> 頁面高度變化, 也觸發 scroll 事件?
所以我用 vue-cli 新建了項目, 放了兩個沒有增刪改查的路由
然后日了狗的, 我看見從 foo -> bar -> foo, 的時候, foo的滾動條位置還在之前我滾動到的地方.
突然想起來瀏覽器是可以自己記錄滾動條位置的.
是不是瀏覽器干的?
從詳情頁返回到列表頁面, 列表會重新渲染, 時序大概是這樣:
返回列表頁 1
渲染頁面 2
而瀏覽器恢復滾動條的位置的操作, 是在 1 和 2 之間, 這個時候就出問題了:如果你頁面上面的數據都是渲染出來的, 瀏覽器就會發現:
頁面的高度<=屏幕的高度, 不存在滾動條, 此時 document.body.scrollTop = 0;
所以會設置 document.body.scrollTop = 0
修改了 document.body.scrollTop 觸發了 scroll 事件, scroll 里面又重寫了 pos
等你數據渲染結束之后, 讀到的就是 0了.
如果發現你頁面高度大于屏幕高度, 但是頁面高度是 n, 而 pos 的值是: n + x, 比當前頁面的最大的 scrollTop 值還大, 這個時候, document.body.scrollTop 的值就會等于 n.
當你的數據渲染結束, 開始定位, 日了, 沒定準.
所以我們要解決這個問題.
當然是想到了 keep-alive, 剛啟用的時候, 發現的確不錯. 但是同時也發現:
列表項目靠前的, 往返操作的定位都很準, 越往后越不行, 直接拉到底, 再返回發現定位到的一般都是第二個第三個列表項目.
所以這個就很有意思了, 我大概猜測了一下瀏覽器的滾動位置恢復行為:
當 hashchange 的時候。拿到當前頁面的 document.body.scrollTop 值, 和自己存儲的滾動條位置。二者取最小的值, 設置成當前的 document.body.scrollTop 的值, 當使用 keep-alive 的時候, 因為 hashchange 事件處理和頁面渲染是并行的, 所以有時hashchange 拿到的 document 的高度是已經渲染過幾個元素的高度, 這個就是為什么定不準的原因.
好吧, 現在的情況是:
keep-alive 定不準, 不可靠, 所以需要我們自己來重新定位.
ok, 1 先綁定 scroll 事件:
var map = {}; window.onscroll = function() { map[location.hash] = document.body.scrollTop; }
2 再屏蔽掉瀏覽器自動恢復滾動位置行為帶來的影響
a 在 hashchange 時強制 document.body.scrollTop = 0
b 在 scroll 事件里面, 當 document.body.scrollTop = 0 的時候不做 存操作.
var map = {}; window.onhashchange = function() { document.body.scrollTop = 0; } window.onscroll = function() { if (document.body.scrollTop) { // 存 map[location.hash] = document.body.scrollTop; } else { // 讀 } }
3 在讀操作里面, 設置一個定時任務, 去判斷 document.body.scrollTop 的值和你保存的位置是不是相同的
var map = {}; window.onhashchange = function() { document.body.scrollTop = 0; } window.onscroll = function() { if (document.body.scrollTop) { // 存 map[location.hash] = document.body.scrollTop; } else { var timer = null; timer = setInterval(function(){ if (document.body.scrollTop == map[location.hash]) { clearInterval(timer); } else { document.body.scrollTop = map[location.hash]; } }, 20); } }
到這里實際上已經大體實現了, 返回恢復滾動條位置的功能, 而上面的代碼需要更多的優化,
關于“如何解決Vue頁面固定滾動位置的問題”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
本文標題:如何解決Vue頁面固定滾動位置的問題
網址分享:http://vcdvsql.cn/article26/gjidjg.html
成都網站建設公司_創新互聯,為您提供軟件開發、ChatGPT、商城網站、外貿建站、企業網站制作、網站維護
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯