弹窗滑动,造成body跟随滑动解决办法

  今天测试的时候遇到一个移动端的bug,为什么说是移动端的呢,因为在谷歌浏览器的移动模式下,这个是不会出现的。先描述具体的情况。一个长页面(肯定是比手机长的页面,所以肯定会滑动),里面有一个按钮,点击按钮的时候,会有一个比屏幕小的弹窗,出现游戏规则。这个游戏规则也是超出这个弹窗的大小的,多以这个弹窗也是会滑动的。

  真机测试的时候发现,当弹窗滑动到最低端的时候,继续向上滑动,发现底部的body页面也开始向上滑。我已经对body设置了overflow:hidden。但是移动端还是不管用,所以在网上寻找答案。主要是两种解决办法。

  第一种:

  就是在弹窗弹起的时候直接把滑动事件touchmove禁止了。但是这样的话,我们的弹窗里面的内容也是不能滑动,这显然是不可以的。所以我们尝试了第二种解决方案。

  第二种:

  在弹窗弹起的时候把body的定位改为fixed,然后计算出滚动的距离,最后给body赋值。当弹窗消失的时候,把上面的操作倒过来。下面直接看代码:

  1 <!DOCTYPE html>
  2 <html>
  3 
  4     <head>
  5         <meta charset="UTF-8">
  6         <title>测试移动端滑动的问题</title>
  7         <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
  8         <link rel="stylesheet" type="text/css" href="css/cssReset.css" />
  9         <link rel="stylesheet" type="text/css" href="css/lottery.css" />
 10         <style type="text/css">
 11             button{
 12                 position: fixed;
 13                 left: 0;
 14                 top: 100px;
 15                 width: 100px;
 16                 height: 40px;
 17                 line-height: 40px;
 18                 font-size: 28px;
 19             }
 20         </style>
 21     </head>
 22 
 23     <body>
 24         <div id="big_box">
 25             <button>按钮</button>
 26             <div class="gz-mc" style="display: none;">
 27                 <div class="gz-nr">
 28                     <div class="gz-nrgb"><span>X</span></div>
 29                     <h4>一.玩法说明</h4>
 30                     <p>目前竞彩足球共有6种玩法,分别是“混投”,“胜平负”,“让球胜平负”,“二选一”,“猜比分”,“总进球”。 竞猜的比赛均优选自各国主流比赛,从相关主流体育媒体网站均可查阅相关赛事。比赛对阵主队在前,客队在后.</p>
 31 
 32                     <p>1.胜平负:竞猜两支球队,在90分钟内(含伤停补时,不含加时)的胜平负结果。 投注选项有3、1、0(胜、平、负) 。</p>
 33 
 34                     <p>2.让球胜平负:竞猜两支球队让球以后,在90分钟内(含伤停补时,不含加时)的胜平负结果。 投注选项有3、1、0(胜、平、负) 。</p>
 35 
 36                     <p>3.比分:竞猜两支球队在90分钟内(含伤停补时,不含加时)的比分。 投注选项有1:0 2:0 3:0等31种选项。</p>
 37 
 38                     <p>4.总进球:竞猜两支球队在90分钟内(含伤停补时,不含加时)的总进球数量。 投注选项有0、1、2、3、4、5、6、7+ 。</p>
 39 
 40                     <p>5.二选一:本功能是结合胜平负和让球胜平负两个玩法的混合过关。将一场比赛的三个选项,简化成两个选项。赛程只取让球值为+1和-1的比赛。 让球值为-1的比赛,【主胜】为胜平负的主胜;【客不败】为让球胜平负的客胜。 让球值为+1的比赛, 【主不败】为让球胜平负的主胜;【客胜】为胜平负的客胜。</p>
 41 
 42                     <p>注:</p>
 43                     <p>(1)让球:让球值为负数表示主队让客队多少球,正数表示客队让主队多少球,让球值一旦确定就不再调整。</p>
 44 
 45                     <p>例如:皇马-1 VS巴萨,表示皇马让1球,皇马以1球以上战胜巴萨时,赛果为3。皇马以1球战胜巴萨时,赛果为1。当皇马负、打平巴萨时,赛果为0。</p>
 46 
 47                     <h4>二.过关方式</h4>
 48 
 49                     <p>1.玩家选择1种投注结果的为单式投注;选择2种或2种以上投注结果的为复式投注。</p>
 50 
 51                     <p>2.玩家选择1场比赛进行投注的为单场投注;选择2场或2场以上比赛进行串联投注的为过关投注。在过关投注中,所选比赛的结果全部竞猜正确才能中奖。 </p>
 52                     <h4>三.奖金计算</h4>
 53 
 54                     <p>1.竞彩足球的过关投注奖金会根据投注等情况进行实时的调整;投注方案的中奖金额以完成投注最终出票时刻的奖金为准,不受投注完成后奖金调整的影响。 投注页面的奖金赔率也仅供参考。</p>
 55 
 56                     <p>2.单张彩票的中奖奖金=单注奖金*倍数;单注奖金=投注基数*所选比赛的奖金赔率连乘。目前投注基数为20000金币.</p>
 57 
 58                     <p>例如:用户投注2场比赛2串1过关并且中奖,出票时的奖金赔率分别是1.68和3.95,倍数为100倍,单注奖金=20000金币x1.68x3.95=132720金币,方案总奖金=132720x100倍=132072000金币</p>
 59 
 60                     <p>3.串联过关最高奖金限制</p>
 61                     <p>单张彩票最高限额:</p>
 62                     <p>(1)选择2-3场过关投注的,单张最高奖金限额40000万金币;</p>
 63                     <p>(2)选择4-5场过关投注的,单张最高奖金限额60000万金币;</p>
 64                     <p>(3)选择6-8场过关投注的,单张最高奖金限额80000万金币。</p>
 65 
 66                     <h4>四.延期、中断、取消的比赛,如何算奖?</h4>
 67 
 68                     <p>1.延期比赛如何处理:</p>
 69                     <p>推迟时间未超过36小时,则正常算奖;</p>
 70                     <p>推迟时间超过36小时或无法确定时间,则该场为无效场次,按比赛取消算奖;</p>
 71                     <p>取消赛事算奖:单关固定玩法返还投注金额,过关投注该场赔率值按1.0计算奖金;</p>
 72 
 73                     <p>2.中断比赛如何处理:</p>
 74                     <p>36小时内继续完成比赛则正常算奖;</p>
 75                     <p>36小时内未完成比赛则该场为无效场次,按比赛取消算奖;</p>
 76 
 77                     <p>3.取消赛事算奖:单关固定玩法返还投注金额,过关投注该场赔率值按1.0计算奖金;</p>
 78 
 79                     <h4>五.截止投注时间、开奖时间</h4>
 80                     <p>截止投注时间为比赛正式开始前5分钟,单式投注的开奖时间为比赛结束后,复式投注的开奖时间为所选所有比赛结束后。</p>
 81                     <p>注:可根据投注额、突发事件等因素,拒绝某些大额投注、暂停或提前截止针对该场比赛的所有投注。</p>
 82                 </div>
 83             </div>
 84         </div>
 85     </body>
 86     <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
 87     <script type="text/javascript">
 88         for(var i = 0; i < 100; i++) {
 89             $("#big_box").append("<p>这是第" + i + "条数据</p>");
 90         }
 91         $("button").click(function() {
 92             $(".gz-mc").show();
 93             $("body").css({
 94                 "overflow": "hidden"
 95             });
 96             //$('body').on('touchmove', preventDefaultFn);
 97             stopScrollLong();
 98         })
 99 
100         $(".gz-nrgb span").click(function(){
101             $(".gz-mc").hide();
102             $("body").css({
103                 "overflow": "auto"
104             });
105             recoverScrollLong();
106         })
107         function stopScrollLong() {
108             var top = -$(window).scrollTop();
109             $('body').css({
110                 'position': 'fixed'
111             })
112             setTimeout(function() {
113                 $('body').css({
114                     'top': top + 'px'
115                 })
116             }, 10)
117         }
118 
119         function recoverScrollLong() {
120             var top = parseInt(-$('body').css('top').replace('px', ''));
121             $('body').css({
122                 position: 'static'
123             })
124             $(window).scrollTop(top);
125         }
126     </script>
127 
128 </html>

突然发现少了两个css文件,这两个里面一个是清楚css默认格式的,一个是给弹窗鞋写样式的。你们可以自己写,没有什么问题。这里也附上百度的网盘链接,请点这里。密码:kiwk

  这个时候就能达到我们想要的效果了。简单的记录一下

posted @ 2018-08-21 09:52  程先生哈  阅读(963)  评论(0编辑  收藏  举报