博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移动端滚动穿透问题解决方案
阅读量:4087 次
发布时间:2019-05-25

本文共 2276 字,大约阅读时间需要 7 分钟。

一、 问题描述

移动端当position:fixed的弹窗弹出时,滑动弹窗,下层的页面会跟随滚动

二、 解决方案

1. body 设置overflow: hidden;

当弹窗弹出时,设置body元素的overflow属性为hidden,暴力去除滚动。

缺点:会丢失页面的滚动位置,需要使用js进行还原

// CSS.modal-open {  overflow: hidden;  height: 100%;}复制代码
// JSlet modalManager = (function() {  return {    scrollTop: 0,    getScrollTop() {      return document.body.scrollTop || document.documentElement.scrollTop    },    scrollTo(position) {      document.body.scrollTop = document.documentElement.scrollTop = position    },    show(ele) {      this.scrollTop = this.getScrollTop()      document.querySelector(ele).style.display = 'block'      document.body.classList.add('modal-open')      this.scrollTo(this.scrollTop)    },    hide(ele) {      document.querySelector(ele).style.display = 'none'      document.body.classList.remove('modal-open')      this.scrollTop = 0    }  }})();复制代码

2. body 设置position: fixed;

当弹窗弹出时,设置body元素的positon属性为fixed,使其脱离文档流,去除滚动。

缺点:会丢失页面的滚动位置,需要使用js进行还原

// CSS.modal-open {  position: fixed;  width: 100%;}复制代码
// JSlet modalManager = (function() {  return {    scrollTop: 0,    // 弹窗数量    modalNum: 0,    getScrollTop() {      return document.body.scrollTop || document.documentElement.scrollTop    },    // body脱离文档流,通过设置其top属性来恢复滚动位置    scrollTo(position) {      document.body.style.top = -position + 'px'    },    show(ele) {      // 与第一种方法不同的是,body脱离文档流时,读取不到scrollTop,所以同时弹出多个弹窗的时候,不用重新读取scrollTop      if (this.modalNum <= 0) {        this.scrollTop = this.getScrollTop()        document.body.classList.add('modal-open')        this.scrollTo(this.scrollTop)      }      document.querySelector(ele).style.display = 'block'      this.modalNum++    },    hide(ele) {      if (this.modalNum <= 1) {        document.body.classList.remove('modal-open')        document.body.scrollTop = document.documentElement.scrollTop = this.scrollTop        this.scrollTop = 0      }      document.querySelector(ele).style.display = 'none'      this.modalNum = this.modalNum >= 1 ? this.modalNum - 1 : 0    }  }})();复制代码

3. 阻止弹窗的touchmove默认事件

缺点:导致弹窗内部也无法滚动,适用于弹窗内无滚动内容的情况

document.querySelector('.modal').addEventListener('touchmove', e => {  e = e || window.event  e.preventDefault()}, false)

作者:Logan70
链接:https://juejin.im/post/5bcd43035188256a92191798
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的文章
postgresql查看表的和索引的情况,判断是否膨胀
查看>>
postgresql中根据oid和filenode去找表的物理文件的位置
查看>>
postgresql减少wal日志生成量的方法
查看>>
swift中单例的创建及销毁
查看>>
获取App Store中App的ipa包
查看>>
设置tabbaritem的title的颜色及按钮图片
查看>>
动态设置label的高度
查看>>
检测缓存文件是否超时
查看>>
十进制字符串转十六进制字符串
查看>>
属性字符串(富文本)的使用
查看>>
GPS定位
查看>>
地图、显示用户位置、大头针
查看>>
自定义大头针
查看>>
UIButton添加block点击事件
查看>>
利用runtime给类别添加属性
查看>>
本地推送
查看>>
FMDB的使用
查看>>
UIImage存为本地文件与UIImage转换为NSData
查看>>
[转]打印质数的各种算法
查看>>
[转]javascript with延伸的作用域是只读的吗?
查看>>