移动端开发中模态框滚动穿透问题的原因分析与解决方案详解

2025-03-10
来源:网络整理

滚动渗透问题描述:

当在移动终端上开发模态框时(Mini程序也将出现),当模态框下的页面超过一个屏幕时,在定位的弹出式掩码层上滑动,下面的内容也将一起滑动,就好像事件渗透到下面的DOM元素一样。我们比较单击以渗透,并将其称为滚动穿透。

问题的原因:

通过事件的外观,可以推断出文档的滚动事件是触发的,因此我们可以禁用滚动事件。

案例伪代码:解决方案e。()

mini程序 - 脚本语法,通过e。()阻止元素的 - 移动事件。 (同样,H5,聆听 - 移动事件并防止其 - 移动事件)

<view class="modal-wrapper" @touch-move="test.disableScrollEvent"> <view class="mask">view> <view class="modal-content">view> view> // 外部导入sjs文件 <script lang="sjs" module="test" src="./test.sjs">script>

// test.sjs export default { disableScrollEvent: (event) => { event.preventDefault() } }

解决方案B( - )

默认情况下,PAN(滚动)和变焦手势是由浏览器专门处理的,但是可以通过CSS功能更改触摸手势的行为。选择几个值如下。

价值描述

汽车

使浏览器可以处理所有锅和变焦手势。

没有任何

禁用浏览器以处理所有PAN和变焦手势。

启用锅和缩放手势,但请禁用其他非标准手势,例如双击变焦。

-飞涨

启用多指平移和缩放页面。

因此,将此属性设置在元素上,并禁用元素上的所有手势(及其不可滚动的后代)可以解决问题。

.modal-wrapper{ touch-action: none; }

滚动溢出问题描述:

弹出窗口还包含滚动元素。当滚动元素滚动到底部或顶部时,向下或向上滚动也会触发页面滚动。这种现象称为滚动链(),但感觉就像滚动溢出的名称更有意义。

解决方案 - 迷你程序( - / - )

Mini程序提供的-View组件可以使用 - 和 - 属性,如下:

<scroll-view class="content" scroll-y disable-lower-scroll="out-of-bounds" disable-upper-scroll="out-of-bounds" onTouchMove="{{supportSjs ? sjs.enableScrollEvent : ''}}" > <view a:for="{{100}}" a:for-item="item"> {{item}} view> scroll-view>

其背后的原理是,当组件滚动到底部或顶部时,所有滚动都会通过调用阻塞,以使页面滚动不会触发,并且在滚动之间没有进行处理。

解决方案-H5(未经验证) - ( - )

- 是CSS的功能,允许浏览器滚动到边界。它具有以下值。

价值描述

汽车

默认效果是元素的滚动可以传播到祖先元素。

阻止滚动链,滚动不会传播到祖先元素,而是会显示节点本身的局部效果。例如,在滚动或iOS上。

没有任何

与,但会防止其自身的过度影响。

您可以尝试:

.content { overscroll-behavior: none; }

简单,干净和高性能,但整个系列不支持它。兼容性如下。您是否觉得这是IE的现代版本(偶然地从路人那里听到)!

![。png](#= - eaa3-4&crop = 0&crop = 0&crop = 1&crop = 1&crop = 1&crop = 1&trof =&=&= 683&id =&=&=&= []

分享