最近在作移动项目时遇到一个页面滚动穿透问题,具体场景是这样的,在一个可滚动的列表页中打开弹窗,底部的页面理论上是不可滚动的,可是当滑动弹窗时,底部页面会跟随滚动,这就是所谓的页面滚动穿透的问题。这个是比较常见的问题,基本都会遇到,Google一下出解决方案也是挺多的。如下根据不一样的适用场景总结一些解决方案:javascript
在列表容器的父元素上设置样式overflow:hidden来禁用滚动css
.alpha { height: 100%; overflow: hidden; } .alpha body { height: 100%; overflow: hidden; }
当弹出蒙层的时候,能够添加底部页面HTML标签的class,取消蒙层时则删除classhtml
$('html').addClass('alpha'); $('html').removeClass('alpha');
当弹出蒙层时,禁用了html和body的滚动条,滚动列表的滚动位置会丢失,会重置到没有滚动的状态,须要js进行还原。java
手机扫码查看效果:
查看DEMOgit
经过阻止弹窗的touchmove默认事件禁用滚动实现
代码实现:github
var modal = document.getElementById('modal'); // 弹窗dom对象 modal.addEventListener('touchmove', function(e) { e.preventDefault(); }, false);
弹窗中里不能有其它须要滚动的内容,如大段文字须要固定高度,显示滚动条也会被阻止。web
手机扫码查看效果:
查看DEMO
bootstrap
设置列表容器元素为positon:fixed
代码实现:segmentfault
.alpha.body{ position:fixed; width:100%; }
这种方法一样有以上两种方法的缺点,滚动列表的滚动位置会丢失,会重置到没有滚动的状态,经过js获取滚动条位置,调整位置便可。dom
打开弹窗时则在body元素上添加class
手机扫码查看效果:
查看DEMO