移動端下彈框禁止背景滑動
阿新 • • 發佈:2018-11-03
移動端下彈框禁止背景滑動
茴字寫法有很多種,找到最適合的才是好的。
以下下方法在一屛之內是可行的
body;html 設定overflow:hidden
.overflow-hidden{
height: 100%;
overflow: hidden;
}
// 彈出時
$('html, body,.page').addClass('overflow-hidden');
// 隱藏時
$('html, body,.page').removeClass('overflow-hidden');
問題
- 當body內容超出一屛時,彈框背景頁面會自動滾動到頂部,無法回到原來彈框所在的位置
儲存scrollTop,再設定scrollTo
var top = $(window).scrollTop(); // 彈出時 $("body .page").css({ "position": "fixed", "top": -top, "left": 0, "right": 0, "bottom": 0 }), // 隱藏式 $("body .page").css({ "position": "static" }); $("html").css({ "scroll-behavior": "unset" }); $(window).scrollTop(top), $("html").css({ "scroll-behavior": "smooth" });
問題
- 當body內容超出一屛時,彈框背景頁面會自動滾動到頂部,無法回到原來彈框所在的位置
- 頁面發生了 top 和頁面滾動;頁面會有閃爍的情況
繫結touchmove事件,然後呼叫preventDefault()
function preventDefaultFn(event){ event.preventDefault(); } // 彈出時 遮罩層 $('.modal-overlay').on('touchmove', preventDefaultFn); // 隱藏時 遮罩層 $('.modal-overlay').off('touchmove', preventDefaultFn);
問題
- 彈框中還有滾動的內容,滾動內容也無法滾動
解決
- 給彈框內需滾動的元素新增標記,在判斷是否執行event.preventDefault();
給main元素新增position:absolute(推薦)
.page {
/* main絕對定位,進行內部滾動 */
position: absolute;
top: 0;
bottom: 0;
right:0;
left:0;
/* 使之可以滾動 */
overflow-y: scroll;
/* 增加該屬性,可以增加彈性 */
-webkit-overflow-scrolling: touch;
}
.overflow-hidden{
overflow: hidden;
}
// 彈出時
$('.page').addClass('overflow-hidden');
// 隱藏時
$('.page').removeClass('overflow-hidden');
<div class="page">
<!-- 內容在這裡... -->
</div>
優點
- 沒有上述這些問題
- 隨帶解決了ios fixed 的相關bug
缺點
- 需要改頁面結構
- css程式碼微多