如何解决滚动穿透问题

什么是滚动穿透

在弹框上滑动时,会发现弹框下面的内容跟着在滚动,这个就是滚动穿透问题。

在 PC 端,通过在 body 上添加  overflow:hidden;  可以解决这个问题,但是该方法在移动端是无效的,所以我们通常意义上的滚动穿透指的都是移动端。

解决方案

方案一:position: fixed;

body.modal-open {
    position: fixed;
    height: 100%;
}

通过为body添加 fixed 属性禁止body中其他元素滚动,但是会导致 body 中滚动位置丢失,所以还需要添加一些代码来记住以及还原滚动位置。

弹框前:

const scrollTop = document.body.scrollTop;

弹框后:

document.body.scrollTop = scrollTop;

方案二:touchmove+preventDefault

最好将所有弹框出现后禁止滚动的元素添加到一个 div 中(如果是为 body 元素添加 touchmove+preventDefault,会导致 modal 中内容过长时也不能滚动),然后为该元素添加 touchmove 事件监听,并阻止元素的默认行为。

$(‘.modal-open .main‘).on(‘touchmove‘, function(e) {
    e.preventDefault();
});    

原文地址:https://www.cnblogs.com/philipding/p/10238012.html

时间: 2024-10-10 16:16:43

如何解决滚动穿透问题的相关文章

h5页面弹窗滚动穿透的思考

可能我们经常做这样的弹窗对吧,兴许我们绝对很简单,两下搞定: 弹窗的页面结构代码: <!-- 弹窗模块 引用时移除static_tip类--> <div class="mask" ontouchstart = "return false" style="display:none"></div> <div class="main_venue_tip" style="displa

移动页面滚动穿透解决方案(荐)

移动页面滚动穿透解决方法目前有多种解决方案,我介绍下几种方案: 解决方案1:阻止冒泡. //关键代码 $(".sliders,.modals").on("touchmove",function(event){ event.preventDefault(); }); 全部代码附上: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <m

有关屏幕滚动穿透问题

解决办法: //还原body滚动设置 var bodyScrollTop = 0 $(document.body).css({ "position":"static", "top":"-" + bodyScrollTop + "px"}); //设置body固定内容不可滚动,避免滚动穿透问题 var sTop = 0 $(document.body).css({ "position":&

移动端之模态框滚动穿透问题

相信各位小伙伴利用H5做移动端应用时,在写弹出层时肯定用到过滚动穿透问题,虽然页面加了背景遮罩,滑动页面时,如若页面滚在滚动条,底部仍然可以滑动.遇到这种问题,第一想到的可能是能否监听弹出层的显示与隐藏,在监听函数中做处理:一般有以下两种处理方式: 1.禁止body的touchmove事件 1 function handler(e){e.preventDefault();} 2 3 export function closeTouch(){ 4 document.getElementsByTag

Vue项目移动端滚动穿透问题

概述 今天在做 Vue 移动端项目的时候遇到了滚动穿透问题,在网上查资料后,选取了我觉得最好的方法,记录下来供以后开发时参考,相信对其他人也有用. 上层无需滚动 如果上层无需滚动的话,直接屏蔽上层的 touchmove 事件即可.示例如下: <div @touchmove.prevent> 我是里面的内容 </div> 上层需要滚动 如果上层需要滚动的话,那么固定的时候先获取 body 的滑动距离,然后用 fixed 固定,用 top 模拟滚动距离:不固定的时候用获取 top 的值

滚动穿透

滚动穿透 内层滚动带动外层 body.modal-open { position: fixed; } var ModalHelper = (function (bodyCls) { var scrollTop; return { afterOpen: function () { console.log(10); scrollTop = document.scrollingElement.scrollTop; document.body.classList.add(bodyCls); docume

移动页面滚动穿透如何解决

在安卓系统的webview下写的页面,各种版本包括4.4,当弹出一个半透明全屏的弹框后,这时在PC上滚动条应该是不可用的,但是在webview下,在弹框上用手指滑动,弹框下面的页面是会跟着动的. 在segmentfault看到了讨论,记录一下,免得自己到时候找不到相应的答案.

滚动穿透问题

众所周知,移动端有fixed遮罩或弹出层时,屏幕上滑动,后面的背景也会跟着滚动,强迫症的我总是觉得不舒服.然而也没有找到完美的解决方法. 这里说说两种能用的方法. 1.遮罩或弹层没有滚动的内容时: vue里提供了一个很好用的解决办法:@touchmove.prevent 如果不用vue的话,那就监听touchmove事件,然后阻止事件的默认行为(e.preventDefault()) 2.当遮罩或弹层里有可以滚动的内容时,上面的方法就不行了. 这时候的解决思路就是,点击弹出遮罩时,获取下当前文档

移动端滚动穿透问题

手机上经常碰到的在当前页面打开一个半透明弹窗,想要滑动浏览弹窗上的内容,确触发了下层父级页面的内容滚动,解决办法如下: export const ModalHelper = (function (bodyCls) { return { scrollTop: document.scrollingElement ? document.scrollingElement.scrollTop : document.body.scrollTop,    afterOpen: function () { Mo