移动端滚动穿透问题
定義:移動端彈出fixed彈窗的話,在彈窗上滑動會導致下層的頁面跟著滾動,這個叫 “滾動穿透”
解決方案1
在彈出層的touchstart事件中調用preventDefault
這種方法不可取,至少有3個缺點:
解決方案2
此解決方案是解決方案1的升級版。
在彈出層的touchmove(注意區別)事件中調用preventDefault
這種解決辦法沒有了第一種解決辦法的 2, 3 缺點。適用于彈出層本身有沒有滾動(條)。
解決方案3
設置body{overflow:hidden;}
缺點:經測試,在PC上支持良好,但是在IOS端,跟沒有設置是一樣的,完全不起任何作用!。
這種解決方案適用于PC端。
解決方案4
設置 html,body{overflow:hidden;}
在PC和移動端都能禁止掉下層的滾動。
缺點:
可通過js來fix這個缺點,在彈出層出現時,記錄頁面的scrollTop,當彈出層消失時,把先前記錄的scrollTop再次賦予頁面。
終極完美解決方案
此解決方案能夠避免上述所有缺點。堪稱完美。
(這個方案會導致主頁面display:flex 的元素在彈框打開后消失)
css
javascript
(function(){var scrollTop = 0;// 顯示彈出層open.onclick = function(){ // 在彈出層顯示之前,記錄當前的滾動位置scrollTop = getScrollTop(); // 使body脫離文檔流document.body.classList.add('dialog-open'); // 把脫離文檔流的body拉上去!否則頁面會回到頂部!document.body.style.top = -scrollTop + 'px';mask.style.display = 'block';} // 隱藏彈出層close.onclick = function(){mask.style.display = 'none'; // body又回到了文檔流中(我胡漢三又回來啦!)document.body.classList.remove('dialog-open');// 滾回到老地方to(scrollTop);}function to(scrollTop){document.body.scrollTop = document.documentElement.scrollTop = scrollTop;}function getScrollTop(){return document.body.scrollTop || document.documentElement.scrollTop;} }());解決滾動穿透的2個工具方法:
function fixedBody(){var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;document.body.style.cssText += 'position:fixed;top:-'+scrollTop+'px;'; }function looseBody() {var body = document.body;body.style.position = '';var top = body.style.top;document.body.scrollTop = document.documentElement.scrollTop = -parseInt(top);body.style.top = ''; }轉自:https://github.com/pod4g/tool/wiki/移動端滾動穿透問題
總結
- 上一篇: 如何查看服务器gpu性能,ubuntu服
- 下一篇: docker 覆盖 entrypoint