防止在打开覆盖层时主体不滚动,而没有跳到顶部,也没有左右跳动?

时间:2019-03-18 11:10:57

标签: javascript css scroll scrollbar overlay

打开覆盖层(模态,侧面导航...)时,防止主体滚动的最佳方法是什么?

我正在寻找可以解决以下问题的东西:

  • 页面跳至顶部(溢出:隐藏在正文中)
  • 滚动条消失时页面从右向左跳转(溢出:隐藏在正文中)
  • 继续滚动浏览叠加层
  • 在移动设备和台式机上均可使用

我已经尝试过这里提出的解决方案:https://stackoverflow.com/a/24727206/8132424 但是它们似乎都不完美。

你有什么主意吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

您好,您可以尝试使用此代码来停止跳跃元素。

// opens modal without jumping
    $('.modal_open').click(function(event){
      event.preventDefault();
      $('.modal_popup').addClass('open');
      $('body').css({
        "overflow-y": "hidden",
        "padding-right": getScrollbarWidth() + 'px'
      });
      // getScrollbarWidth();
    });
    // close popup by outside click
    $('.modal_popup').click(function() {
      $('.modal_popup').removeClass('open');
      $('body').css({
        "overflow-y": "auto",
        "padding-right": '0px'
       });
    });
    $('.modal_popup > div').click(function(event) {
      event.stopPropagation();
     });
    function getScrollbarWidth() {
      var outer = document.createElement("div");
      outer.style.visibility = "hidden";
      outer.style.width = "100px";
      document.body.appendChild(outer);

      var widthNoScroll = outer.offsetWidth;
      // force scrollbars
      outer.style.overflow = "scroll";

      // add innerdiv
      var inner = document.createElement("div");
      inner.style.width = "100%";
      outer.appendChild(inner);        

      var widthWithScroll = inner.offsetWidth;

      // remove divs
      outer.parentNode.removeChild(outer);

      return widthNoScroll - widthWithScroll;
  }
body {
  background: #f5f5f5;
}
.body_scroll {
  width: 100%;
  height: 100%;
  min-height: 500px;
  overflow: auto;
}
.modal_popup {
  position: fixed;
  top: 0px;
  left: 0px;
  right: 0px;
  bottom: 0px;
  background: rgba(0, 0, 0, 0.5);
  opacity: 0;
  visibility: hidden;
}
.modal_popup.open {
  opacity: 1;
  visibility: visible;
}
.modal_popup > div {
  background: #fff;
  width: 300px;
  height: 250px;
  position: absolute;
  left: 50%;
  top: 50%;
  -webkit-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
} 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="body_scroll">
    <a href="#" class="modal_open">Click to open modal</a>
    <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</p>
  </div>
  <div class="modal_popup">
    <div>Click outside to close the popup</div>
  </div>

答案 1 :(得分:0)

检查以下代码

 jQuery(document).ready(function($) {
            $('button').on('click', function(){
                $('.modal').addClass('active');
                $('body').addClass('modal-open');
            });
            $('.close').on('click', function(){
                $('.modal').removeClass('active');
                $('body').removeClass('modal-open');
            });
        });
        .body-container{
            max-width: 1200px;
            width:100%;
            margin:0 auto;
            background-color: #dddddd;
            padding:10px;
        }
.modal {
    position: fixed;
    top: 0;
    right: 0;
    left: 0;
    bottom: 0;
    background-color: rgba(0,0,0,0.3);
    justify-content: center;
    align-items: center;
    display: none;
}
.modal.active {
    display: flex;
}
.inner {
    background-color: #ffffff;
    padding: 20px;
    max-width: 500px;
    margin: 0 auto;
    position: relative;
}
.close {
    position: absolute;
    right: -10px;
    top: -10px;
    background-color: #000000;
    height: 30px;
    width: 30px;
    color: #ffffff;
    text-align: center;
    border-radius: 50%;
    line-height: 30px;
    cursor: pointer;
}
.modal-open {
    overflow: hidden;
}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<div class="body-container">
        <button>Click</button>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ipsa, beatae molestias. Optio et atque consequatur. Aut ipsam, fuga nesciunt perspiciatis accusamus consequatur culpa omnis. Error fuga accusantium voluptatem magni.
    </div>
    <div class="modal">
       <div class="inner">
        <span class="close">X</span>
            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Neque optio numquam consequatur, nostrum saepe rerum explicabo dignissimos quos maxime amet, qui repudiandae perferendis vel, id quaerat, quidem quo ad! Ipsum!
       </div>
    </div>