Eu preciso que a sobreposição seja exibida acima do primeiro modal, não na parte de trás.
Eu tentei mudar o z-index
de .modal-backdrop
, mas isso se torna uma bagunça.
Em alguns casos, tenho mais de dois modais na mesma página.
fonte
Eu preciso que a sobreposição seja exibida acima do primeiro modal, não na parte de trás.
Eu tentei mudar o z-index
de .modal-backdrop
, mas isso se torna uma bagunça.
Em alguns casos, tenho mais de dois modais na mesma página.
Depois de ver muitas correções para isso, e nenhuma delas era exatamente o que eu precisava, encontrei uma solução ainda mais curta, inspirada em @YermoLamers e @Ketwaroo.
Correção do índice z do pano de fundo
Esta solução usa um setTimeout
porque .modal-backdrop
não é criado quando o evento show.bs.modal
é disparado.
$(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
criados na página (mesmo modais dinâmicos)Se você não gostar do z-index codificado por algum motivo, poderá calcular o z-index mais alto na página como este:
var zIndex = Math.max.apply(null, Array.prototype.map.call(document.querySelectorAll('*'), function(el) {
return +el.style.zIndex;
})) + 10;
Correção da barra de rolagem
Se você possui um modal em sua página que excede a altura do navegador, não é possível rolar nele ao fechar um segundo modal. Para corrigir este add:
$(document).on('hidden.bs.modal', '.modal', function () {
$('.modal:visible').length && $(document.body).addClass('modal-open');
});
Versões
Esta solução foi testada com o bootstrap 3.1.0 - 3.3.5
.not(this)
para a segunda linha) para fazê-lo funcionar com datepicker de bootstrapvar zIndex = 1040 + (10 * $('.modal:visible').not(this).length);
Sei que uma resposta foi aceita, mas sugiro fortemente que não hackear o bootstrap para corrigir isso.
Você pode obter facilmente o mesmo efeito conectando os manipuladores de eventos mostrado.bs.modal e hidden.bs.modal e ajustando o índice z lá.
Aqui está um exemplo de trabalho
Um pouco mais de informação está disponível aqui.
Esta solução funciona automaticamente com pilhas arbitrariamente profundamente modais.
O código fonte do script:
fonte
Uma versão mais curta, baseada na sugestão de Yermo Lamers, parece funcionar bem. Mesmo com animações básicas, como o fade in / out e até o louco jornal do batman giram. http://jsfiddle.net/ketwaroo/mXy3E/
fonte
modal-open
classe no elemento body: jsfiddle.net/vkyjocynCombinando a resposta de A1rPun com a sugestão de StriplingWarrior, eu vim com isso:
Funciona mesmo para modais dinâmicos adicionados após o fato e remove o problema da segunda barra de rolagem. A coisa mais notável para a qual achei útil foi a integração de formulários dentro de modais com feedback de validação dos alertas do Bootbox, pois eles usam modais dinâmicos e, portanto, exigem que você vincule o evento ao documento em vez de ao .modal, já que isso apenas o anexa aos existentes. modais.
Violino aqui.
fonte
Eu criei um plugin Bootstrap que incorpora muitas das idéias postadas aqui.
Demonstração no Bootply: http://www.bootply.com/cObcYInvpq
Github: https://github.com/jhaygt/bootstrap-multimodal
Ele também soluciona o problema com modais sucessivos, tornando o cenário cada vez mais escuro. Isso garante que apenas um pano de fundo seja visível a qualquer momento:
O índice z do pano de fundo visível é atualizado nos eventos
show.bs.modal
ehidden.bs.modal
:fonte
Ao resolver os Modais de empilhamento, rola a página principal quando um é fechado, descobri que as versões mais recentes do Bootstrap (pelo menos desde a versão 3.0.3) não exigem código adicional para empilhar os modais.
Você pode adicionar mais de um modal (obviamente, com um ID diferente) à sua página. O único problema encontrado ao abrir mais de um modal será que ao fechar um, remova o
modal-open
classe do seletor de corpo.Você pode usar o seguinte código Javascript para adicionar novamente
modal-open
:No caso de não precisar do efeito de pano de fundo para o modal empilhado, você pode definir
data-backdrop="false"
.Versão 3.1.1. fixo Corrigir o cenário modal sobrepondo a barra de rolagem do modal , mas a solução acima também parece funcionar com versões anteriores.
fonte
Finalmente resolvido. Eu testei de várias maneiras e funciona bem.
Aqui está a solução para qualquer pessoa que tenha o mesmo problema: Altere a função Modal.prototype.show (em bootstrap.js ou modal.js)
DE:
PARA:
É a melhor maneira que encontrei: verifique quantos modais estão abertos e altere o índice z do modal e o pano de fundo para um valor mais alto.
fonte
Se você está procurando a solução Bootstrap 4, é fácil usar CSS puro:
fonte
Tente adicionar o seguinte ao seu JS no bootply
Explicação:
Depois de brincar com os atributos (usando a ferramenta de desenvolvimento do Chrome), percebi que qualquer
z-index
valor abaixo1031
colocará as coisas por trás do pano de fundo.Então, usando alças de eventos modais de Bootstrap eu definir o
z-index
que1030
. Se#myModal2
for mostrado ez-index
volte para1040
se#myModal2
estiver oculto.Demo
fonte
Sempre que você executa a função sys.showModal, incremente o índice z e defina-o como seu novo modal.
fonte
A solução para isso foi NÃO usar a classe "fade" nos meus divs modais.
fonte
Nenhuma solução de script, usando apenas css, pois você tem duas camadas de modais, defina o segundo modal para um índice z mais alto
fonte
Se você deseja que um modal específico apareça sobre outro modal aberto, tente adicionar o HTML do modal mais alto após o outro modal
div
.Isso funcionou para mim:
fonte
Minha solução para o bootstrap 4, trabalhando com profundidade ilimitada de modais e modal dinâmico.
fonte
Cada modal deve receber um ID diferente e cada link deve ser direcionado para um ID modal diferente. Portanto, deve ser algo assim:
fonte
EDIT: O Bootstrap 3.3.4 resolveu esse problema (e outros problemas modais), portanto, se você puder atualizar o CSS e o JS do bootstrap, essa seria a melhor solução. Se você não conseguir atualizar a solução abaixo, ainda funcionará e essencialmente fará o mesmo que o bootstrap 3.3.4 (recalcular e aplicar preenchimento).
Como apontou Bass Jobsen, as versões mais recentes do Bootstrap têm o índice z resolvido. A classe modal-open e padding-right ainda eram problemas para mim, mas esse script inspirado na solução Yermo Lamers resolve isso. Basta soltá-lo no seu arquivo JS e aproveitar.
fonte
Veja isso! Esta solução resolveu o problema para mim, algumas linhas CSS simples:
Aqui está um link para onde eu o encontrei: Bootply Apenas verifique se o .modual que precisa aparecer no Top é o segundo no código HTML, para que o CSS possa encontrá-lo como "par".
fonte
trabalhar para abrir / fechar multi-modais
Demo
https://www.bootply.com/cObcYInvpq#
fonte
Para mim, essas regras simples do scss funcionaram perfeitamente:
Se essas regras fizerem com que o modal errado esteja no topo no seu caso, altere a ordem dos seus divs modais ou altere (ímpar) para (par) no scss acima.
fonte
Aqui estão algumas CSS usando
nth-of-type
seletores que parecem funcionar:Bootply: http://bootply.com/86973
fonte
Eu tive um cenário semelhante e, depois de um pouco de pesquisa e desenvolvimento, encontrei uma solução. Embora eu não seja muito bom em JS, consegui escrever uma pequena consulta.
http://jsfiddle.net/Sherbrow/ThLYb/
fonte
Adicionar variável global no modal.js
// mostra a função dentro da variável add - Modal.prototype.backdrop
fonte
As outras soluções não funcionaram para mim imediatamente. Acho que talvez porque esteja usando uma versão mais recente do Bootstrap (3.3.2) .... a sobreposição estava aparecendo na parte superior da caixa de diálogo modal.
Refatorei um pouco o código e comentei a parte que estava ajustando o cenário modal. Isso corrigiu o problema.
Como observação, se você quiser usar isso no AngularJs, basta colocar o código dentro do método .run () do seu módulo.
fonte
Infelizmente, não tenho reputação de comentar, mas deve-se observar que a solução aceita com a linha de base codificada de um índice z 1040 parece ser superior ao cálculo do zIndex que tenta encontrar o máximo de zIndex sendo processado na página.
Parece que determinadas extensões / plugins dependem do conteúdo DOM de nível superior, o que torna o cálculo .Max um número tão obscenamente grande que não pode mais incrementar o zIndex. Isso resulta em um modal em que a sobreposição aparece incorretamente sobre o modal (se você usar as ferramentas Firebug / Google Inspector, verá um zIndex na ordem de 2 ^ n - 1)
Não consegui isolar o motivo específico pelas quais as várias formas do Math.Max for z-Index levam a esse cenário, mas isso pode acontecer e parecerá exclusivo para alguns usuários. (Meus testes gerais no browserstack tinham esse código funcionando perfeitamente).
Espero que isso ajude alguém.
fonte
No meu caso, o problema foi causado por uma extensão do navegador que inclui os arquivos bootstrap.js, nos quais o evento show manipulado duas vezes e duas
modal-backdrop
divs são adicionadas, mas ao fechar o modal, apenas um deles é removido.Constatou que, adicionando um ponto de interrupção de modificação de subárvore ao elemento body no chrome, e rastreava a adição dos
modal-backdrop
divs.fonte
fonte
Atualização: 22.01.2019, 13.41 Otimizei a solução com jhay, que também suporta o fechamento e a abertura de diálogos iguais ou diferentes ao, por exemplo, passar de um dado detalhado para outro para frente ou para trás.
fonte
Verifique a contagem de modais e adicione o valor ao pano de fundo como z-index
fonte