美文网首页
移动端滚动穿透问题解决方案

移动端滚动穿透问题解决方案

作者: working_Poor | 来源:发表于2019-01-11 10:39 被阅读0次

    1、 问题

    众所周知,移动端当有 fixed 遮罩背景和弹出层时,在屏幕上滑动能够滑动背景下面的内容,这就是臭名昭著的滚动穿透问题,下面是几种解决方案。

    2、解决方案

    • &1 方案一:
      当打开蒙层时,给htmlbody元素添加样式; 当关闭蒙层时,移除以上样式

      overflow: hidden;
      height: 100%;
      
    • 缺点:
      1、兼容性不好,部分安卓机型以及safari中,无法无法阻止底部页面滚动
      2、由于 html 和 body的滚动条都被禁用,弹出层后页面的滚动位置会丢失,需要用 js 来还原
      3、如果蒙层内容较高,也需要滚动,则无法实现对应需求

    • &2 方案二:
      利用移动端的touch事件,来阻止默认行为

      modal.addEventListener('touchmove', function(e) { 
            e.preventDefault();
      }, false);
      
    • 缺点:
      1、弹出层里不能有其它需要滚动的内容

    • &3 方案三:
      我们要阻止页面滚动,可以将其固定在视窗(即position: fixed),这样它就无法滚动了,当蒙层关闭时再释放。

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

      但是这样会出现一个同样的问题,就是当前滚动条的位置同样会丢失,所以我们必须用js得到当前滚动条的位置手动设置,当隐藏蒙层时还原.如下

      showModel() {
        let top = Tool.getScrollOffsets().y //获取滚动条高度
        document.body.classList.add('modal-open')
        document.body.style.top = -top + 'px'
        ...
      }
      hideModel() {
          document.body.classList.remove('modal-open')
          document.body.style.top = 0
          window.scroll(0,this.state.top) //回到原先的top
      }
      

      完美解决

    相关文章

      网友评论

          本文标题:移动端滚动穿透问题解决方案

          本文链接:https://www.haomeiwen.com/subject/xrvtdqtx.html