成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

移動端阻止彈窗下層頁面被滑動方法介紹

開發 前端
在做H5開發時,很多場景下都需要彈窗。當出現彈窗時,大部分場景下是期望彈窗下層頁面不能被滑動的。

在做H5開發時,很多場景下都需要彈窗。

當出現彈窗時,大部分場景下是期望彈窗下層頁面不能被滑動的。

當然也不期望彈窗被滑動

近期肝頁面又碰到了這個問題

下面介紹幾種最常用的方式,以及一些邊界情況與應對策略。

overflow:hidden

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

給body設置,就能達到阻止頁面滑動的目的

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

大部分情況下這個是能有效果的

但在部分機器上,這個是不生效的:

彈窗遮罩

還有一種情況如下,頁面部分元素有局部滑動

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

當前情況給body設置 overflow:hidden依舊是無效果的

此時給彈窗加上遮罩如下,正常情況下,下層元素就不會收到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的簡寫

但在部分機型下,下層元素仍然會收到touchmove事件,因此會跟著滑動

于是需要祭出下面的方法

prevent touchmove

阻止觸摸滑動事件touchmove的默認行為

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

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

在彈窗打開時直接阻止目標元素的滑動事件的默認行為

彈窗內容是不可滑動的話,那么這種方法是最省事高效的

如果彈窗中有可滑動的內容,且滑動的內容比較復雜

那么通過touchmove去細力度的控制阻止滑動事件時就很麻煩

position:fixed

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

在彈窗打開時,將目標元素進行固定,在關閉時恢復

由于定位會改變元素在頁面上的位置,所以需要在fixed前記錄元素的位置

取消fixed之后將元素又滾動到原來的位置

// 彈窗的事件
{
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

這個也是碰巧發現的,在iOS低端機將上述方式都嘗試后

仍發現一個問題,現象如下(TODO:補圖)

下層頁面不會被滑動了,但遮罩和彈窗整體還能被下拉

彈窗是一個下拉列表彈窗,其出現的位置需要動態的計算,如下結構

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

最終發現是由于style與class設置的樣式在這個機型上展示雖然一致

但實際交互起來的表現卻不一致

修復后的html結構如下,在元素里插入了一個style標簽,使用class選擇器與!important重載這個距離的樣式

<body style="overflow:hidden;">
<!-- dialog -->
<div class="dialog" style="top:88px;">
<!-- 遮罩 -->
<div class="mask" style="position:fixed;inset:0;"></div>
<!-- 內容 -->
<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)
}
}

非常令人迷惑的一個操作,但就是解決了問題

小結

針對移動端彈窗下層頁面可被滑動的異常場景

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

demo演示 demo截圖

責任編輯:武曉燕 來源: 粥里有勺糖
相關推薦

2014-12-10 14:34:40

2010-01-28 14:57:36

Android滑動手勢

2009-12-28 15:39:33

WPF滑動條

2021-09-14 08:38:57

組件開源前端

2017-08-01 16:07:50

移動端手機端搜索引擎

2015-07-06 09:55:40

W3C動端頁面查錯

2017-09-08 16:45:14

移動

2009-09-04 16:10:49

JSP頁面間傳遞參數

2024-01-23 17:33:36

2017-07-24 16:27:58

前端移動端布局

2013-01-06 10:38:33

網絡管理信息數據

2016-09-18 10:51:01

JavascriptHtml5移動應用

2011-06-15 17:09:43

PHP頁面靜態化

2011-07-13 08:58:51

ASP.NET

2015-07-03 16:59:05

W3C檢查工具Mobile Chec

2009-05-09 08:42:29

SunOralce收購

2013-03-15 10:24:30

大數據商業價值

2021-07-14 09:45:24

設計師約束布局界面布局

2012-06-14 16:04:56

移動端圖片分享

2016-03-21 10:05:18

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 我要看免费一级毛片 | 精品一二 | 黄色网址免费在线观看 | 欧美1区| 国产精品看片 | 国产精品中文字幕在线观看 | 日本午夜免费福利视频 | 久草www | 中文字幕国产 | 天天干com | www.色.com| 天天艹天天干天天 | 欧美亚洲一区二区三区 | 欧美舔穴 | 欧美xxxx色视频在线观看免费 | 欧美一区二区三区一在线观看 | 日韩成人免费在线视频 | 四虎影视一区二区 | 国产精品久久久久久妇女6080 | 精品中文在线 | 久久九九影视 | 精品一区二区三区电影 | 国产精品成人一区二区 | 日批免费看 | 亚洲免费婷婷 | 国产91亚洲精品 | 国产精品视频久久 | 成人精品一区二区 | 久久这里有精品 | 午夜欧美 | 91精品国产综合久久婷婷香蕉 | 性天堂网| 久久国产精品一区 | 国产精品美女久久久久久免费 | 伊人网一区 | 亚洲综合字幕 | hitomi一区二区三区精品 | av性色| 中文字幕乱码一区二区三区 | 亚洲超碰在线观看 | 精久久久|