Bootstrap modal
agrega automáticamente la clase modal-open
al cuerpo cuando se muestra un cuadro de diálogo modal y lo elimina cuando el cuadro de diálogo está oculto. Por lo tanto, puede agregar lo siguiente a su CSS:
body.modal-open {
overflow: hidden;
}
Podría argumentar que el código anterior pertenece a la base de código CSS Bootstrap, pero esta es una solución fácil para agregarlo a su sitio.
Actualización 8 de febrero de 2013
Esto ha dejado de funcionar en Twitter Bootstrap v. 2.3.0: ya no agregan la modal-open
clase al cuerpo.
Una solución alternativa sería agregar la clase al cuerpo cuando se va a mostrar el modal y eliminarlo cuando se cierre el modal:
$("#myModal").on("show", function () {
$("body").addClass("modal-open");
}).on("hidden", function () {
$("body").removeClass("modal-open")
});
Actualización 11 de marzo de 2013
Parece que la modal-open
clase volverá en Bootstrap 3.0, explícitamente con el fin de evitar el desplazamiento:
Reintroduce .modal-open en el cuerpo (para que podamos desplazar el desplazamiento allí)
Vea esto: https://github.com/twitter/bootstrap/pull/6342 - mire la sección Modal .
modal-open
volverá en Bootstrap 3, por lo que cuando se inicie, debería ser seguro eliminar el código anterior.La respuesta aceptada no funciona en dispositivos móviles (iOS 7 con Safari 7, al menos) y no quiero que se ejecute MOAR JavaScript en mi sitio cuando CSS lo haga.
Este CSS evitará que la página de fondo se desplace bajo el modal:
Sin embargo, también tiene un ligero efecto secundario de desplazarse esencialmente hacia la parte superior.
position:absolute
resuelve esto, pero reintroduce la capacidad de desplazarse en el móvil.Si conoce su ventana gráfica ( mi complemento para agregar la ventana gráfica a
<body>
) puede simplemente agregar una palanca css paraposition
.También agrego esto para evitar que la página subyacente salte hacia la izquierda / derecha al mostrar / ocultar modales.
esta respuesta es una x-post.
fuente
position: fixed
el cuerpo.Simplemente oculta el desbordamiento del cuerpo y hace que el cuerpo no se desplace. Cuando oculte el modal, revertirlo a automático.
Aquí está el código:
fuente
Puede intentar establecer el tamaño del cuerpo en tamaño de ventana con desbordamiento: oculto cuando modal está abierto
fuente
Debe ir más allá de la respuesta de @ charlietfl y tener en cuenta las barras de desplazamiento, de lo contrario, puede ver un reflujo de documentos.
Apertura del modal:
body
anchobody
desbordamiento enhidden
Establezca explícitamente el ancho del cuerpo a lo que era en el paso 1.
Cerrando el modal:
body
desbordamiento enauto
Establecer
body
ancho aauto
Inspirado por: http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php
fuente
$body.css("overflow", "auto");
en el último paso :)Advertencia: la siguiente opción no es relevante para Bootstrap v3.0.x, ya que el desplazamiento en esas versiones se ha limitado explícitamente al modal en sí. Si deshabilita los eventos de rueda, puede evitar inadvertidamente que algunos usuarios vean el contenido en modales que tienen alturas superiores a la altura de la ventana gráfica.
Otra opción más: eventos de rueda
El evento de desplazamiento no es cancelable. Sin embargo, es posible cancelar los eventos de rueda del mouse y rueda . La gran advertencia es que no todos los navegadores heredados son compatibles, Mozilla solo recientemente agregó soporte para este último en Gecko 17.0. No conozco la extensión completa, pero IE6 + y Chrome sí los admiten.
Aquí se explica cómo aprovecharlos:
JSFiddle
fuente
overflow:hidden
es mejor por ahora.fuente
No se pudo hacer que funcione en Chrome simplemente cambiando CSS, porque no quería que la página volviera a la parte superior. Esto funcionó bien:
fuente
Prueba este:
Funcionó para mí. (soporta IE8)
fuente
position: fixed
.Espero que esto ayude...
fuente
Agregar la clase 'is-modal-open' o modificar el estilo de la etiqueta del cuerpo con javascript está bien y funcionará como se supone. Pero el problema al que nos enfrentaremos es cuando el cuerpo se desborde: oculto, saltará a la parte superior (scrollTop se convertirá en 0). Esto se convertirá en un problema de usabilidad más adelante.
Como solución para este problema, en lugar de cambiar el desbordamiento de la etiqueta del cuerpo: oculto cámbielo en la etiqueta html
fuente
No estoy seguro acerca de este código, pero vale la pena intentarlo.
En jQuery:
Como dije antes, no estoy 100% seguro pero lo intento de todos modos.
fuente
A partir de noviembre de 2017, Chrome presentó una nueva propiedad css
overscroll-behavior: contain;
lo que resuelve este problema, aunque al momento de la escritura tiene una compatibilidad limitada entre navegadores.
vea los enlaces a continuación para obtener detalles completos y soporte del navegador
fuente
La mejor solución es la
body{overflow:hidden}
solución de solo CSS utilizada por la mayoría de estas respuestas. Algunas respuestas proporcionan una solución que también evita el "salto" causado por la barra de desplazamiento que desaparece; Sin embargo, ninguno era demasiado elegante. Entonces, escribí estas dos funciones, y parecen funcionar bastante bien.Mira este jsFiddle para verlo en uso.
fuente
open modal
botones. Chrome el 8Muchos sugieren "desbordamiento: oculto" en el cuerpo, que no funcionará (al menos no en mi caso), ya que hará que el sitio web se desplace hacia la parte superior.
Esta es la solución que funciona para mí (tanto en teléfonos móviles como en computadoras), usando jQuery:
Esto hará que el desplazamiento del modal funcione y evitará que el sitio web se desplace al mismo tiempo.
fuente
Podrías usar la siguiente lógica, la probé y funciona (incluso en IE)
fuente
No estoy 100% seguro de que esto funcione con Bootstrap, pero vale la pena intentarlo: funcionó con Remodal.js, que se puede encontrar en github: http://vodkabears.github.io/remodal/ y tendría sentido para los métodos para ser bastante similar
Para evitar que la página salte a la parte superior y también evitar el desplazamiento correcto del contenido, agregue una clase
body
cuando se active el modal y establezca estas reglas CSS:Es el
position:static
y elheight:auto
que se combinan para detener el salto de contenido a la derecha. Eloverflow-y:hidden;
detiene la página de ser desplazable detrás del modal.fuente
Basado en este violín: http://jsfiddle.net/dh834zgw/1/
el siguiente fragmento (usando jquery) deshabilitará el desplazamiento de la ventana:
Y en tu css:
Ahora, cuando elimine el modal, no olvide eliminar la clase noscroll en la etiqueta html:
fuente
overflow
debería establecerse enhidden
? +1 aunque esto funcionó para mí (usandohidden
).Tenía una barra lateral que fue generada por el hack de la casilla de verificación. Pero la idea principal es guardar el documento scrollTop y no cambiarlo durante el desplazamiento de la ventana.
Simplemente no me gustó el salto de página cuando el cuerpo se convierte en 'desbordamiento: oculto'.
fuente
Lamentablemente, ninguna de las respuestas anteriores solucionó mis problemas.
En mi situación, la página web originalmente tenía una barra de desplazamiento. Cada vez que hago clic en el modal, la barra de desplazamiento no desaparecerá y el encabezado se moverá un poco hacia la derecha.
Luego intenté agregar
.modal-open{overflow:auto;}
(que la mayoría de la gente me recomendó). De hecho, solucionó los problemas: la barra de desplazamiento aparece después de abrir el modal. Sin embargo, surge otro efecto secundario que es que "el fondo debajo del encabezado se moverá un poco hacia la izquierda, junto con otra barra larga detrás del modal"Afortunadamente, después de agregar
{padding-right: 0 !important;}
, todo se arregla perfectamente. Tanto el encabezado como el fondo del cuerpo no se movieron y el modal aún mantiene la barra de desplazamiento.Espero que esto pueda ayudar a aquellos que todavía están atrapados con este problema. ¡Buena suerte!
fuente
La mayoría de las piezas están aquí, pero no veo ninguna respuesta que lo ponga todo junto.
El problema es triple.
(1) evitar el desplazamiento de la página subyacente
(2) y quite la barra de desplazamiento
(3) limpiar cuando se descarta el modal
Si el modal no es de pantalla completa, aplique los enlaces .modal a una superposición de pantalla completa.
fuente
Mi solución para Bootstrap 3:
porque para mí, el único
overflow: hidden
en labody.modal-open
clase no impidió que la página se moviera hacia la izquierda debido al originalmargin-right: 15px
.fuente
Lo acabo de hacer de esta manera ...
Pero cuando desapareció el desplazador, movió todo bien 20px, así que agregué
justo después de eso.
Funciona para mi.
fuente
Si el modal es 100% alto / ancho, "mouseenter / leave" funcionará para habilitar / deshabilitar fácilmente el desplazamiento. Esto realmente funcionó para mí:
fuente
trabajó para mi
fuente
¿Por qué no hacer eso como hace Bulma? Cuando modal está activo, agregue a html su clase .is-clipped que está desbordada: hidden! Important; Y eso es.
Editar: Okey, Bulma tiene este error, por lo que debe agregar también otras cosas como
fuente
Dado que para mí este problema se presenta principalmente en iOS, proporciono el código para solucionarlo solo en iOS:
fuente
Ninguna de las respuestas anteriores funcionó perfectamente para mí. Así que encontré otra forma que funciona bien.
Simplemente agregue un
scroll.(namespace)
oyente y un conjuntoscrollTop
dedocument
a la última de su valor ...y también elimine al oyente en su guión cercano.
actualizar
Parece que esto no funciona bien en Chrome. alguna sugerencia para solucionarlo?
fuente
Esto funcionó para mí:
fuente
Para aquellos que se preguntan cómo obtener el evento de desplazamiento para el modal bootstrap 3:
fuente