Предотвратить прокрутку тела при открытии оверлея, без прыжков наверх, без прыжков влево / вправо? - PullRequest
0 голосов
/ 18 марта 2019

Каков наилучший способ предотвратить прокрутку тела при открытии оверлея (модальное, боковое перемещение ...)?

Я ищу что-то, что решило бы следующие проблемы:

  • Переход на страницу вверх (переполнение: скрыто на теле)
  • Переход страницы справа налево при исчезновении полосы прокрутки (переполнение: скрыто на теле)
  • Продолжайте прокручивать внутри оверлея
  • Работает как на мобильном, так и на настольном компьютере

Я уже попробовал предложенные здесь решения: https://stackoverflow.com/a/24727206/8132424 Но ни один из них не казался идеальным.

У вас есть идеи? Я что-то пропустил?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Привет, можешь попробовать этот код, чтобы перестать прыгать элементы.

// 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>
0 голосов
/ 18 марта 2019

Проверьте следующий код

 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>
...