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

