禁止遮罩层以下屏幕滑动

相信大家在做移动端开发的时候会经常遇到这种场景,需要适时的弹出遮罩(有时为了突出还会在外面加上蒙层),弹窗出现以后,为了追求良好的用户体验,遮罩以下的屏幕是禁止滑动的。在网上找了很多资料,大体就这两种做法,但都有不完善的地方。加上自己的思考和总结,想到一个办法,应该可以解决你的问题。

a)大众型

一般,大家想到的都是给body或者html添加overflow:hidden样式,当然height要设置成100%。这样在大多数机型上是可以的,但有个别的就是不起作用,我也不知道为什么(求知道的大神告知)。

b)高端型

因为这种需要弹窗遮罩的一般为移动端,pc很少会出现,就算是在pc里面上面那种方法也是可以解决的,所以可以考虑从移动端特有的滑动事件touchmove下手,当弹窗出现以后阻止该事件的默认行为不就行了吗,于是又有了下面的方法。

1 $(document).on("touchmove",function(e) {
2    e.preventDefault();
3 })

这种方法在移动端是可以解决滑动的问题,但有种情景就显得有点尴尬了,移动端屏幕本来就小,如果弹窗的内容过多也需要滑动(比如很长的活动规则),因为弹窗出现的时候已经禁止了滑动事件,那可如何是好????

c)改进型

在这种情形之下我想到了另外一种完美的办法,就是在禁止滑动之前先做一下判断,如果是在弹窗中触发的滑动事件就不阻止默认行为,其他地方同上。判断那部分我是通过类名判断的,通过其他的方法也是可以的(比如id),具体如下:

$(document).on("touchmove",function(e) {
   if(e.target.className.indexOf("shadeBox") >= 0) {
        e.preventDefault();
    }
})

上面的类名shadeBox是弹窗的蒙层的类名。也就是在蒙层上面滑动,事件是被禁止的,剩下的一部分就是弹窗了,所以弹窗的内容可以滑动。

以上有什么说的不对的,或者第三种方法还有不试用的情景的,还望指出,大家共同学习进步\(^o^)/~

更新说明:

  当我把这个东西分享给身边人用的时候,最后还是发现了问题,果然群众的眼睛还是雪亮的。问题如下:

当弹框内容过多,弹框也需要滑动的时候,因为弹框内部没有禁止touchmove,所以是可以滚动的,问题是当滚动到最底部继续往下滑的时候,奇怪的事情就发生了,此时页面还是会发生滑动,(在最上面的时候和这道理一样)。

我想的是可能弹框内部touchmove冒泡,然后到body上发生滑动。于是在弹框内部组织冒泡不就行了,于是做如下调整:

$(document).on("touchmove",function(e) {
   if(e.target.className.indexOf("shadeBox") >= 0) {
        e.preventDefault();
    } else {
        e.stopPropagation();
    }
})

修改以后,发现然并卵。。。

不知道为什么弹框内部并没有组织touchmove的冒泡,好奇怪。求知道的大神不吝告之。

现在的想法是,监听滑动事件,当滑动到底部或者最顶端时,禁止touchmove,并根据手指滑动的方向来释放开touchmove事件,即顶部的时候往下滑是放开事件,最底部的时候向上滑是放开事件。

虽然这边说的简单,但要实现这一功能确实太麻烦,如果只是在h5页面里面,完全没必要花这么多时间和精力在这个上面,如果是APP,追求极致那就另当别论了。

再说上面的情况是弹框内容过多的时候也需要滑动,如果弹框不需要滑动,跳出弹框以后直接全局禁用touchmove就好了,就没有上面的问题了。

不知道还有没有更好的做法?????

参考链接:http://www.cnblogs.com/gaohui/p/5819777.html

<!doctype html>
<html lang="en">

	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<title>Document</title>
		<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
		<style type="text/css">
			* {
				padding: 0px;
				margin: 0px;
			}

			body {
				height: 1000px;
			}

			#mask {
				top: 0px;
				left: 0px;
				position: fixed;
				width: 100%;
				height: 100%;
				background: rgba(0, 0, 0, 0.7);
				display: none;
			}

			#mask .div {
				width: 300px;
				height: 300px;
				background: white;
				position: absolute;
				margin: auto;
				top: 0px;
				left: 0px;
				right: 0px;
				bottom: 0px;
			}
		</style>
		<script type="text/javascript">
			$(function() {
				/* 第一种方法:屏蔽鼠标滚轮滚动和touchmove事件,比较暴力
				$("#cao").click(function() {
					$("#mask").show(0,function(){
						 $("body").css(‘overflow‘,‘hidden‘);
					});
				})
				$("#close").click(function() {
					$("#mask").hide(0,function(){
						$("body").css(‘overflow‘,‘scroll‘);
					});
				})
				*/
     			//第二种方法[推荐],屏蔽触屏滑动事件,但是没有屏蔽鼠标滚轮滚动
				$("#cao").click(function() {
					$("#mask").show()
				});
                $("#mask").on(‘touchmove‘,function(e){
                	e.preventDefault();  //阻止默认行为
                })
				$("#close").click(function() {
					$("#mask").hide()
				});

			})
		</script>
	</head>

	<body>
		<div id="mask">
			<div class="div">
				<h4 id="close">haha</h4>
			</div>
		</div>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<div id="cao" style="margin: 0 auto;width: 300px;height: 300px;background: red;">

		</div>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
		<p>111111111111111111111</p>
		<p>222222222222222222222</p>
		<p>333333333333333333333</p>
	</body>

