解決移動端滾動穿透問題的一個接近完美的方法

解決移動端滾動穿透問題的一個接近完美的方法

我也是跟著教程不斷的摸索、測試,一遍又一遍的修改,終於在前幾天的一個晚上,找到了一個可行的辦法解決這個問題,下面是解決方案:

當菜單展開時,給body添加overflow:hidden的同時再添加position:fixed,使其絕對定位固定在頂部,此時底層就不會滑動了,但是導致的問題就是頁面會跳到頂部,解決跳轉到的頂部的方案是獲取當前頁面滾動條的位置,然後賦值給body的top(需要加上負號),這時當導航菜單展開時頁面不會跳到頂部,但是當菜單隱藏時又跳到頂部了,這就還要做一個處理。當菜單隱藏時通過JS獲取body的top值,然後轉為正數,賦值給變量使頁面滾動到之前的位置。

經過一番折騰終於算是把這個問題解決了,重點來了,雖然以上思路能解決這個問題,但是會導致一個小小的問題,作為有點強迫症的人是不能忍的,就是當菜單展開時雖然不會再跳到頂部,但是偶爾會出現大約2像素的偏移,微微的跳動一下,這看起來還是有點扎眼的,就在我糾結於這個問題的時候,我發現了另一個解決這個問題的方案……

只需要在body內單獨加一個div把所有元素包起來,然後給這個div設置如下樣式:

style="position:absolute;top:0;right:0;bottom:0;left:0;overflow:auto"

就可以讓底層在菜單展開並且有內容滾動時不跟著滾動了,而且也不會出現2像素的偏移,這算是一個完美的解決方案解決移動端的滾動穿透問題,相比那些用一大段JS來各種運算、賦值、判斷解決的方法,這個辦法真的是超級好用,於是我果斷的刪除了前面的代碼,用上了這個辦法,有網友反應這種方式在蘋果設備上會導致菜單的內容滾動呆滯,由於我還沒有蘋果設備,這個沒有測試,歡迎大家反饋。

另外在折騰這個解決方案的同時我發現了一個神奇的樣式:

-ms-overflow-style:none

這個樣式竟然能夠隱藏IE瀏覽器的滾動條!這個效果是我以前想實現一直沒實現的,想到以前試圖隱藏IE滾動條查到的方案都不靠譜時,我覺得這個樣式真是神奇般的存在,於是果斷把自己博客的滾動條隱藏了……

在折騰這些問題的時候,我越來越發現CSS與JS的強大,基本上出現的問題都有辦法得到解決,也越來越感嘆自己懂的技術還是太少了,學習的道路還很遠。


分享到:


相關文章: