Solo proporciono un pequeño ajuste a la solución por tfe . En particular, agregué un control adicional para garantizar que no haya cambios en el contenido de la página (también conocido como cambio de página ) cuando la barra de desplazamiento está configurada en hidden
.
Dos funciones Javascript lockScroll()
y unlockScroll()
se pueden definir, respectivamente, para bloquear y desbloquear el desplazamiento de la página.
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});
}
donde supuse que <body>
no tiene margen inicial.
Tenga en cuenta que, si bien la solución anterior funciona en la mayoría de los casos prácticos, no es definitiva, ya que necesita más personalización para las páginas que incluyen, por ejemplo, un encabezado con position:fixed
. Veamos este caso especial con un ejemplo. Supongamos tener
<body>
<div id="header">My fixedheader</div>
<!--- OTHER CONTENT -->
</body>
con
#header{position:fixed; padding:0; margin:0; width:100%}
Entonces, uno debe agregar lo siguiente en funciones lockScroll()
y unlockScroll()
:
function lockScroll(){
//Omissis
$('#header').css('margin-right', marginR);
}
function unlockScroll(){
//Omissis
$('#header').css('margin-right', 0);
}
Finalmente, tenga en cuenta algunos posibles valores iniciales para los márgenes o rellenos.