zoukankan      html  css  js  c++  java
  • 解决弹出框滚动穿透的问题(问题是body也会滚动)

    参考 https://uedsky.com/2016-06/mobile-modal-scroll/      感谢分享  

    案例页面:view-source:https://uedsky.com/demo/modal-scroll.html

    第一步:给body加上个css类别样式

    body.modal-open {
        position: fixed;
         100%;
    }
    

    第二部:创建核心函数:

    /**
       * ModalHelper helpers resolve the modal scrolling issue on mobile devices
       * https://github.com/twbs/bootstrap/issues/15852
       * requires document.scrollingElement polyfill https://github.com/yangg/scrolling-element
       */
      var ModalHelper = (function(bodyCls) {
        var scrollTop;
        return {
        //打开弹窗
          afterOpen: function() {
            scrollTop = document.scrollingElement.scrollTop;
            document.body.classList.add(bodyCls);
            document.body.style.top = -scrollTop + 'px';
          },
         //关闭弹窗
          beforeClose: function() {
            document.body.classList.remove(bodyCls);
            // scrollTop lost after set position:fixed, restore it back.
            document.scrollingElement.scrollTop = scrollTop;
          }
        };
      })('modal-open');
    

      第三部:打开/关闭弹窗,引用核心函数

      

    //打开弹窗
    $('.D_md12 .material .addbox').on('click',function(){
    
        		 $('.material_pop').addClass('show');
        		 ModalHelper.afterOpen();
    	    });
    
    //关闭弹窗
    // pc点击空白区域关闭窗口
            $('.popbox:not(.publish_pop)').click(function(e){
              var _con = $('.popcontain');
              if(!_con.is(e.target) && _con.has(e.target).length === 0){
                $('.popbox').removeClass('show');
                ModalHelper.beforeClose();
              }
            });
    
    //pc esc关闭窗口
            $(document).keyup(function(event){
                if(event.which=='27'){
                    $('.popbox.show:not(.publish_pop)').removeClass('show');
                    ModalHelper.beforeClose();
                }
            });
    
    //PC 点击close按钮关闭弹窗
            $('.popbox:not(.publish_pop) .pop_closebtn').click(function(e){
                $('.popbox').removeClass('show');
                ModalHelper.beforeClose();
            });        
    

      

    备注:

    document.scrollingElement
    
    因为浏览器获取和设置 scrollTop 存在兼容性,为了简化上面的示例,我直接使用了 document.scrollingElement 这个新标准,对于不支持的浏览器我写了个 polyfill document.scrollingElement.js

    检测函数:

    <script>
    (function() {
      function addScript(src, supported) {
       if(!supported)
         document.write('<script src="' + src + '" async ></' + 'script>');
      }
      addScript('../src/polyfills/document.scrollingElement.js', document.scrollingElement);
    })();
    </script>
    
    document.scrollingElement.js
    /**
     * polyfill for document.scrollingElement
     * https://github.com/yangg/scrolling-element
     */
    (function () {
      if (document.scrollingElement) {
        return
      }
      var element = null
      function scrollingElement () {
        if (element) {
          return element
        } else if (document.body.scrollTop) {
          // speed up if scrollTop > 0
          return (element = document.body)
        }
        var iframe = document.createElement('iframe')
        iframe.style.height = '1px'
        document.documentElement.appendChild(iframe)
        var doc = iframe.contentWindow.document
        doc.write('<!DOCTYPE html><div style="height:9999em">x</div>')
        doc.close()
        var isCompliant = doc.documentElement.scrollHeight > doc.body.scrollHeight
        iframe.parentNode.removeChild(iframe)
        return (element = isCompliant ? document.documentElement : document.body)
      }
      Object.defineProperty(document, 'scrollingElement', {
        get: scrollingElement
      })
    })()
    

      

  • 相关阅读:
    【gtest/gmock】警告与报错集合
    【gtest/gmock】gmock:Mock的常用方法
    【C++容器】vector 和 list 的区别
    【C++百科】C++标准库到底是什么?
    【C++】设置、改变、获取系统环境变量:setenv & putenv & getenv
    【C++调试】error: 编译报错合集
    【C++调试】 warning: 编译警告合集
    Linux常用命令
    tcpdump及wireshark组合使用
    Vim快捷键
  • 原文地址:https://www.cnblogs.com/ghfjj/p/8317593.html
Copyright © 2011-2022 走看看