Ecco la mia soluzione che ho usato nelle applicazioni.
Ho disabilitato l'overflow del corpo e ho posizionato l'intero sito html all'interno dei div del contenitore. I contenitori del sito web sono in overflow e quindi l'utente può scorrere la pagina come previsto.
Ho quindi creato un div fratello (#Prevent) con uno z-index più alto che copre l'intero sito web. Poiché #Prevent ha uno z-index più alto, si sovrappone al contenitore del sito web. Quando #Prevent è visibile, il mouse non passa più con il mouse sui contenitori del sito Web, quindi lo scorrimento non è possibile.
Ovviamente puoi inserire un altro div, come il tuo modale, con uno z-index più alto di #Prevent nel markup. Ciò ti consente di creare finestre pop-up che non soffrono di problemi di scorrimento.
Questa soluzione è migliore perché non nasconde le barre di scorrimento (effetto di salto). Non richiede listener di eventi ed è facile da implementare. Funziona in tutti i browser, anche se con IE7 e 8 devi giocare (dipende dal tuo codice specifico).
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;
}
}
disabilita / abilita lo scroll
PreventScroll('on'); // prevent scrolling
PreventScroll('off'); // allow scrolling