Necesito que la superposición se muestre arriba del primer modal, no en la parte posterior.
Traté de cambiar el z-index
de .modal-backdrop
, pero se convierte en un desastre.
En algunos casos tengo más de dos modales en la misma página.
fuente
Necesito que la superposición se muestre arriba del primer modal, no en la parte posterior.
Traté de cambiar el z-index
de .modal-backdrop
, pero se convierte en un desastre.
En algunos casos tengo más de dos modales en la misma página.
Después de ver muchas soluciones para esto, y ninguna de ellas era exactamente lo que necesitaba, se me ocurrió una solución aún más corta inspirada en @YermoLamers y @Ketwaroo.
Corrección del índice z de fondo
Esta solución utiliza un setTimeout
porque .modal-backdrop
no se crea cuando show.bs.modal
se desencadena el evento .
$(document).on('show.bs.modal', '.modal', function () {
var zIndex = 1040 + (10 * $('.modal:visible').length);
$(this).css('z-index', zIndex);
setTimeout(function() {
$('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');
}, 0);
});
.modal
creado en la página (incluso modales dinámicos)Si por algún motivo no le gusta el índice z codificado, puede calcular el índice z más alto en la página de esta manera:
var zIndex = Math.max.apply(null, Array.prototype.map.call(document.querySelectorAll('*'), function(el) {
return +el.style.zIndex;
})) + 10;
Corrección de la barra de desplazamiento
Si tiene un modal en su página que excede la altura del navegador, entonces no puede desplazarse al cerrar un segundo modal. Para arreglar esto agregue:
$(document).on('hidden.bs.modal', '.modal', function () {
$('.modal:visible').length && $(document.body).addClass('modal-open');
});
Versiones
Esta solución se prueba con bootstrap 3.1.0 - 3.3.5
.not(this)
a la segunda línea) para que funcionara con bootstrap datepickervar zIndex = 1040 + (10 * $('.modal:visible').not(this).length);
Me doy cuenta de que se ha aceptado una respuesta, pero sugiero no hackear bootstrap para solucionar esto.
Puede lograr fácilmente el mismo efecto conectando los controladores de eventos shown.bs.modal y hidden.bs.modal y ajustando el índice z allí.
Aquí hay un ejemplo de trabajo
Un poco más de información está disponible aquí.
Esta solución funciona automáticamente con pilas de moda arbitrariamente profundas.
El código fuente del script:
fuente
Algo más corto basado en la sugerencia de Yermo Lamers, esto parece funcionar bien. Incluso con animaciones básicas como fundido de entrada / salida e incluso el loco periódico de Batman gira. http://jsfiddle.net/ketwaroo/mXy3E/
fuente
modal-open
clase en el elemento del cuerpo: jsfiddle.net/vkyjocynCombinando la respuesta de A1rPun con la sugerencia de StriplingWarrior, se me ocurrió esto:
Funciona incluso para modales dinámicos agregados después del hecho, y elimina el problema de la segunda barra de desplazamiento. Lo más notable para lo que me pareció útil fue integrar formularios dentro de modales con comentarios de validación de las alertas de Bootbox, ya que usan modales dinámicos y, por lo tanto, requieren que enlace el evento para documentar en lugar de .modal, ya que eso solo lo adjunta a los existentes modales.
Violín aquí.
fuente
Creé un complemento Bootstrap que incorpora muchas de las ideas publicadas aquí.
Demostración en Bootply: http://www.bootply.com/cObcYInvpq
Github: https://github.com/jhaygt/bootstrap-multimodal
También aborda el problema con modales sucesivos que hacen que el telón de fondo se vuelva más y más oscuro. Esto asegura que solo un fondo sea visible en un momento dado:
El índice z del fondo visible se actualiza en los eventos
show.bs.modal
yhidden.bs.modal
:fuente
Al resolver el apilamiento de modales se desplaza por la página principal cuando uno está cerrado, descubrí que las versiones más nuevas de Bootstrap (al menos desde la versión 3.0.3) no requieren ningún código adicional para apilar modales.
Puede agregar más de un modal (por supuesto, tener una ID diferente) a su página. El único problema que se encuentra al abrir más de un modal será que al cerrar uno elimine el
modal-open
clase para el selector de cuerpo.Puede usar el siguiente código Javascript para volver a agregar el
modal-open
:En el caso de que no necesite el efecto de fondo para el modal apilado, puede configurar
data-backdrop="false"
.Versión 3.1.1. arreglado Fijar el fondo modal superpuesto a la barra de desplazamiento del modal , pero la solución anterior también parece funcionar con versiones anteriores.
fuente
Finalmente resuelto. Lo probé de muchas maneras y funciona bien.
Aquí está la solución para cualquiera que tenga el mismo problema: Cambie la función Modal.prototype.show (en bootstrap.js o modal.js)
DE:
A:
Es la mejor manera que encontré: compruebe cuántos modales se abren y cambie el índice z del modal y el fondo a un valor más alto.
fuente
Si está buscando la solución Bootstrap 4, hay una fácil usando CSS puro:
fuente
Intente agregar lo siguiente a su JS en bootply
Explicación:
Después de jugar con los atributos (usando la herramienta de desarrollo de Chrome), me di cuenta de que cualquier
z-index
valor a continuación1031
pondrá las cosas detrás del telón de fondo.Entonces, al usar los controladores de eventos modales de bootstrap, configuro el
z-index
a1030
. Si#myModal2
se muestra y establece la partez-index
posterior en1040
si#myModal2
está oculto.Manifestación
fuente
Cada vez que ejecuta la función sys.showModal, incremente el índice z y configúrelo en su nuevo modal.
fuente
La solución a esto para mí fue NO usar la clase "fade" en mis divs modales.
fuente
Sin soluciones de script, usando solo css dado que tiene dos capas de modales, establezca el segundo modal en un índice z más alto
fuente
Si desea que aparezca un modal específico encima de otro modal abierto, intente agregar el HTML del modal superior después del otro modal
div
.Esto funcionó para mí:
fuente
Mi solución para bootstrap 4, trabajando con una profundidad ilimitada de modales y modal dinámico.
fuente
Cada modal debe tener una identificación diferente y cada enlace debe estar dirigido a una identificación modal diferente. Entonces debería ser algo así:
fuente
EDITAR: Bootstrap 3.3.4 ha resuelto este problema (y otros problemas modales), por lo que si puede actualizar su CSS y JS de arranque, esa sería la mejor solución. Si no puede actualizar la solución a continuación, seguirá funcionando y esencialmente hace lo mismo que bootstrap 3.3.4 (recalcular y aplicar relleno).
Como Bass Jobsen señaló, las versiones más nuevas de Bootstrap tienen resuelto el índice z. La clase modal-open y el relleno derecho seguían siendo problemas para mí, pero este script inspirado en la solución de Yermo Lamers lo resuelve. Simplemente colóquelo en su archivo JS y disfrute.
fuente
¡Mira esto! Esta solución resolvió el problema para mí, algunas líneas simples de CSS:
Aquí hay un enlace a donde lo encontré: Bootply Solo asegúrese de que el .modual que necesita aparecer en la parte superior sea el segundo en el código HTML, para que CSS pueda encontrarlo como "par".
fuente
trabajar para abrir / cerrar multi modales
Manifestación
https://www.bootply.com/cObcYInvpq#
fuente
Para mí, estas simples reglas de scss funcionaron perfectamente:
Si estas reglas hacen que el modal incorrecto esté en la parte superior de su caso, cambie el orden de sus divisiones modales o cambie (impar) a (par) en el scss anterior.
fuente
Aquí hay algunos CSS que usan
nth-of-type
selectores que parecen funcionar:Bootply: http://bootply.com/86973
fuente
Tuve un escenario similar, y después de un poco de I + D encontré una solución. Aunque no soy bueno en JS, aun así he logrado escribir una pequeña consulta.
http://jsfiddle.net/Sherbrow/ThLYb/
fuente
Agregar variable global en modal.js
// show function inside add variable - Modal.prototype.backdrop
fuente
Las otras soluciones no funcionaron para mí fuera de la caja. Creo que quizás porque estoy usando una versión más reciente de Bootstrap (3.3.2) ... la superposición aparecía en la parte superior del diálogo modal.
Reformé un poco el código y comenté la parte que estaba ajustando el fondo modal. Esto solucionó el problema.
Como nota al margen, si desea usar esto en AngularJs, simplemente coloque el código dentro del método .run () de su módulo.
fuente
Desafortunadamente, no tengo la reputación de comentar, pero debe tenerse en cuenta que la solución aceptada con la línea de base codificada de un índice z 1040 parece ser superior al cálculo de zIndex que intenta encontrar el zIndex máximo que se representa en la página.
Parece que ciertas extensiones / complementos se basan en contenido DOM de nivel superior, lo que hace que el cálculo de .Max sea un número tan obscenamente grande que no puede aumentar el zIndex más. Esto da como resultado un modal donde la superposición aparece sobre el modal incorrectamente (si usa las herramientas Firebug / Google Inspector, verá un zIndex del orden de 2 ^ n - 1)
No he podido aislar cuál es la razón específica por la cual las diversas formas de Math.Max for z-Index conducen a este escenario, pero puede suceder y parecerá exclusivo para algunos usuarios. (Mis pruebas generales en browserstack tenían este código funcionando perfectamente).
Espero que esto ayude a alguien.
fuente
En mi caso, el problema fue causado por una extensión del navegador que incluye los archivos bootstrap.js donde el evento show se manejó dos veces y dos
modal-backdrop
se agregaron divs, pero al cerrar el modal solo se elimina uno de ellos.Descubrí que al agregar un punto de interrupción de modificación de subárbol al elemento del cuerpo en Chrome, y seguí agregando los
modal-backdrop
divs.fuente
fuente
Actualización: 22.01.2019, 13.41 Optimicé la solución mediante jhay, que también admite cerrar y abrir diálogos iguales o diferentes cuando, por ejemplo, paso de un detalle a otro hacia adelante o hacia atrás.
fuente
Verifique el recuento de modales y agregue el valor al fondo como índice z
fuente