本文介绍: 滚动穿透问题描述:在移动开发模态框时(小程序也会出现),当模态框下的页面超过一屏时,在fixed定位弹窗遮罩层上进行滑动,它下面的内容也会跟着一起滑动,看起来好像事件穿透到了下面的DOM元素一样,我们类比点击穿透,姑且称他为滚动穿透问题原因通过事件的表象,可以推测是文档滚动事件被触发了,那我们就禁用滚动事件就好办了。案例代码解决方案e.preventDefault()小程序——脚本语法通过e.preventDefault()阻止元素touchmove事件。(H5同理

滚动穿透

问题描述

移动开发模态框时(小程序也会出现),当模态框下的页面超过一屏时,在fixed定位弹窗遮罩层上进行滑动,它下面的内容也会跟着一起滑动,看起来好像事件穿透到了下面的DOM元素一样,我们类比点击穿透,姑且称他为滚动穿透。

问题原因

通过事件的表象,可以推测是文档滚动事件被触发了,那我们就禁用滚动事件就好办了。

案例代码

解决方案e.preventDefault()

小程序——脚本语法,通过e.preventDefault()阻止元素touchmove事件。(H5同理,监听touchmove事件,阻止其touchmove事件)

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


// test.sjs
export default {
    disableScrollEvent: (event) => {
        event.preventDefault()
    }
}
解决方案B✅ (touchaction

默认情况下,平移(滚动)和缩放手势浏览器专门处理,但是可以通过 CSS 特性 touchaction 来改变触摸手势行为。摘取几个 touchaction 的值如下

描述
auto 启用浏览器处理所有平移缩放手势
none 禁用浏览器处理所有平移缩放手势
manipulation 启用平移和缩放手势,但禁用其他非标准手势例如双击缩放
pinchzoom 启用页面的多指平移和缩放

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

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

滚动溢出

问题描述

弹窗内也含有滚动元素,在滚动元素滚到底部顶部时,再往下或往上滚动,也会触发页面的滚动,这种现象称之为滚动链scroll chaining), 但是感觉滚动溢出overscroll这个名字更言辞达意。

解决方案小程序✅ (disable-lower/upperscroll

支付宝小程序官方提供的 scrollview 组件使用 disable-lowerscroll 与 disable-upper-scroll 属性可以解决问题如下

<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>

背后的原理是,当组件滚动到底部或顶部时,通过调用 event.preventDefault 阻止了所有滚动,从而页面滚动也不会触发了,而在滚动之间则不做处理。

解决方案-H5(未验证)—(overscroll-behavior)

overscroll-behavior 是 CSS 的一个特性,允许控制浏览器滚动到边界的表现,它有如下几个值。

描述
auto 默认效果,元素的滚动可以传播到祖先元素。
contain 阻止滚动链,滚动不会传播到祖先元素,但是会显示节点自身的局部效果例如 Android 上过度滚动的发光效果或 iOS 上的橡皮筋效果。
none contain 相同,但是会阻止自身的过度效果。

可以尝试

.content {
  overscroll-behavior: none;
}

简洁干净高性能,不过 Safari 全系不支持兼容性如下,有没有感觉 Safari 就是现代版的 IE(偶然听路人说的)!
![image.png](https://imgblog.csdnimg.cn/img_convert/a876e2192defc6005036a09c3149d18b.png#clientId=u92d8421a-eaa3-4&amp;crop=0&amp;crop=0&amp;crop=1&amp;crop=1&amp;from=paste&amp;height=683&amp;id=u5cf2d16a&amp;margin=[object Object]&amp;name=image.png&amp;originHeight=1366&amp;originWidth=2850&amp;originalType=binary&amp;ratio=1&amp;rotation=0&amp;showTitle=false&amp;size=791091&amp;status=done&amp;style=none&amp;taskId=u57ab174f-35c3-4b03-9dad-8d724b4e01d&amp;title=&amp;width=1425)

原文地址:https://blog.csdn.net/qq_37730829/article/details/123983714

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_50330.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注