项目在使用饿了么前端团队的 Mint UI 库的 Picker 和 Datetime picker 组件,iOS系统访问时会出现滑动穿透的现象。
主要表现在用手指在弹出层触摸滑动时,页面也跟着滚动,严重影响体验。
解决方法:
1、由于 Picker 组件的滚动是用 touch 事件 + translate 实现的,所以我们可以在 Picker 弹层出现的时候禁止页面的默认滚动机制,Picker 弹层消失时解除禁用页面的默认滚动机制。
data () { return { /*---------监听函数--------------*/ handler:function(e){e.preventDefault();} } }, // 通过监听蒙层的显隐字段来控制页面滚动的禁用事件 或者在method方法里控制 watch:{ maskShow:function(newvs,oldvs){//picker关闭没有回调函数,所以侦听该属性替代 if(newvs){ this.closeTouch(); }else{ this.openTouch(); } } }, methods:{ /*解决iphone页面层级相互影响滑动的问题*/ closeTouch:function(){ /* 弹层出现时调用 */ document.getElementsByTagName("body")[0].addEventListener('touchmove', this.handler,{passive:false});//阻止默认事件 console.log("closeTouch haved happened."); }, openTouch:function(){ /* 弹层关闭时调用 */ document.getElementsByTagName("body")[0].removeEventListener('touchmove', this.handler,{passive:false});//打开默认事件 console.log("openTouch haved happened."); }, openPicker(){ /* 弹层出现 */ this.closeTouch(); }, closePicker(){ /* 弹层关闭 */ this.openTouch(); } },
2、当弹层出现的时候设置给body设置 overflow: hidden
,弹层关闭时设置 overflow: scroll/auto
除了 Mint-UI 的 Picker,其他库的 Picker 组件可能也会有类似问题,比如 vux 、weui ... 。
问题产生的原因是一样的,同样可以用这个思路解决。
参考文档:
未经允许不得转载:前端资源网 - w3h5 » iOS中Mint Picker滑动时页面跟着滚动的解决方法