Aquí está mi solución que he usado en aplicaciones.
Inhabilité el desbordamiento del cuerpo y coloqué todo el html del sitio web dentro de los div del contenedor. Los contenedores del sitio web se desbordan y, por lo tanto, el usuario puede desplazarse por la página como se esperaba.
Luego creé un div hermano (#Prevent) con un índice Z más alto que cubre todo el sitio web. Dado que #Prevent tiene un índice Z más alto, se superpone al contenedor del sitio web. Cuando #Prevent está visible, el mouse ya no se desplaza por los contenedores del sitio web, por lo que no es posible desplazarse.
Por supuesto, puede colocar otro div, como su modal, con un índice z más alto que #Prevent en el marcado. Esto le permite crear ventanas emergentes que no sufren problemas de desplazamiento.
Esta solución es mejor porque no oculta las barras de desplazamiento (efecto de salto). No requiere detectores de eventos y es fácil de implementar. Funciona en todos los navegadores, aunque con IE7 y 8 tienes que jugar (depende de tu código específico).
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;
}
}
deshabilitar / habilitar el desplazamiento
PreventScroll('on'); // prevent scrolling
PreventScroll('off'); // allow scrolling