自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

移動(dòng)端阻止彈窗下層頁(yè)面被滑動(dòng)方法介紹

開(kāi)發(fā) 前端
在做H5開(kāi)發(fā)時(shí),很多場(chǎng)景下都需要彈窗。當(dāng)出現(xiàn)彈窗時(shí),大部分場(chǎng)景下是期望彈窗下層頁(yè)面不能被滑動(dòng)的。

在做H5開(kāi)發(fā)時(shí),很多場(chǎng)景下都需要彈窗

當(dāng)出現(xiàn)彈窗時(shí),大部分場(chǎng)景下是期望彈窗下層頁(yè)面不能被滑動(dòng)的

當(dāng)然也不期望彈窗被滑動(dòng)

近期肝頁(yè)面又碰到了這個(gè)問(wèn)題

下面介紹幾種最常用的方式,以及一些邊界情況與應(yīng)對(duì)策略。

overflow:hidden

流傳最廣的方式就是 給元素設(shè)置 overflow:hidden

給body設(shè)置,就能達(dá)到阻止頁(yè)面滑動(dòng)的目的

document.body.style.overflow = 'hidden'
document.body.style.overflow = 'visible'

大部分情況下這個(gè)是能有效果的

但在部分機(jī)器上,這個(gè)是不生效的:

彈窗遮罩

還有一種情況如下,頁(yè)面部分元素有局部滑動(dòng)

<body style="overflow:hidden;">
<div style="overflow:scroll;height:100%;">
<!-- more element -->
</div>
</body>

當(dāng)前情況給body設(shè)置 overflow:hidden依舊是無(wú)效果的

此時(shí)給彈窗加上遮罩如下,正常情況下,下層元素就不會(huì)收到touchmove事件

<body style="overflow:hidden;">
<div style="overflow:scroll;height:100%;">
<!-- more element -->
</div>

<!-- dialog -->
<div class="dialog">
<!-- 遮罩 -->
<div class="mask" style="position:fixed;inset:0;"></div>
<div class="content"></div>
</div>
</body>

其中inset屬性是left,top,right,bottom的簡(jiǎn)寫(xiě)

但在部分機(jī)型下,下層元素仍然會(huì)收到touchmove事件,因此會(huì)跟著滑動(dòng)

于是需要祭出下面的方法

prevent touchmove

阻止觸摸滑動(dòng)事件touchmove的默認(rèn)行為

const touchHandle = function(e) {
e.preventDefault()
}

// 彈窗的事件
{
onShow(){
document.body.addEventListener('touchmove', preventDefault, {
passive: false,
});
},
onHide(){
document.body.removeEventListener('touchmove', preventDefault);
}
}

在彈窗打開(kāi)時(shí)直接阻止目標(biāo)元素的滑動(dòng)事件的默認(rèn)行為

彈窗內(nèi)容是不可滑動(dòng)的話,那么這種方法是最省事高效的

如果彈窗中有可滑動(dòng)的內(nèi)容,且滑動(dòng)的內(nèi)容比較復(fù)雜

那么通過(guò)touchmove去細(xì)力度的控制阻止滑動(dòng)事件時(shí)就很麻煩

position:fixed

還有一種常用的就是position:fixed

在彈窗打開(kāi)時(shí),將目標(biāo)元素進(jìn)行固定,在關(guān)閉時(shí)恢復(fù)

由于定位會(huì)改變?cè)卦陧?yè)面上的位置,所以需要在fixed前記錄元素的位置

取消fixed之后將元素又滾動(dòng)到原來(lái)的位置

// 彈窗的事件
{
onShow(){
document.body.style.top = `${
document.body.getClientRects()[0].top
}px`;
document.body.style.position = 'fixed';
document.body.style.left = '0';
document.body.style.right = '0';
},
onHide(){
document.body.style.position = 'visible';
window.scrollTo(
0,
Math.abs(+document.body.style.top.replace('px', ''))
);
}
}

使用class代替style

這個(gè)也是碰巧發(fā)現(xiàn)的,在iOS低端機(jī)將上述方式都嘗試后

仍發(fā)現(xiàn)一個(gè)問(wèn)題,現(xiàn)象如下(TODO:補(bǔ)圖)

下層頁(yè)面不會(huì)被滑動(dòng)了,但遮罩和彈窗整體還能被下拉

彈窗是一個(gè)下拉列表彈窗,其出現(xiàn)的位置需要?jiǎng)討B(tài)的計(jì)算,如下結(jié)構(gòu)

<body style="overflow:hidden;">
<!-- dialog -->
<div class="dialog" style="top:88px;">
<!-- 遮罩 -->
<div class="mask" style="position:fixed;inset:0;"></div>
<!-- 內(nèi)容 -->
<div class="content"></div>
</div>
</body>

最終發(fā)現(xiàn)是由于style與class設(shè)置的樣式在這個(gè)機(jī)型上展示雖然一致

但實(shí)際交互起來(lái)的表現(xiàn)卻不一致

修復(fù)后的html結(jié)構(gòu)如下,在元素里插入了一個(gè)style標(biāo)簽,使用class選擇器與!important重載這個(gè)距離的樣式

<body style="overflow:hidden;">
<!-- dialog -->
<div class="dialog" style="top:88px;">
<!-- 遮罩 -->
<div class="mask" style="position:fixed;inset:0;"></div>
<!-- 內(nèi)容 -->
<div class="content"></div>
<style>
.dialog{
top:88px !important;
}
</style>
</div>
</body>

代碼如下

{
onShow(){
setTimeout(() => {
const dialogEl = document.querySelector<HTMLElement>('.dialog')
if (!dialogEl) {
return
}
const style = document.createElement('style')
style.textContent = `
.dialog{
top:${dialogEl.style.top} !important;
}
`
dialogEl.append(style)
}, 200)
}
}

非常令人迷惑的一個(gè)操作,但就是解決了問(wèn)題

小結(jié)

針對(duì)移動(dòng)端彈窗下層頁(yè)面可被滑動(dòng)的異常場(chǎng)景

本文介紹了4種常見(jiàn)解決方法,與1種"謎之操作"

demo演示 demo截圖

責(zé)任編輯:武曉燕 來(lái)源: 粥里有勺糖
相關(guān)推薦

2010-01-28 14:57:36

Android滑動(dòng)手勢(shì)

2009-12-28 15:39:33

WPF滑動(dòng)條

2014-12-10 14:34:40

2021-09-14 08:38:57

組件開(kāi)源前端

2017-08-01 16:07:50

移動(dòng)端手機(jī)端搜索引擎

2015-07-06 09:55:40

W3C動(dòng)端頁(yè)面查錯(cuò)

2009-09-04 16:10:49

JSP頁(yè)面間傳遞參數(shù)

2017-09-08 16:45:14

移動(dòng)

2024-01-23 17:33:36

2017-07-24 16:27:58

前端移動(dòng)端布局

2011-06-15 17:09:43

PHP頁(yè)面靜態(tài)化

2011-07-13 08:58:51

ASP.NET

2013-01-06 10:38:33

網(wǎng)絡(luò)管理信息數(shù)據(jù)

2015-07-03 16:59:05

W3C檢查工具Mobile Chec

2016-09-18 10:51:01

JavascriptHtml5移動(dòng)應(yīng)用

2013-03-15 10:24:30

大數(shù)據(jù)商業(yè)價(jià)值

2009-05-09 08:42:29

SunOralce收購(gòu)

2021-07-14 09:45:24

設(shè)計(jì)師約束布局界面布局

2017-01-19 19:43:53

2022-06-09 15:53:16

移動(dòng)端渲染GPU
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)