问题描述

项目开发遇到一个ios独有的问题,在wkwebview中稳定复现

问题: 弹出一个蒙版,当在蒙版上面滑动的时候蒙版后面的内容滚动了

这当然是ios的bug,但是经过我们测试iphone7也会复现这个问题,所以没办法需要兼容。

vue 弹框产生的滚动穿透问题

百度了下好多思路

方法1: 直接禁用滚动容器的overflow,然后记录scrollTop并恢复,这种方法不适合我们当前场景。


1. 浮层的入口有多个页面
2. 浮层后面可滚动的容器有多个(3个)
3. 滚动容器有横向和纵向滚动,很难记录scrollTop和scrollLeft

方法2: 禁用touchmove事件,同样会导致弹层容器无法滚动,很不幸我们的弹层需要能够滚动。
方法3: 基于方法2,滚动容器使用better-scroll来滚动,这个基本可以解决问题,但是有better-scroll的主要问题,任何修改了layout都需要手动调用refresh不利于维护。

我们的方法

同样基于方法2,我们执行以下2步


1. 浮层容器对touchmove禁用
2. 滚动容器对touchmove阻止其冒泡,判断当前是否可以滚动(scrollHeight>offsetHeight),当可以滚动的时候不会触发滚动穿透,因此1. 可以滚动:不禁用touchmove2. 不能滚动:禁用touchmove

代码:


// touchmoveFix.js
// ios滚动穿透问题解决指令
const touchFix = {bind: function (el, binding, vnode) {el.addEventListener('touchmove', (e) => {// 滚动容器阻止冒泡,因此是否prevent由当前函数决定e.stopPropagation();let scrollEl = e.currentTarget;// 判定当前滚动容器是否可以滚动if(scrollEl.scrollHeight <= scrollEl.offsetHeight) {// 不能滚动的时候依然需要阻止滚动穿透e.preventDefault();}}, false);}
};// 使用指令
<!-- 弹层阻止touchmove -->
<section class="popup" @touchmove.prevent>...<div class="content" v-touch-fix>...</div>...
</section>// js引入
import touchFix from './touchmoveFix';export default {...directives: {touchFix},...
};

是否完美

可以看到思路并不复杂,无非是滚动子元素来决定是否禁用touchmove事件。
但是此方案并不完美,因为当弹出层有表单元素时,弹出键盘后表单本身一般需要可以滚动,此时滚动的是body元素,当touchmove禁用后body是无法滚动的,暂无解法只能暂时用方法1

总结:

此方案适用于弹层中有滚动容器,不适用于弹层本身为1个表单

经测试:iphone5s和android没有问题,更老的手机不在我们的兼容范围内了。

原文地址:https://segmentfault.com/a/1190000016900193

转载于:https://www.cnblogs.com/lalalagq/p/9916981.html

弹层蒙版(mask),ios滚动穿透,我们项目的解决方案相关推荐

  1. 移动端滚动穿透的6种解决方案

    移动端滚动穿透的6种解决方案 参考文章: (1)移动端滚动穿透的6种解决方案 (2)https://www.cnblogs.com/bigkuan/p/11977674.html 备忘一下.

  2. vue弹层时禁止页面滚动

    创建组件时禁止页面滚动: created(){//禁止页面滑动document.body.addEventListener('touchmove', this.bodyScroll, { passiv ...

  3. uniapp 自定义弹层时,底部页面滚动而弹层不能滚动

    今天做页面有个需求: 页面有个列表(A),内容过多时需要滚动, 然后做了个弹层,里面也有个列表(B),内容过多时需要滚动 由于A列表使用的web-view组件,而B列表使用view组件加overflo ...

  4. datagrid底部显示水平滚动_滚动穿透问题探索

    在移动端开发中,模态(Modal)弹窗可以说是非常之常见了,作为正在看这篇文章的你,可能写过基于Vue或者小程序的统一弹窗Modal组件:可能处理过定宽高或者不定宽高的情况等,看起来一个小小的模态框其 ...

  5. vue中禁止页面滚动/滚动事件穿透-弹出蒙版时弹出层下面还可以滚动问题解决

    弹出层时,蒙版下还可以滚动页面 移动端 在蒙层所在div上加 @touchmove.prevent <div class="maskBox" @touchmove.preve ...

  6. js - 移动端的超出滚动功能,附带滚动条,可解决弹层中滚动穿透问题。

    背景: 弹层里边有可滚动区域时,在移动端的坑我就不多说了. 找了很多解决滚动穿透的方案,最终都不能完美解决. 一气之下自己js撸了一个. 效果图: 原理: 1.解决滚动穿透:通过给弹层绑定touchm ...

  7. 【微信小程序】小程序显示弹窗时禁止下层的内容滚动|遮罩层滚动穿透

    小程序显示弹窗时禁止下层的内容滚动|遮罩层滚动穿透 第一种方式 页面上加catchtouchmove="consume" JS // 把这个事件给消耗掉,这是是必须写的, 不写是可 ...

  8. 解决弹出框滚动穿透的问题(问题是body也会滚动)

    解决弹出框滚动穿透的问题(问题是body也会滚动) 参考文章: (1)解决弹出框滚动穿透的问题(问题是body也会滚动) (2)https://www.cnblogs.com/ghfjj/p/8317 ...

  9. 键盘压缩背景,ios滚动不流畅,禁止遮罩层下面内容滚动

    1.<!--防止软键盘压缩页面背景图片--> <script> const bodyHeight = document.documentElement.clientHeight ...

最新文章

  1. magento 多语言 ,后台手工更改方法
  2. python搭建可视化管理平台_搭建可视化数据平台 superset
  3. Python--day46--MySQL视图
  4. C++ 学习之旅(2)——链接器Linker
  5. make menuconfig选择m编译为驱动模块
  6. 在单位用oracle备份到磁带的脚本(看不明白的地方交流)
  7. 中专学历就该被拒之门外?做Java开发改变命运难吗?
  8. 服务器配置能连多少个小程序,每个服务器能配置多少小程序
  9. AR VR或将彻底变革广告营销行业
  10. deville什么意思_欧米茄手表的deville是什么意思?
  11. Django 分页器 缓存 信号 序列化
  12. SQL拼接自己需要的字符串
  13. java影院票务管理系统项目开发计划
  14. indexOf 的使用
  15. UE5的项目建立及UE5(虚幻引擎5)个人视角移动按键操作及运行项目/day.2
  16. BOSS 业务运营支撑系统
  17. 移动硬盘出现乱码文件夹的解决方法
  18. 一文读懂 Web3:互联网发展的新时代
  19. ubuntu鼠标灵敏度、加速度修改
  20. 厂房规划物流仿真之sketchUP(SU)

热门文章

  1. SAP Cloud for Customer Sales Order Pricing Date的配置
  2. c语言ascii码表_新手小白整理C语言笔记备忘,带你十分钟理解C语言
  3. Java程序在命令行的编译运行
  4. 不同的二叉搜索树 IIPython解法
  5. 在python中查看关键字、需要执行_python关键字以及含义,用法
  6. 10G_Ethernet_04 10G Ethernet Subsystem IP 的快速验证(万兆以太网IP的快速验证)
  7. php导出excel失败原因,PHPExcel导出Excel文件报找不到该文件错误
  8. mysql client centos_centos7 安装mysql和mysqlclient遇到的那些坑
  9. .net excel循环插数据_科普:1根、2根、4根内存条插在主板内存插槽的位置
  10. python统计单词个数算法_统计一篇英文文章单词个数,取出出现频次前10的单词(Python实现)...