【兼容】移动端解决滚动穿透点击穿透

在移动端页面上,当有 fixed 遮罩背景和弹出层时,在屏幕上滑动能够滑动背景下面的内容,这就是臭名昭著的滚动穿透问题
解决方法一:
css之overflow:hidden

html, body {  
    overflow: auto;  
    height: 100%;  
} 

使用这种方法时,在与饿了么前端 mint-ui 组件库中的 Infinite scroll 存在冲突,导致在无限滚动请求下一页数据的时候请求不成功,但是如果你的页面上没有分页的,这样还是可以很好的解决滚动穿透问题

解决方法二:
touchmove + preventDefault
在弹出的提示框中阻止浏览器的默认行为以及冒泡行为,在可以滑动的dom元素中取消浏览器的默认行为以及冒泡行为

let stop = document.querySelector("#cancel");  
stop.addEventListener("touchmove", (event) => {  
    event.preventDefault();  //阻止默认行为                 
    event.stopPropagation(); //阻止冒泡  
}, false)  
let cancelStop = document.querySelector(".allReason");  
cancelStop.addEventListener("touchmove", (event) => {  
    event.returnValue = true;   //取消阻止默认行为                              
    event.cancelBubble = true;  //取消阻止冒泡                          
}, false)  

使用这种方法会有一个缺点,那就是滑动其它地方,底部页面不会滚动,但是在可以滑动的页面中,将其滑动到底部或者顶部后继续滑动,底部页面任然可以滚动

点击穿透

click事件在移动端会有200-300ms的延迟,是因为手机上双击屏幕,缩放功能的存在。在手机上打开页面,快速双击时,页面会被放大。所以当你在点击第一次的时候,系统会等200-300毫秒,看你会不会点第二次,如果有第二次,则会放大当前页面内容;如果没有点第二次,才会执行点击事件。

解决方案

只用touch-----最简单的解决方案,完美解决点击穿透事件。

把页面内所有click全部换成touch事件(touchstart、touchend、tap),需要特别注意a标签,a标签的href也是click,需要去掉换成js控制的跳转,不用a标签其实没什么,移动app开发不用考虑SEO,即便用了a标签,一般也会去掉所有默认样式,不如直接用span。

ps:之前有人教我解决滚动穿透这个问题,但是没有做记录。(很苦恼)

 

posted @ 2020-09-14 16:05  文学少女  阅读(272)  评论(0编辑  收藏  举报