pc端如何实现

1.当弹窗显示时,为body元素添加属性:overflow:hidden, 当关闭弹窗时移除该属性即可
2.在弹窗的div上设置 @scroll.stop.prevent

3.前端页面弹框遮罩禁止页面滚动

<div @scroll.stop.prevent>
你要显示的内容
</div>

3.出现弹窗时,为body元素添加position:fixed,这样主页面就禁止滑动,同时很好地解决了弹窗穿透的问题。
若弹窗为独立组件,可以采用如下代码:

beforeMount() {
// 获取原来的scrollTop 并将body的top修改为对应的值
this.prevBodyStyle_scrollTop = document.body.scrollTop || document.documentElement.scrollTop
this.prevBodyStyle_top = window.getComputedStyle(document.body, null).getPropertyValue('top')
document.body.style.top = `-${this.prevBodyStyle_scrollTop}px`
// 获取原来body的position 为了解决iOS上光标漂移的问题 将position修改为fixed
this.prevBodyStyle_position = window.getComputedStyle(document.body, null).getPropertyValue('position')
document.body.style.position = 'fixed'
// 为了避免width空值的情况
this.prevBodyStyle_width = window.getComputedStyle(document.body, null).getPropertyValue('width')
document.body.style.width = '100%'
}, beforeDestroy() {
document.body.style.top = this.prevBodyStyle_top || '0px'
document.body.style.position = this.prevBodyStyle_position
document.body.style.width = this.prevBodyStyle_width || '100%'
document.body.scrollTop = document.documentElement.scrollTop = this.prevBodyStyle_scrollTop || 0
},

备注: 如果弹窗为一个独立的组件, 那么需要使用v-if来控制弹窗是否显示,不可使用v-show(因为使用v-show,会在主页面刚生成的同时生成该组件,导致position=fixed生效,在弹窗关闭的情况下页面也禁止滑动)

移动端如何实现

1.在弹窗的最外层div上添加@touchmove.stop.prevent (适合弹窗内容不需要滚动的情况下)

<div @touchmove.stop.prevent>
你要显示的内容
</div>

存在问题: 虽然可以阻止滑动,但是双击的时候主页面还是会跳动

2.同PC端第三种方法
3.通过addEventListener解决

mounted() {
document.body.addEventListener('touchmove', this.p, {passive: false})
},
beforeDestroy () {
document.body.removeEventListener('touchmove', this.p)
},
methods: {
p (e) {
e.preventDefault()
e.stopPropagation()
}
}

划重点:addEventListener的第三个参数 {passive: false}

先说说错误的代码,网上千篇一律的都是怎么成功的,纳闷了,反正我没有成功,在手机端和chrome浏览器等依然可以正常滚屏:

document.body.addEventListener("touchstart",function(e){
e.stopPropagation();
e.preventDefault();
},false);

错误代码为什么不行呢,而为什么使用{passive: false}就生效了呢?
摘自MDN的解释:

passive: Boolean,表示 listener 永远不会调用preventDefault()。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。

MDN对于上述错误现象解释地很清楚:

根据规范,passive 选项的默认值始终为false。但是,这引入了处理某些触摸事件(以及其他)的事件监听器在尝试处理滚动时阻止浏览器的主线程的可能性,从而导致滚动处理期间性能可能大大降低。
为防止出现此问题,某些浏览器(特别是Chrome和Firefox)已将touchstart和touchmove事件的passive选项的默认值更改为true文档级节点 Window,Document和Document.body。这可以防止调用事件监听器,因此在用户滚动时无法阻止页面呈现。

var elem = document.getElementById('elem');
elem.addEventListener('touchmove', function listener() { /* do something */ }, { passive: true });

添加passive:true参数后,touchmove事件不会阻塞页面的滚动(同样适用于鼠标的滚轮事件)。

所以,我们可以通过将passive的值显式设置为false来覆盖此行为。

另外:您无需担心基本scroll 事件的passive值。由于无法取消,因此事件监听器无法阻止页面呈现。(也是在PC端监听scroll无效的原因)

参考链接

前两种方法:https://blog.csdn.net/Chelle1...
第三种:https://blog.csdn.net/yuhk231...
vue prevent方法: https://www.cnblogs.com/Eden-...
mdn关于addEventListener: https://developer.mozilla.org...

原文地址:https://segmentfault.com/a/1190000017217663

