Предотвратить прокрутку тела при открытии модального - PullRequest
310 голосов
/ 02 марта 2012

Я хочу, чтобы мое тело перестало прокручиваться при использовании колесика мыши, пока модальное (с http://twitter.github.com/bootstrap) на моем сайте открыто.

Я пытался вызвать фрагмент JavaScript ниже, когда модал открыт, но безуспешно

$(window).scroll(function() { return false; });

AND

$(window).live('scroll', function() { return false; });

Обратите внимание, что на нашем сайте прекращена поддержка IE6, хотя IE7 + должен быть совместимым.

Ответы [ 41 ]

0 голосов
/ 26 сентября 2016

Небольшая заметка для тех, кто в SharePoint 2013. В теле уже есть overflow: hidden.Вам нужно установить overflow: hidden для элемента div с идентификатором s4-workspace, например,

var body = document.getElementById('s4-workspace');
body.className = body.className+" modal-open";
0 голосов
/ 23 октября 2014

Я использую эту ванильную функцию js, чтобы добавить "модально открытый" класс в тело. (На основании ответа smhmic)

function freezeScroll(show, new_width)
{
    var innerWidth = window.innerWidth,
        clientWidth = document.documentElement.clientWidth,
        new_margin = ((show) ? (new_width + innerWidth - clientWidth) : new_width) + "px";

    document.body.style.marginRight = new_margin;
    document.body.className = (show) ? "modal-open" : "";
};
0 голосов
/ 16 ноября 2014

Сокрытие переполнения и фиксация положения делает свое дело, однако с моим изменчивым дизайном это будет фиксировать его за шириной браузеров, так что ширина: 100% исправит это.

body.modal-open{overflow:hidden;position:fixed;width:100%}
0 голосов
/ 18 декабря 2014

Попробуйте этот код:

$('.entry_details').dialog({
    width:800,
    height:500,
    draggable: true,
    title: entry.short_description,
    closeText: "Zamknij",
    open: function(){
        //    blokowanie scrolla dla body
        var body_scroll = $(window).scrollTop();
        $(window).on('scroll', function(){
            $(document).scrollTop(body_scroll);
        });
    },
    close: function(){
        $(window).off('scroll');
    }
}); 
0 голосов
/ 21 августа 2015
   $('.modal').on('shown.bs.modal', function (e) {
      $('body').css('overflow-y', 'hidden');
   });
   $('.modal').on('hidden.bs.modal', function (e) {
      $('body').css('overflow-y', '');
   });
0 голосов
/ 19 октября 2018

Почему бы не сделать это, как Булма? Когда модальный активен, тогда добавьте в html их класс .is-clipped, который переполнен: hidden! Важный; И это все.

Редактировать: Окей, Булма имеет эту ошибку, поэтому вы должны добавить и другие вещи, такие как

html.is-modal-active {
  overflow: hidden !important;
  position: fixed;
  width: 100%; 
}
0 голосов
/ 30 мая 2019

Использование body-scroll-lock

Очень легкий, очень аккуратный и всплывающий

0 голосов
/ 01 апреля 2019

Что окончательно исправило это для меня, было Блокировка прокрутки тела .

Другие решения не отключают прокрутку на iOS.

0 голосов
/ 07 августа 2015

Вы должны добавить overflow: hidden в HTML для лучшей кроссплатформенной производительности.

Я бы использовал

html.no-scroll {
    overflow: hidden;
}
0 голосов
/ 10 июня 2019

Так как для меня эта проблема представлена ​​в основном на iOS, я предоставляю код, чтобы исправить это только на iOS:

  if(!!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)) {
    var $modalRep    = $('#modal-id'),
        startScrollY = null, 
        moveDiv;  

    $modalRep.on('touchmove', function(ev) {
      ev.preventDefault();
      moveDiv = startScrollY - ev.touches[0].clientY;
      startScrollY = ev.touches[0].clientY;
      var el = $(ev.target).parents('#div-that-scrolls');
      // #div-that-scrolls is a child of #modal-id
      el.scrollTop(el.scrollTop() + moveDiv);
    });

    $modalRep.on('touchstart', function(ev) {
      startScrollY = ev.touches[0].clientY;
    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...