Вот мое решение, которое я использовал в приложениях.
Я отключил переполнение тела и поместил весь html сайта в div контейнера.Контейнеры веб-сайта переполнены, и поэтому пользователь может прокручивать страницу, как и ожидалось.
Затем я создал дочерний элемент div (#Prevent) с более высоким z-индексом, который охватывает весь веб-сайт.Поскольку #Prevent имеет более высокий z-индекс, он перекрывает контейнер веб-сайта.Когда виден #Prevent, мышь больше не наведена на контейнеры веб-сайта, поэтому прокрутка невозможна.
Конечно, вы можете поместить другой div, например, ваш модальный, с более высоким z-index, чем #Preventв разметке.Это позволяет создавать всплывающие окна, которые не страдают от проблем с прокруткой.
Это решение лучше, потому что оно не скрывает полосы прокрутки (эффект прыжка).Он не требует прослушивателей событий и его легко реализовать.Он работает во всех браузерах, хотя с IE7 и 8 вам придется поиграться (зависит от вашего конкретного кода).
html
<body>
<div id="YourModal" style="display:none;"></div>
<div id="Prevent" style="display:none;"></div>
<div id="WebsiteContainer">
<div id="Website">
website goes here...
</div>
</div>
</body>
css
body { overflow: hidden; }
#YourModal {
z-index:200;
/* modal styles here */
}
#Prevent {
z-index:100;
position:absolute;
left:0px;
height:100%;
width:100%;
background:transparent;
}
#WebsiteContainer {
z-index:50;
overflow:auto;
position: absolute;
height:100%;
width:100%;
}
#Website {
position:relative;
}
jquery / js
function PreventScroll(A) {
switch (A) {
case 'on': $('#Prevent').show(); break;
case 'off': $('#Prevent').hide(); break;
}
}
отключить / включить прокрутку
PreventScroll('on'); // prevent scrolling
PreventScroll('off'); // allow scrolling