常常作移動端網頁開發的朋友們,都應該會遇到,彈起遮罩層的交互需求,好比小點的toast提示框,modal對話框,也有滿屏的提示框,或者可操做交互的彈框;css
有些需求是要求在彈框上可操做,可滾動;在滾動時,就會遇到比較奇怪的兼容bug了,當你在滑動遮罩層時,下面的body頁面也會跟着滾動,頁面發生了「穿透」,即使你對彈出的元素設置最高級別的z-index,沒什麼用;ide
對這個坑也是研究了一端是時間,才搞定,下面給他家分享一個實測很是有用的解決方案:spa
大體思路,就是彈框出現時,給body設置禁止滾動(overflow:hidden);彈框消失時,再回復該屬性;直接貼代碼(主要就是CSS+JS),使用方式很簡單(代碼可直接複製使用),code
一、先命名一個css樣式屬性:blog
body.modal-open { position: fixed; width: 100%; }
二、js建立一個命名空間,用來動態給body綁定第一步設定的屬性;事件
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); document.scrollingElement.scrollTop = scrollTop; } }; })('modal-open');
三、直接調用開發
mask.show();//彈框出現時 ModalHelper.afterOpen(); mask.hide();//彈框隱藏時 ModalHelper.beforeClose();
注:可同時搭配touchumove事件使用,給彈框背景層nask設置touchmove時,阻止默認事件@touchmove.prevent;rem