Podaję tylko małe dostrojenie rozwiązania przez tfe . W szczególności dodałem dodatkową kontrolę, aby upewnić się, że nie ma przesunięcia zawartości strony (czyli przesunięcia strony ), gdy pasek przewijania jest ustawiony na hidden.
Dwie funkcje JavaScript lockScroll()i unlockScroll()można zdefiniować odpowiednio, aby zablokować i odblokować przewijanie strony.
function lockScroll(){
$html = $('html');
$body = $('body');
var initWidth = $body.outerWidth();
var initHeight = $body.outerHeight();
var scrollPosition = [
self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
];
$html.data('scroll-position', scrollPosition);
$html.data('previous-overflow', $html.css('overflow'));
$html.css('overflow', 'hidden');
window.scrollTo(scrollPosition[0], scrollPosition[1]);
var marginR = $body.outerWidth()-initWidth;
var marginB = $body.outerHeight()-initHeight;
$body.css({'margin-right': marginR,'margin-bottom': marginB});
}
function unlockScroll(){
$html = $('html');
$body = $('body');
$html.css('overflow', $html.data('previous-overflow'));
var scrollPosition = $html.data('scroll-position');
window.scrollTo(scrollPosition[0], scrollPosition[1]);
$body.css({'margin-right': 0, 'margin-bottom': 0});
}
gdzie założyłem, że <body>nie ma początkowego depozytu zabezpieczającego.
Zauważ, że chociaż powyższe rozwiązanie działa w większości praktycznych przypadków, nie jest ostateczne, ponieważ wymaga dalszego dostosowania dla stron, które zawierają na przykład nagłówek z position:fixed. Przejdźmy do tego szczególnego przypadku z przykładem. Przypuśćmy, że tak
<body>
<div id="header">My fixedheader</div>
<!--- OTHER CONTENT -->
</body>
z
#header{position:fixed; padding:0; margin:0; width:100%}
Następnie należałoby dodać następujących funkcji lockScroll()oraz unlockScroll():
function lockScroll(){
//Omissis
$('#header').css('margin-right', marginR);
}
function unlockScroll(){
//Omissis
$('#header').css('margin-right', 0);
}
Na koniec zwróć uwagę na możliwą wartość początkową marginesów lub wypełnień.