Вот мое решение, которое я использовал в приложениях.
Я отключил переполнение тела и поместил весь 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;
}
#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');
PreventScroll('off');