</html>

  

  此时屏蔽滚动和PC鼠标滚动,比较暴力!!!!

时间: 2024-12-29 12:43:33

禁止遮罩层以下屏幕滑动的相关文章

移动端禁止遮罩层以下屏幕滑动

var ruleTxt = $(".wanfan .rule .rule-txt");var ruleTxtBottom = $(".wanfan .rule .rule-txt .rule-txt-bottom");var flag = '';$(".wanfan .rule .rule-btn").on('click',function(){ var h=window.screen.height; ruleTxt.css({'width':'

禁止遮罩层以下屏幕滑动----正解

相信大家在做移动端开发的时候会经常遇到这种场景,需要适时的弹出遮罩(有时为了突出还会在外面加上蒙层),弹窗出现以后,为了追求良好的用户体验,遮罩以下的屏幕是禁止滑动的.在网上找了很多资料,大体就这两种做法,但都有不完善的地方.加上自己的思考和总结,想到一个办法,应该可以解决你的问题. a)大众型 一般,大家想到的都是给body或者html添加overflow:hidden样式,当然height要设置成100%.这样在大多数机型上是可以的,但有个别的就是不起作用,我也不知道为什么(求知道的大神告知

弹出遮罩层后禁止滚动效果

弹出遮罩层后,手指在手机上上下滑动 遮罩层下的页面出现滑动.下面代码解决这个问题 (1)触摸后不产生事件 //遮罩层禁止滚动 $('.searbox_mask_byInteg').bind("touchmove", function (e) { e.preventDefault(); }); (2)body不出现滚动条 $("body,.main").height($(window).height()).css({ "overflow-y": &

弹出层带遮罩显示在屏幕正中间

最近项目中用到了遮罩层,在这里总结下以备下次使用. 首先,遮罩应全屏,同时需要兼容多种浏览器,需要设置div的样式为: 复制代码 1 position:absolute; 2 top:0%; /**遮罩全屏top,left都为0,width,height为100%**/ 3 left:0%; 4 width:100%; 5 height:100%; 6 filter:alpha(opacity=50); 7 opacity: 0.5; 8 -moz-opacity:0.5; 9 -khtml-o

跟随屏幕滚动层、遮罩层、获取Div相对定位、整个屏幕、html文档的jquery基本操作

一.层跟随屏幕滚动 <div style="width:120px;height:120px;border:1px solid red; position:absolute; left:800px; top:100px; z-index:1001;" id="AdminUserStateDiv">                </div>        <div class="div1">层1</div

转【js &amp; jquery】遮罩层实现禁止a、span、button等元素的鼠标事件

/*遮罩层代码 作用:通过遮罩层的方式防止表单提交次数过多 */ function MaskIt(obj){ var hoverdiv = '<div class="divMask" style="position: absolute; width: 100%; height: 100%; left: 0px; top: 0px; background: #fff; opacity: 0; filter: alpha(opacity=0);z-index:5;"

【js &amp; jquery】遮罩层实现禁止a、span、button等元素的鼠标事件

刚才在写一个界面,其中为了考虑背景图片的缘故,所以没用Button而是用的a标签 在点击之后应该禁用掉a元素,禁用对于button比较容易,加一个disabled就可以了 但是对于a却没有太好的办法,总不能把href="",更何况我是走的onclick函数 所以百度了一下,然后看到有用遮罩实现的,源代码有bug,然后按照它的思路自己重写了一下 --------- 下面粘一下代码吧,这个遮罩层实现法其实就是在当前元素外wrap一个层,层内增加一个z-index比较大的透明层,直接罩住原来

解决移动端遮罩层无法覆盖全部页面问题

今天在做移动端项目的时候遇到遮罩层效果,按照以往的PC端我直接给同级遮罩层100%  给完之后测试看似完美但... 这就尴尬了.... 之后查阅了相关资料得知这里有个方法可以解决这个问题那就是“禁止全局滚动” 里面用的touch事件可参考 HTML5移动端触摸事件 document.addEventListaner('touchmove',stopTouchMove,false); //当手在屏幕上移动的时候执行stopTouchMove函数(阻止默认事件) //这个可以用在当遮罩层弹出的话执行

点击按钮 弹出视频 并有遮罩层效果

涉及到css以及JavaScript. 最终显示效果:点击红色按钮,会有视屏弹出 并带有遮罩层 点击黄色区域可以关闭视频 并回到最初的状态. 页面主要代码:main中主要包含一个a,控制显示的按钮.设置有id值. <div class="main"> <a href="javascript:;" class="video" id="video"></a> </div> 以下代码就