web前端——pc端、移动端阻止除弹层外的内容滚动解决方案

如何在弹层弹出时阻止底部滑动 最佳方案

    网上对这个问题的解答众说纷纭,总结来看原理就下面这几种:

        1.阻止body滚动的默认行为:

            在弹层弹出后给body添加onscroll事件(移动端阻止ontouchmove),并通过preventDefault让body不能滚动,这样的优点是代码量少,能达到一定的效果。但同时缺点也是显而易见的,这样的做法在弹层内容不需要滚动的情况下可以使用,但是在弹层内容也需要滚动的情况下就不行了。

        2.body设置overflow:hidden:  

            这种方法通过在弹层弹出后给body设置样式height:100%;overflow:hidden,让body无法滚动,亲测pc端可以,移动端不起作用(猜测是移动端浏览器的问题),具体原因还请大神来解答。如果不需要考虑移动端,可以使用这种方法,代码也很简洁。

        3.body设置position:fixed :

            在弹层弹出后给body设置position:fixed, pc端移动端都可以,但是会强制滚动到页面顶部(因为此时body已经不能滚动了。scrollTop被重置为0),这种方法是最接近完美的解决方法,所以完美的解决办法就是这种方法的增强版。

         完美的解决方案:

            在将要弹出弹层时候记录当前滚动的位置,将body设置为固定定位之后,再将实际显示的区域(不想滚动的区域)最外层进行定位,并将top值设置为负的滚动位置值,这样就不会在弹出弹层之后回到页面顶部,然后在弹层关闭后解除body的固定定位以及之前不想滚动区域的定位,并滚动到之前记录的位置(设置scrollTop的值)。这样就完美解决了弹出弹层后底部会滑动的问题,并且弹层内容可滑动。

            


    示例: 假如已经滚动了500px 那么此时的代码则是


<body style="position:fixed">

    <section style="position:fixed;top:-500px">

        <!-- 不想滚动的区域 -->

    </section>

    <section>       

         <!-- 弹层区域 -->

     </section> 

 </body>


具体的逻辑代码,如何操作dom结构就不写了, 大家应该也会,只要理解了这个原理,不论是使用jq还是原生,使用vue或者react等的框架,都可以这样解决弹层滑动问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,020评论 3 119
  • 我是一个很普通的一个人,普通的九零后。普通的家庭出身,小学文化。 我该怎样实现自己想过的生活?有时候我在想...
    代帅阅读 294评论 0 1
  • 没有自己,才能,保 全 自 己。
    M_152阅读 97评论 0 0
  • 在学习群里打出这些字时,我一边忐忑一边鼓励自己。忐忑是因为我担心没有人回应我,我的自动化解释是没人回应的人,代表你...
    董虹心理咨询师阅读 102评论 0 1
  • 前两天看到一份有趣的大数据报告——《“宅一族”学习类App使用时长增幅近两倍,他们真的不求上进吗?》。这份数据报告...
    虾运营阅读 1,651评论 0 2