場景概述
眾所周知,彈窗是一種常見的交互方式,而蒙層是彈窗必不可少的元素,用于隔斷頁面與彈窗區塊,暫時阻斷頁面的交互。但是,在蒙層元素中滑動的時候,滑到內容的盡頭時,再繼續滑動,蒙層底部的頁面會開始滾動,顯然這不是我們想要的效果,因此需要阻止這種行為。
那么,如何阻止呢?請看以下分析:
方案分析
方案一
打開蒙層時,給body添加樣式:
overflow: hidden;height: 100%;
在某些機型下,你可能還需要給根節點添加樣式:
overflow: hidden;
關閉蒙層時,移除以上樣式。
優點:
簡單方便,只需添加css樣式,沒有復雜的邏輯。
缺點:
兼容性不好,適用于pc,移動端就尷尬了。
部分安卓機型以及safari中,無法無法阻止底部頁面滾動。
如果需要應用于移動端,那么你可能需要方案二。
方案二
就是利用移動端的touch事件
Touch對象代表一個觸點,可以通過event.touches[0]獲取,每個觸點包含位置,大小,形狀,壓力大小,和目標 element屬性。
{screenX: 511, screenY: 400,//觸點相對于屏幕左邊沿的Y坐標clientX: 244.37899780273438, clientY: 189.3820037841797,//相對于可視區域pageX: 244.37, pageY: 189.37,//相對于HTML文檔頂部,當頁面有滾動的時候與clientX=Y 不等force: 1,//壓力大小,是從0.0(沒有壓力)到1.0(最大壓力)的浮點數identifier: 1036403715,//一次觸摸動作的唯一標識符radiusX: 37.565673828125, //能夠包圍用戶和觸摸平面的接觸面的最小橢圓的水平軸(X軸)半徑radiusY: 37.565673828125,rotationAngle: 0,//它是這樣一個角度值:由radiusX 和 radiusY 描述的正方向的橢圓,需要通過順時針旋轉這個角度值,才能最精確地覆蓋住用戶和觸摸平面的接觸面target: {} // 此次觸摸事件的目標element}利用移動端的touch事件來阻止默認行為(這里可以理解為頁面滾動就是默認行為)。
// node為蒙層容器dom節點node.addEventListener('touchstart', e => { e.preventDefault()}, false)簡單粗暴,滾動時底部頁面也無法動彈了。假如你的蒙層內容不會有滾動條,那么上述方法prefect。
但是,最怕空氣突然安靜,假如蒙層內容有滾動條的話,那么它再也無法動彈了。因此我們需要寫一些js邏輯來判斷要不要阻止默認行為,復雜程度明顯增加。
具體思路:判定蒙層內容是否滾動到盡頭,是則阻止默認行為,反之任它橫行。
Tip:這里我發現了一個小技巧,可以省略不少代碼。在一次滑動中,若蒙層內容可以滾動,則蒙層內容滾動,過程中即使蒙層內容已滾至盡頭,只要不松手(可以理解為touchend事件觸發前),繼續滑動時頁面內容不會滾動,此時若松手再繼續滾動,則頁面內容會滾動。利用這一個小技巧,我們可以精簡優化我們的代碼邏輯。
新聞熱點
疑難解答
圖片精選