跳出弹窗页面禁止滚动(PC端和手机端)的更多相关文章

  1. 【工具】PC端调试手机端 Html 页面的工具

    一.概述 有一个项目需要在手机端显示一个 web 页面,而每次把应用 launch 后,从手机端看比较麻烦,因此搜罗了几种在 PC 端调试手机端页面的工具. 二.工具 http://fonkie.it ...

  2. 山西大同大学教务处教师端——可在PC端,手机端操作

    解决问题:大同大学教务处官网教师端口一进去就卡住了,点上面一行的菜单无响应 下载方法(学生端 / 教师端  / 验证脚本): 链接:https://pan.baidu.com/s/1MWrJXoPzE ...

  3. 山西大同大学教务处学生端--送给学弟,学妹的礼物,可在PC端,手机端操作

    解决问题:大同大学教务处官网学生端口一进去就卡住了,点上面一行的菜单无响应 转眼已是四年,想想自己大学即将结束,不由得让人感慨啊.这才刚开学几天,我就听到有同学在因为补考,选课的事情发愁.学校官方的教 ...

  4. 判断浏览器是pc端还是手机端

    1. 判断浏览器是pc端还是手机端 <script type="text/javascript"> var browser = { versions: function ...

  5. js 判断pc端或手机端

    <script> (function () { var navUA = navigator.userAgent; var defIncludeStr = "iPhone|Andr ...

  6. 关于PC端与手机端随着手指移动图片位置放生变化的拖拽事件

    当按下鼠标时,图片随鼠标移动松开时图片回到原位 drag("div_id") function drag(node_id){ var node = document.getElem ...

  7. 判断是pc端还是手机端,并跳转到相应页面

    <!-- 判断浏览器是否为手机端 -->  <script>     // class     ! function(navigator) {         var user ...

  8. 自动判断PC端、手机端跳往不同的域名JS实现代码

    输入相同域名,在pc端和移动端会出现不同的页面效果,一种是用栅格系统实现自适应, 更多的是设计两套不同的模板和两个二级域名或者一个主域名和一个二级域名(就是有区别就可以了); js代码判断浏览器的用户 ...

  9. Charles PC端和手机端抓取HTTP和HTTPS协议请求、HTTPS通用抓包规则

    一:HTTP和HTTPS的区别 HTTP是超文本传输协议,被用在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,因此HTTP协议不适合传输一些敏感信息, ...

随机推荐

  1. 【微信小游戏】文件系统,远程加载资源打破4M限制

    一.前提 微信小游戏,对游戏包体的大小有严格是限制,上传文件大小<4M,但是本地缓存文件有50M空间,也就是说我们可以将一些资源放到网上,然后缓存到本地. 二.官方概念 文件系统 文件系统是小程 ...

  2. oralce函数

    1.trunc函数处理数字和日期TRUNC(NUMBER[,DECIMAL]) 数字格式TRUNC(DATE[,FOMAT]) 日期格式2.round函数(四舍五入)ROUND(NUMBER[,DEC ...

  3. Laravel5.1 分页展示

    Laravel为我们提供了一套分页的逻辑,我们无需自己实现分页逻辑,只需要执行几个简单的方法就能实现漂亮的分页. 1 simplePaginate 这是一种只显示上一页下一页的样式分页,我们来看看怎么 ...

  4. Arcgis for Js之GeometryService实现測量距离和面积

    距离和面积的測量时GIS常见的功能.在本节,讲述的是通过GeometryService实现測量面积和距离.先看看实现后的效果: watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

  5. SQL Server快捷方式丢了怎么启动

    为了帮助网友解决“SQL Server快捷方式丢了怎么启动”相关的问题,中国学网通过互联网对“SQL Server快捷方式丢了怎么启动”相关的解决方案进行了整理,用户详细问题包括:Microsoft ...

  6. c++ new(不断跟新)

    1.基础知识 /* 可以定义大小是0的数组,但不能引用,因为没有指向任何对象 new string[10]调用类的默认构造函数 new int[10]没有初始化,但new int[10]()会将数组初 ...

  7. AngularJS 讲解,三 过滤器

    过滤器用来格式化需要展示给用户的数据.AngularJS有很多实用的内置过滤器,同时也提供了方便的途径可以自己创建过滤器. 在HTML中的模板绑定符号{{ }}内通过|符号来调用过滤器.例如:{{va ...

  8. 修改yum源为阿里云的

    将Centos的yum源更换为国内的阿里云源 author:headsen chen date:2018-04-28  13:33:41 1.备份  mv /etc/yum.repos.d/CentO ...

  9. eslint Rules

    Rules 为了让你对规则有个更好的理解,ESLint 对其进行了分门别类. 所有的规则默认都是禁用的.在配置文件中,使用 "extends": "eslint:reco ...

  10. 170223、Tomcat部署时war和war exploded区别以及平时踩得坑

    war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: 是选择war还是war exploded 这里首先看一下他们两个的区别: war模式 ...