最近在制作一个弹出层效果时碰到一个问题,当遮罩弹出层显示时使用鼠标滚轮可以滚动body的滚动条。如果在弹出层里面有滚动条,将弹出层里的滚动条滑动到底部后继续滑动会导致body的滚动条滚动,在移动端手指滑动也会造成这样的问题。
未解决问题的代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0 ,maximum-scale=1.0, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>弹出层测试</title>
<!-- 重置默认样式 -->
<link rel="stylesheet" href="css/reset.css">
<!-- 弹出层样式 -->
<link rel="stylesheet" href="css/toolCase2.css">
</head>
<body>
<!-- 增高布局 start -->
<div style="font-size:20px;">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
<div>10</div>
<div>11</div>
<div>12</div>
<div>13</div>
<div>14</div>
<div>15</div>
<div>16</div>
<div>17</div>
<div>18</div>
<div>19</div>
<div>20</div>
<div>21</div>
<div>22</div>
<div>23</div>
<div>24</div>
<div>25</div>
<div>26</div>
<div>27</div>
<div>28</div>
<div>29</div>
<div>30</div>
<div>31</div>
<div>32</div>
<div>33</div>
<div>34</div>
<div>35</div>
<div>36</div>
<div>37</div>
<div>38</div>
<div>39</div>
<div>40</div>
<div>41</div>
<div>42</div>
<div>43</div>
<div>44</div>
<div>45</div>
<div>46</div>
<div>47</div>
<div>48</div>
<div>49</div>
<div>50</div>
</div>
<!-- 增高布局 end -->
<!-- 弹出层布局 start -->
<div class="toolCase-container" id="toolCase-container">
<div class="toolCase-ulParent" style="height:100px;overflow: auto;">
<!-- 增高布局 start -->
<div style="font-size:20px;">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
<div>10</div>
<div>11</div>
<div>12</div>
<div>13</div>
<div>14</div>
<div>15</div>
<div>16</div>
<div>17</div>
<div>18</div>
<div>19</div>
<div>20</div>
<div>21</div>
<div>22</div>
<div>23</div>
<div>24</div>
<div>25</div>
<div>26</div>
<div>27</div>
<div>28</div>
<div>29</div>
<div>30</div>
<div>31</div>
<div>32</div>
<div>33</div>
<div>34</div>
<div>35</div>
<div>36</div>
<div>37</div>
<div>38</div>
<div>39</div>
<div>40</div>
<div>41</div>
<div>42</div>
<div>43</div>
<div>44</div>
<div>45</div>
<div>46</div>
<div>47</div>
<div>48</div>
<div>49</div>
<div>50</div>
</div>
<!-- 增高布局 end -->
</div>
<div class="toolCase-close" id="toolCaseClose">取消</div>
</div>
<!-- 控制显示按钮 -->
<div class="toolCase opacity" id="toolCase" data-state="true"></div>
<!-- 遮罩 -->
<div class="toolCaseMask" id="toolCaseMask"></div>
<!-- 弹出层布局 end -->
<!-- 移动端自适应 -->
<script src="js/flexible.js"></script>
<!-- jquery库 -->
<script src="js/jquery-1.8.0.min.js"></script>
<script>
/*悬浮工具箱 js start*/
$("#toolCaseMask,#toolCaseClose,#toolCase").click(function () {
if ($("#toolCase-container").is(":animated")) return;
var state = $("#toolCase").data("state");
$("#toolCaseMask")[(state ? 'show' : 'hide')]();
$("#toolCase-container").slideToggle(300);
$("#toolCase").data('state', !state);
});
/*悬浮工具箱 js end*/
</script>
</body>
</html>
解决办法:
设置html和body初始样式为height:100%及overflow:auto
显示弹层后设置html和body为overflow:hidden
隐藏弹层后设置html和body为overflow:auto
注:如果不设置html和body初始为overflow:auto的话,会出现第一次显示弹层后body的滚动条到最顶部的问题
解决问题后的完整代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0 ,maximum-scale=1.0, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>弹出层测试</title>
<!-- 重置默认样式 -->
<link rel="stylesheet" href="css/reset.css">
<!-- 弹出层样式 -->
<link rel="stylesheet" href="css/toolCase2.css">
<style>
html,
body {
height: 100%;
overflow: auto;
}
</style>
</head>
<body>
<!-- 增高布局 start -->
<div style="font-size:20px;">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
<div>10</div>
<div>11</div>
<div>12</div>
<div>13</div>
<div>14</div>
<div>15</div>
<div>16</div>
<div>17</div>
<div>18</div>
<div>19</div>
<div>20</div>
<div>21</div>
<div>22</div>
<div>23</div>
<div>24</div>
<div>25</div>
<div>26</div>
<div>27</div>
<div>28</div>
<div>29</div>
<div>30</div>
<div>31</div>
<div>32</div>
<div>33</div>
<div>34</div>
<div>35</div>
<div>36</div>
<div>37</div>
<div>38</div>
<div>39</div>
<div>40</div>
<div>41</div>
<div>42</div>
<div>43</div>
<div>44</div>
<div>45</div>
<div>46</div>
<div>47</div>
<div>48</div>
<div>49</div>
<div>50</div>
</div>
<!-- 增高布局 end -->
<!-- 弹出层布局 start -->
<div class="toolCase-container" id="toolCase-container">
<div class="toolCase-ulParent" style="height:100px;overflow: auto;">
<!-- 增高布局 start -->
<div style="font-size:20px;">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
<div>10</div>
<div>11</div>
<div>12</div>
<div>13</div>
<div>14</div>
<div>15</div>
<div>16</div>
<div>17</div>
<div>18</div>
<div>19</div>
<div>20</div>
<div>21</div>
<div>22</div>
<div>23</div>
<div>24</div>
<div>25</div>
<div>26</div>
<div>27</div>
<div>28</div>
<div>29</div>
<div>30</div>
<div>31</div>
<div>32</div>
<div>33</div>
<div>34</div>
<div>35</div>
<div>36</div>
<div>37</div>
<div>38</div>
<div>39</div>
<div>40</div>
<div>41</div>
<div>42</div>
<div>43</div>
<div>44</div>
<div>45</div>
<div>46</div>
<div>47</div>
<div>48</div>
<div>49</div>
<div>50</div>
</div>
<!-- 增高布局 end -->
</div>
<div class="toolCase-close" id="toolCaseClose">取消</div>
</div>
<!-- 控制显示按钮 -->
<div class="toolCase opacity" id="toolCase" data-state="true"></div>
<!-- 遮罩 -->
<div class="toolCaseMask" id="toolCaseMask"></div>
<!-- 弹出层布局 end -->
<!-- 移动端自适应 -->
<script src="js/flexible.js"></script>
<!-- jquery库 -->
<script src="js/jquery-1.8.0.min.js"></script>
<script>
/*悬浮工具箱 js start*/
$("#toolCaseMask,#toolCaseClose,#toolCase").click(function () {
if ($("#toolCase-container").is(":animated")) return;
var state = $("#toolCase").data("state");
$("#toolCaseMask")[(state ? 'show' : 'hide')]();
$("#toolCase-container").slideToggle(300);
$("body,html").css(state ? { overflow: 'hidden' } : { overflow: 'auto' })
$("#toolCase").data('state', !state);
});
/*悬浮工具箱 js end*/
</script>
</body>
</html>
曾尝试使用event.preventDefault()阻止默认事件和禁止移动端触屏事件及其他方案,面对弹层中有滚动条时这些方案都不怎么好使及繁琐。
如果各位有更好解决方案或建议,请指教!