Estoy tratando de deshabilitar la barra de desplazamiento html / body del padre mientras estoy usando una caja de luz. La palabra principal aquí es deshabilitar . Yo no quiero ocultarlo con overflow: hidden;
.
La razón de esto es que overflow: hidden
hace que el sitio salte y ocupe el área donde estaba el pergamino.
Quiero saber si es posible desactivar una barra de desplazamiento mientras la sigo mostrando.
javascript
jquery
html
css
Dejan.S
fuente
fuente
Respuestas:
Si la página debajo de la capa superpuesta se puede "arreglar" en la parte superior, cuando abre la capa superpuesta puede configurar
aún debería ver la barra de desplazamiento derecha pero el contenido no se puede desplazar. Cuando cierre la superposición, simplemente revierta estas propiedades con
Solo propuse de esta manera solo porque no necesitarías cambiar ningún evento de desplazamiento
Actualizar
También podría hacer una pequeña mejora: si obtiene la
document.documentElement.scrollTop
propiedad a través de JavaScript justo antes de que se abra la capa, puede asignar dinámicamente ese valor comotop
propiedad del elemento del cuerpo: con este enfoque, la página se mantendrá en su lugar, sin importar si usted ' volver arriba o si ya te has desplazado.Css
JS
fuente
$('body').css('top', -($('body').scrollTop()) + 'px').addClass('noscroll');
Cuatro pequeñas adiciones a la solución seleccionada:
Solución completa que parece funcionar para la mayoría de los navegadores:
CSS
Deshabilitar desplazamiento
Habilitar desplazamiento
Gracias a Fabrizio y Dejan por ponerme en el camino correcto y a Brodingo por la solución a la barra de desplazamiento doble.
fuente
afterLoad()
yafterClose
devoluciones de llamada. Podría ser útil para otros que buscan esta pregunta.scrollTop
tal manera que la línea 2 del código 'Deshabilitar desplazamiento' se puede expresar como$( window ).scrollTop()
.if (scrollTop < 0) { scrollTop = 0; }
. Aquí está el código completo para deshabilitar gist.github.com/jayd3e/2eefbbc571cd1668544b .Con jQuery incluido:
inhabilitar
habilitar
uso
fuente
Soy el OP
Con la ayuda de la respuesta de fcalderan pude formar una solución. Dejo mi solución aquí, ya que aporta claridad sobre cómo usarla y agrega un detalle crucial,
width: 100%;
Agrego esta clase
esto funcionó para mí y estaba usando Fancyapp.
fuente
Esto funcionó muy bien para mí ...
simplemente envuelva esas dos líneas de código con lo que decida cuándo va a bloquear el desplazamiento.
p.ej
fuente
No puede deshabilitar el evento de desplazamiento, pero puede deshabilitar las acciones relacionadas que conducen a un desplazamiento, como la rueda del mouse y la tecla táctil:
fuente
Puede ocultar la barra de desplazamiento del cuerpo
overflow: hidden
y establecer un margen al mismo tiempo para que el contenido no salte:Y luego puede agregar una barra de desplazamiento deshabilitada a la página para llenar el vacío:
Hice exactamente esto para mi propia implementación de lightbox. Parece estar funcionando bien hasta ahora.
fuente
Esta es la solución con la que fuimos. Simplemente guarde la posición de desplazamiento cuando se abra la superposición, vuelva a la posición guardada cada vez que el usuario intente desplazarse por la página y apague el oyente cuando la superposición esté cerrada.
Es un poco nervioso en IE, pero funciona de maravilla en Firefox / Chrome.
fuente
z-index
de.overlay-shown
para que sea mayor que el encabezado fijo. (Tengo este código ejecutándose en producción en un sitio con un encabezado fijo y funciona bien).body
etiqueta. Experimenté con su código ayer y tengo un encabezado fijo en la parte superior de mi página. Si manejo el desplazamiento a través de labody
etiqueta, la barra de desplazamiento estará debajo del encabezado fijo.$("body")
, estamos usando$(window)
. Y en lugar dez-index: -1
en la superposición para ocultarlo, puede usarvisibility: hidden
o similar. Vea jsfiddle.net/8p2gfeha para una prueba rápida para ver si funciona. El encabezado fijo ya no aparece en la parte superior de la barra de desplazamiento. Eventualmente intentaré incorporar estos cambios en la respuesta.Tuve un problema similar: un menú de la izquierda que, cuando aparece, impide el desplazamiento. Tan pronto como la altura se estableció en 100vh, la barra de desplazamiento desapareció y el contenido se movió hacia la derecha.
Entonces, si no le importa mantener la barra de desplazamiento habilitada (pero configurando la ventana a la altura completa para que no se desplace en ninguna parte), otra posibilidad es establecer un pequeño margen inferior, que mantendrá las barras de desplazamiento mostrando:
fuente
overflow:hidden
impide que el margen tenga efecto?puede mantener el desbordamiento: oculto pero administrar manualmente la posición de desplazamiento:
antes de mostrar el rastro de la posición de desplazamiento real:
deberia de funcionar
fuente
Una forma cruda pero funcional será forzar el desplazamiento hacia arriba, desactivando así el desplazamiento:
Cuando abra la caja de luz, levante la bandera y, al cerrarla, baje la bandera.
Caso de prueba en vivo .
fuente
Me gusta apegarme al método "desbordamiento: oculto" y simplemente agregar el relleno derecho que es igual al ancho de la barra de desplazamiento.
Obtener la función de ancho de la barra de desplazamiento, por lostsource .
Al mostrar la superposición, agregue la clase "noscroll" a html y agregue padding-right al cuerpo:
Al esconderse, elimine la clase y el relleno:
El estilo noscroll es solo esto:
Tenga en cuenta que si tiene elementos con posición: fijo, también debe agregar el relleno a esos elementos.
fuente
<div id="lightbox">
está dentro del<body>
elemento, por lo tanto, cuando desplaza la caja de luz, también desplaza el cuerpo. La solución es no extender el<body>
elemento más del 100%, colocar el contenido largo dentro de otrodiv
elemento y agregar una barra de desplazamiento si es necesario con estediv
elementooverflow: auto
.Ahora, desplazarse sobre la caja de luz (y
body
también) no tiene ningún efecto, porque el cuerpo no tiene más del 100% de la altura de la pantalla.fuente
Todos los sistemas basados en JavaScript modal / lightbox utilizan un desbordamiento cuando se muestran modal / lightbox, en la etiqueta html o etiqueta corporal.
Cuando se muestra lightbox, el js empuja un desbordamiento oculto en html o etiqueta de cuerpo. Cuando lightbox está oculto, algunos eliminan el oculto, otros empujan un desbordamiento automático en html o etiqueta de cuerpo.
Los desarrolladores que trabajan en Mac no ven el problema de la barra de desplazamiento.
Simplemente reemplace lo oculto por un desarmado para no ver el contenido deslizarse bajo el modal de la eliminación de la barra de desplazamiento.
Caja de luz abierta / mostrar:
Lightbox cerrar / ocultar:
fuente
Si la página debajo de la capa superpuesta se puede "arreglar" en la parte superior, cuando abre la capa superpuesta puede configurar
proporcione esta clase al cuerpo desplazable, aún debería ver la barra de desplazamiento derecha pero el contenido no se puede desplazar.
Para mantener la posición de la página, haga esto en jquery
Cuando cierre la superposición, simplemente revierta estas propiedades con
Solo propuse de esta manera solo porque no necesitarías cambiar ningún evento de desplazamiento
fuente
CSS
JS
Ahora todo lo que necesitas hacer es llamar a las funciones
fuente
Puedes hacerlo con Javascript:
Y luego deshabilítelo cuando su caja de luz esté cerrada.
Pero si su caja de luz contiene una barra de desplazamiento, no podrá desplazarse mientras esté abierta. Esto es porque
window
contiene ambosbody
y#lightbox
. Entonces debe usar una arquitectura como la siguiente:Y luego aplique el
onscroll
evento solo en#global
.fuente