移動端滾動穿透問題完美解決方案
問題
眾所周知,移動端當有 fixed 遮罩背景和彈出層時,在螢幕上滑動能夠滑動背景下面的內容,這就是著名的滾動穿透問題
之前搜尋了一圈,找到下面兩種方案
<!-- more -->
css 之 overflow: hidden
.modal-open {
&, body {
overflow: hidden;
height: 100%;
}
}
頁面彈出層上將 .modal-open
新增到 html 上,禁用 html 和 body 的滾動條
但是這個方案有兩個缺點:
-
由於 html 和 body的滾動條都被禁用,彈出層後頁面的滾動位置會丟失,需要用 js 來還原
-
頁面的背景還是能夠有滾的動的效果
js 之 touchmove + preventDefault
modal.addEventListener('touchmove', function(e) {
e.preventDefault();
}, false);
這樣用 js 阻止滾動後看起來效果不錯了,但是也有一個缺點:
-
彈出層裡不能有其它需要滾動的內容(如大段文字需要固定高度,顯示滾動條也會被阻止)
上面兩個方案都有缺點,今天用英文關鍵字 google 了一下,才發現原來還有更好的方案
解決方案 position: fixed
body.modal-open {
position: fixed;
width: 100%;
}
如果只是上面的 css,滾動條的位置同樣會丟失
所以如果需要保持滾動條的位置需要用 js 儲存滾動條位置關閉的時候還原滾動位置
/**
* ModalHelper helpers resolve the modal scrolling issue on mobile devices
* https://github.com/twbs/bootstrap/issues/15852
* requires document.scrollingElement polyfill https://uedsky.com/demo/src/polyfills/document.scrollingElement.js
*/
var ModalHelper = (function(bodyCls) {
var scrollTop;
return {
afterOpen: function() {
scrollTop = document.scrollingElement.scrollTop;
document.body.classList.add(bodyCls);
document.body.style.top = -scrollTop + 'px';
},
beforeClose: function() {
document.body.classList.remove(bodyCls);
// scrollTop lost after set position:fixed, restore it back.
document.scrollingElement.scrollTop = scrollTop;
}
};
})('modal-open');
這樣上面3個缺點都解決了,至此滾動穿透就完美解決了
document.scrollingElement
因為瀏覽器獲取和設定 scrollTop 存在相容性,為了簡化上面的示例,我直接使用了 document.scrollingElement 這個新標準,對於不支援的瀏覽器我寫了個 polyfill document.scrollingElement.js
參考
相關文章
- 移動端滾動穿透問題解決方案穿透
- 移動端滾動穿透解決方案穿透
- 解決移動端滾動穿透穿透
- 如何解決移動端滾動穿透問題穿透
- 【前端詞典】滾動穿透問題的解決方案前端穿透
- 移動端彈出層滾動穿透問題總結穿透
- 移動端事件穿透的原理與解決方案事件穿透
- 移動端適配問題解決方案
- 解決小程式遮罩層滾動穿透問題遮罩穿透
- 移動端點透問題及其解決方案
- 滾動穿透問題探索穿透
- 適配移動端的問題以及解決方案
- 移動端頁面滾動--解決方法
- 移動端常見相容性問題解決方案
- 解決移動端複製問題
- 解決移動裝置上iframe滾動條的問題
- 解決vue移動端適配問題Vue
- 記一個ios滾動穿透問題iOS穿透
- h5移動端常見的問題及解決方案H5
- 移動端相容性問題解決方案
- 詳解移動端網頁設計實現內滾動的四種解決方案網頁
- 7 種方案解決移動端1px邊框的問題
- 移動端1px解決方案
- 移動端實現內滾動的4種方案
- 移動端相容性問題解決方案(一)
- 移動端H5音訊與視訊問題及解決方案H5音訊
- 移動端模擬滾動
- 移動端div跟隨滾動條滾動(自制
- 移動端彈窗滾動時window窗體也一起滾動的解決辦法
- 彈層蒙版(mask),ios滾動穿透,我們專案的解決方案iOS穿透
- 移動端高清屏 1px 解決方案
- 移動端canvas不支援rem的解決方案CanvasREM
- 移動端swiper嵌iframe無法滑動的解決方案
- RecyclerView 平滑滾動可控制滾動速度的終極解決方案View
- SVG圖片在移動端的應用解決方案SVG
- 微信團隊分享:微信移動端的全文檢索多音字問題解決方案
- 【移動端開發】移動端開發基礎問題
- -webkit-overflow-scrolling解決移動端iOS滾動卡頓現象WebKitiOS