关于移动端开发中遇到的坑-vue

匿名 (未验证) 提交于 2019-12-03 00:30:01

滚动穿透问题

滚动穿透是指在移动端当有 fixed 遮罩背景和弹出层时,在屏幕上滑动能够滑动背景下面的内容。网上整理了解决方案,但有些还是存在一定的问题:

https://gitlwz.github.io/2018/05/02/vue-move/

设置overflow为hidden

1 2 3 4 5 6 
.modal-open {     &, body {         overflow: hidden;         height: 100%     } } 

即当弹出层弹出时在html上添加.modal-open,禁用 html 和 body 的滚动条,但实际用上就会发现:

  1. 由于 html 和 body的滚动条都被禁用,弹出层后页面的滚动位置会丢失,需要用 js 来计算原来滚动的位置,在弹出时保持滚动位置;

js ֮ touchmove + preventDefault

1 2 3 
modal.addEventListener('touchmove', function(e) {   e.preventDefault(); }, false); 

最后解决方案:position: fixed

1 2 3 4 
body.modal-open {     position: fixed;     width: 100%; } 

这种方式同样当弹出层弹出时滚动条会丢失,所以还需要使用js来保存滚动条的位置,在关闭弹出层时将滚动位置还原;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 
var ModalHelper = (function(bodyCls) {   var scrollTop; // 在闭包中定义一个用来保存滚动位置的变量   return {     afterOpen: function() { //弹出之后记录保存滚动位置,并且给body添加.modal-open       scrollTop = document.scrollingElement.scrollTop;       document.body.classList.add(bodyCls);       document.body.style.top = -scrollTop + 'px';     },     beforeClose: function() { //关闭时将.modal-open移除并还原之前保存滚动位置       document.body.classList.remove(bodyCls);       document.scrollingElement.scrollTop = scrollTop;     }   }; })('modal-open'); 

本人亲测确实比较完美解决了移动端滚动问题

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!