禁止遮罩層以下屏幕滑動


相信大家在做移動端開發的時候會經常遇到這種場景,需要適時的彈出遮罩(有時為了突出還會在外面加上蒙層),彈窗出現以后,為了追求良好的用戶體驗,遮罩以下的屏幕是禁止滑動的。在網上找了很多資料,大體就這兩種做法,但都有不完善的地方。加上自己的思考和總結,想到一個辦法,應該可以解決你的問題。

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鼠標滾動,比較暴力!!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM