Bootstrap modal elimina la barra de desplazamiento

Respuestas:

115

Esta es una característica, la clase modal-opense agrega al HTMLbody cuando muestra el modal y se elimina cuando lo oculta.

Esto hace que la barra de desplazamiento desaparezca ya que el bootstrap css dice

.modal-open {
    overflow: hidden;
}

Puede anular esto especificando

.modal-open {
    overflow: scroll;
}

en su propio css.

flup
fuente
¿Puedes ser más específico por favor?
El Dude
1
Se agregaron algunos detalles más. ¿Mejor ahora?
flup
14
Es más apropiado usar overflow-y: scroll, que creo que aborda mejor la intención de la pregunta de OP. Usando overflow: scroll agregará una barra de desplazamiento horizontal a la parte inferior de la pantalla.
Scott
1
perfecto, también funciona con modales de correa angular, simplemente puede incluir el CSS anterior en un <style></style>interior templateUrlpara que no afecte a otros modales en la aplicación.
Davidkonrad
2
Use overflow: heredar; en lugar. De esta manera, el modal no elimina el desplazamiento cuando tiene desplazamiento y no agrega desplazamiento cuando no lo tiene
Alisson Alvarenga
32

Creo que heredar es mejor que scroll porque cuando abres modal, siempre se abrirá con scroll, pero cuando no tienes ningún scrolls tendrás el mismo problema. Así que solo hago esto:

.modal-open {
  overflow: inherit;
}
Alisson Alvarenga
fuente
Esta es la verdadera respuesta. El desplazamiento de desbordamiento todavía afecta algún elemento en mi caso.
Coisox
25

solía

.modal-open {
  overflow-y: scroll;
}

En este caso, evita mostrar la barra de desplazamiento horizontal

Mauro
fuente
podríamos combinarlo con la respuesta de @Alisson Alvarenga y usar overflow-y: heredar;
duodvk
23

Es mejor usar overflow-y: desplácese y elimine el relleno del cuerpo, bootstrap modal agregó relleno al cuerpo de la página.

.modal-open {
  overflow:hidden;
  overflow-y:scroll;
  padding-right:0 !important;
}

Compatible con el navegador IE: el navegador IE hace lo mismo de forma predeterminada.

Super modelo
fuente
1
Gracias. Además, si la ventana emergente modal necesita desplazarse y el padre necesita permanecer quieto .modal-body {max-height: calc (100vh - 210px); desbordamiento-y: automático; } .modal-open {desbordamiento: oculto; overflow-y: desplazamiento; padding-right: 0! important; }
Oracular Man
9

¡Gracias a Dios me encontré con esta publicación! Me estaba tirando de los pelos tratando de averiguar cómo recuperar mis barras de desplazamiento al cerrar la ventana usando mi propio vínculo cercano. Probé las sugerencias para CSS pero simplemente no funcionaba correctamente. Despues de leer

class modal-open se agrega al cuerpo HTML cuando muestra el modal, y se elimina cuando lo oculta. - @flup

Se me ocurrió una solución usando jquery, así que en caso de que alguien más tenga el mismo problema y las sugerencias anteriores no funcionen -

<script>
            jQuery(document).ready(function () {
jQuery('.closeit').click(function () {
 jQuery('body').removeClass('modal-open');
                });
            });
        </script>
Rico
fuente
Tuve un problema en el que estaba anulando el evento hide.bs.modal para poder ejecutar un código personalizado cuando el modal estaba oculto, pero lo que no me di cuenta es que impidió que la clase modal-open se eliminara del cuerpo: por lo tanto, mi barra de desplazamiento no volvió al cerrar este modal específico. No estoy eliminando la clase modal-open manualmente en mi código hide.bs.modal y soluciona ese problema.
Jim
1
Solo debe agregar un data-dismiss="modal"atributo a su enlace en lugar de hacer algo personalizado como esto. Bootstrap realizará todas las acciones de cierre apropiadas cuando se haga clic en ese enlace.
nollidge
1
data-dispats = "modal" no funciona en mi caso porque estoy llamando a una función en el controlador angular. La solución jQuery sugerida funciona muy bien para mí.
gianni
5

Estaba jugando con esta 'característica' de los modales de Bootstrap. Parece que la .modalclase tiene overflow-y:auto;Entonces, el contenedor modal obtiene su propia barra de desplazamiento cuando el modal en sí se vuelve alto.

Si siempre desea una barra de desplazamiento (los diseñadores suelen hacerlo), primero configure el cuerpo

body {
    overflow-y:scroll;
}

Entonces maneja .modal-open

.modal-open .modal {
    overflow-y:scroll; /* Force a navbar on .modal */
}

.modal-open .topnavbar-wrapper {
    padding-right:17px; /* Noticed that right aligned navbar content got overlapped by the .modal scrollbar */
}

Deje la barra de desplazamiento deshabilitada en el cuerpo sin tocar en este caso

Todas las demás respuestas en esta página hicieron que mi contenido saltara.

¡Aviso!

Aunque esta solución me funcionó todo el tiempo, ayer tuve un problema al usar esta solución cuando el modal se puede arrastrar y es demasiado grande para ajustarse a la pantalla (verticalmente). ¿Podría tener algo que ver con los position:stickyelementos que agregué?

Brainfeeder
fuente
Cuando agregué body {overflow-y: scroll;}, mi problema se resolvió. Gracias Señor.
FrenkyB
1

Mejor si crea su propio archivo css para personalizar cierta parte de su bootsrap.

No modifique el archivo css de bootstrap porque cambiará todo en su bootstrap una vez que lo use en otras partes de su página.

Si su página es algo larga, automáticamente proporcionará una barra de desplazamiento. Y cuando se abra el modal, ocultará la barra de desplazamiento porque eso es lo que hace bootstrap por defecto.

Para evitar ocultarlo cuando se abre modal, simplemente anótelo colocando el código css (a continuación) en su propio archivo css.

.modal-open {
    overflow: scroll;
}

solo al revés ...

.modal-open {
    overflow: hidden;
}
NormanCabilatazan
fuente
3
Esto parece contener la misma información que la otra respuesta a esta pregunta. Si su respuesta es diferente, edítela para aclarar qué es exactamente diferente. Solo agregue una nueva respuesta si tiene algo nuevo.
Jeffrey Bosboom
1
Contiene la misma respuesta pero tiene otra forma de explicarla. A veces, la comprensión depende de cómo se explique.
NormanCabilatazan
1
No todos los lectores pueden tener la misma idea. Mejor darles otra forma de explicarlo para que lo entiendan con claridad.
NormanCabilatazan
1

Además, si la ventana emergente modal necesita desplazarse con contenido dentro y el padre necesita permanecer quieto, agregue lo siguiente a su Custom.css (anulando css)

.modal-body {
    max-height: calc(100vh - 210px);
    overflow-y: auto;
}
.modal-open {
    overflow: hidden;
    overflow-y: scroll;
    padding-right: 0 !important;
}
Hombre Oracular
fuente
0

el modal de bootstrap agrega un relleno una vez que se abre para que pueda probar este código en su propio css

.modal-open {
    padding: 0 !important;
}
mehdigriche
fuente
0

Esto probablemente se deba a que el primer modal (cuando está cerrado) elimina la clase modal-open del elemento del cuerpo y el segundo no lo agregará de nuevo cuando se active modal-open.

En este caso, usaría event para verificar si el modal se ha cerrado / ocultado por completo y abrir otro

let modal1 = $('.modal1);
let modal2 = $('.modal2);
$modal1.on('hidden.bs.modal', function (e) {
   $modal2.modal('show');
});

Esto esperará hasta que se cierre el primer modal para asegurarse de que el modal-open se elimine del cuerpo y se vuelva a agregar cuando esté abierto.

usuario1508136
fuente
0

Yo solo tuve este problema, y ​​encontrar esta pregunta rápidamente me ayudó a comprender qué estaba causando el comportamiento. Así que gracias.

Sin embargo, encuentro que estas soluciones CSS son un poco poco elegantes. A menos que, es decir, desee específicamente mantener las barras de desplazamiento (aunque no puedo pensar en una razón para eso).

Básicamente, Bootstrap aplica padding-right a ciertos elementos para compensar la eliminación de la barra de desplazamiento.

Por lo tanto, todo lo que necesita hacer es colocar una envoltura adicional con relleno de cero alrededor de su elemento problemático (y mover la clase a la que se dirige).

es decir, cambiar de esto ...

<div class="fixed-top p-1 bg-dark">
    ...this content will move as padding will be modified...
</div>

... a esto...

<div class="fixed-top p-0 bg-dark">
    <div class="p-1">
        ...this content won't move...
    </div>
</div>
Mate
fuente
0

La única respuesta que funcionó para mí es la siguiente:

.modal-open {
  padding-right: 0 !important;
}
html {
  overflow-y: scroll !important;
}
Martijn Hiemstra
fuente