IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 滚动穿透与滚动溢出 -> 正文阅读

[JavaScript知识库]滚动穿透与滚动溢出

滚动穿透

问题描述:

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

问题原因:

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

案例伪代码:

解决方案? e.preventDefault()

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

<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? (touch-action)

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

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

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

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

滚动溢出

问题描述:

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

解决方案-小程序? (disable-lower/upper-scroll)

支付宝小程序官方提供的 scroll-view 组件,使用 disable-lower-scroll 与 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://img-blog.csdnimg.cn/img_convert/a876e2192defc6005036a09c3149d18b.png#clientId=u92d8421a-eaa3-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=683&id=u5cf2d16a&margin=[object Object]&name=image.png&originHeight=1366&originWidth=2850&originalType=binary&ratio=1&rotation=0&showTitle=false&size=791091&status=done&style=none&taskId=u57ab174f-35c3-4b03-9dad-8d724b4e01d&title=&width=1425)

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:34:53  更:2022-04-07 22:38:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:10:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码