禁止遮罩层以下屏幕滑动----正解(更新版)
相信大家在做移动端开发的时候会经常遇到这种场景,需要适时的弹出遮罩(有时为了突出还会在外面加上蒙层),弹窗出现以后,为了追求良好的用户体验,遮罩以下的屏幕是禁止滑动的。在网上找了很多资料,大体就这两种做法,但都有不完善的地方。加上自己的思考和总结,想到一个办法,应该可以解决你的问题。
a)大众型
一般,大家想到的都是给body或者html添加overflow:hidden样式,当然height要设置成100%。这样在大多数机型上是可以的,但有个别的就是不起作用,我也不知道为什么(求知道的大神告知)。
b)高端型
因为有这种弹窗遮罩需求的,一般为移动端,pc很少会出现,就算是在pc的场景里有需要,上面那种方法也是可以解决的,所以可以考虑从移动端特有的滑动事件touchmove下手,当弹窗出现以后阻止该事件的默认行为(关闭弹窗后解除阻止)不就行了吗,于是又有了下面的方法。
1 $(document).on('touchmove',function(e) { 2 var e = e || window.event; 3 e.preventDefault(); 4 })
这种方法在移动端是可以解决滑动的问题,但有种情景就显得有点尴尬了,移动端屏幕本来就小,如果弹窗的内容过多也需要滑动(比如很长的活动规则),因为弹窗出现的时候已经禁止了滑动事件,那可如何是好????
c)改进型
在这种情形之下我想到了另外一种完美的办法,就是在禁止滑动之前先做一下判断,如果是在弹窗中触发的滑动事件就不阻止默认行为,其他地方同上。判断那部分我是通过类名判断的,通过其他的方法也是可以的(比如id),具体如下:
1 $(document).on("touchmove",function(e) { 2 var e = e || event, 3 target = e.target || e.srcElement; 4 if(e.target.className.indexOf("shadeBox") >= 0) { 5 e.preventDefault(); 6 } 7 })
上面的类名shadeBox是弹窗的蒙层的类名。也就是在蒙层上面滑动,事件是被禁止的,剩下的一部分就是弹窗了,所以弹窗的内容可以滑动。
以上有什么说的不对的,或者第三种方法还有不试用的情景的,还望指出,大家共同学习进步\(^o^)/~
更新说明:
当我把这个东西分享给身边人用的时候,最后还是发现了问题,果然群众的眼睛还是雪亮的。问题如下:
当弹框内容过多,弹框也需要滑动的时候,因为弹框内部没有禁止touchmove,所以是可以滚动的,问题是当滚动到最底部继续往下滑的时候,奇怪的事情就发生了,此时页面还是会发生滑动,(在最上面的时候和这道理一样)。
我想的是可能弹框内部touchmove冒泡,然后到body上发生滑动。于是在弹框内部阻止冒泡不就行了,于是做如下调整:
1 $(document).on("touchmove",function(e) { 2 var e = e || event, 3 target = e.target || e.srcElement; 4 if(e.target.className.indexOf("shadeBox") >= 0) { 5 e.preventDefault(); } 6 else { 7 e.stopPropagation(); 8 } 9 })
修改以后,发现然并卵。。。
不知道为什么弹框内部并没有阻止touchmove的冒泡,好奇怪。
现在的想法是,监听滑动事件,当滑动到底部或者最顶端时,禁止touchmove,并根据手指滑动的方向来释放开touchmove事件,即顶部的时候往下滑是放开事件,最底部的时候向上滑是放开事件。
虽然这边说的简单,但要实现这一功能确实太麻烦,如果只是在h5页面里面,完全没必要花这么多时间和精力在这个上面,如果是APP,追求极致那就另当别论了。
再说上面的情况是弹框内容过多的时候也需要滑动,如果弹框不需要滑动,跳出弹框以后直接全局禁用touchmove就好了,就没有上面的问题了。
不知道还有没有更好的做法?????
转载于:https://www.cnblogs.com/gaohui/p/5819777.html
禁止遮罩层以下屏幕滑动----正解(更新版)相关推荐
- 禁止遮罩层以下屏幕滑动
相信大家在做移动端开发的时候会经常遇到这种场景,需要适时的弹出遮罩(有时为了突出还会在外面加上蒙层),弹窗出现以后,为了追求良好的用户体验,遮罩以下的屏幕是禁止滑动的.在网上找了很多资料,大体就这两种 ...
- 键盘压缩背景,ios滚动不流畅,禁止遮罩层下面内容滚动
1.<!--防止软键盘压缩页面背景图片--> <script> const bodyHeight = document.documentElement.clientHeight ...
- uniapp禁止遮罩层下的页面滚动
<view @touchmove.stop.prevent="moveHandle"></view> methods: {moveHandle() {} }
- uniapp h5 页面在移动端 遮罩层禁止滚动 --安卓和ios端完美适配(只是测试了部分机型)
使用unipp 写h5 页面,在移动端,禁止 遮罩层 出现 滚动问题. 直接在标签上面写上这个就可以了 @touchmove.stop.prevent="moveHandle" , ...
- 手写遮罩层,禁止底层div滚动
只是一个小技巧:当先显示遮罩层时,加上禁止屏幕滚动 1.document.documentElement.style.overflowY = 'hidden'; //禁止屏幕滚动 2.当关闭遮罩层是时 ...
- 【微信小程序】小程序显示弹窗时禁止下层的内容滚动|遮罩层滚动穿透
小程序显示弹窗时禁止下层的内容滚动|遮罩层滚动穿透 第一种方式 页面上加catchtouchmove="consume" JS // 把这个事件给消耗掉,这是是必须写的, 不写是可 ...
- flash 遮罩层全解
2019独角兽企业重金招聘Python工程师标准>>> 初学者关于遮罩的话题问的较多,下面我将遮罩的一些常见问题进行一下归纳. 1.请问遮罩的原理是什么? [效果] 1.swf ( ...
- 移动端和PC端弹出遮罩层后,页面禁止滚动的解决方法及探究
移动端和PC端弹出遮罩层后,页面禁止滚动的解决方法及探究 参考文章: (1)移动端和PC端弹出遮罩层后,页面禁止滚动的解决方法及探究 (2)https://www.cnblogs.com/ranyon ...
- 一个遮罩层怎么遮罩两个图层_遮罩效果全解(13种方法)
初学者关于遮罩的话题问的较多,下面我将遮罩的一些常见问题进行一下归纳. 1.请问遮罩的原理是什么? 遮罩层好比黑夜中的一支手电筒,照在哪儿(指被遮罩层)哪儿就显现. 第一步:创建两个图层,命名,一个是 ...
最新文章
- 回顾2009,展望2010。
- 如何去判断一个面试者的深度学习水平?
- Flutter开发之数据存储-3-数据库存储(34)
- 瘫痪小姐姐“自主”行走视频火了,曾借助轮椅完成舞蹈表演,网友:灵魂是战士...
- python工程师百度百科-国家认证的Python工程师有什么能力要求?
- ZOJ 3776 A - Pokemon Master 签到水题
- java出现Resource leak: 'input' is never closed 解决方法
- 头像裁剪上传插件php,PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
- 广义线性模型_广义线性模型(第六章补充)
- php168为什么抛弃重新开发x1,在今天518这个特别的日子里,我们经过将近一年来,日以继夜努力研发出的X1正式对外公开发布!...
- python 删除set指定值_Python操作三大数据库 Redis
- java mongo数据去重复_java – MongoSpark保存重复的密钥错误E11000
- bbs小项目整理(五)(登录模块的完成)
- JS一秒区分clientX,offsetX,screenX,pageX之间关系
- wordpress中直接执行mysql查询语句的常用方法
- android创建数据库封装,SQLiteUtils
- vector怎么排序_零基础的人怎么学习Java
- 云端架构下的手机浏览器内核演进
- layui layer 自定义皮肤真香警告
- 大富豪5.3全网首发,真正的5.3正版破解授权,不是高防端