Modal de inicialização aparecendo em segundo plano


576

Eu usei o código do meu modal diretamente no exemplo do Bootstrap e incluí apenas o bootstrap.js (e não o bootstrap-modal.js). No entanto, meu modal está aparecendo sob o desbotamento cinza (pano de fundo) e não é editável.

Aqui está o que parece:

oculto modal por trás do pano de fundo

Veja este violino para uma maneira de reproduzir esse problema. A estrutura básica desse código é assim:

<body>
    <p>Lorem ipsum dolor sit amet.</p>    

    <div class="my-module">
        This container contains the modal code.
        <div class="modal fade">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-body">Modal</div>
                </div>
            </div>
        </div>
    </div>
</body>
body {
    padding-top: 50px;
}

.my-module {
    position: fixed;
    top: 0;
    left: 0;
}

Alguma idéia de por que isso é ou o que posso fazer para corrigir isso?


Caso alguém procure algum tempo por tags abertas, etc. tentando descobrir por que isso está acontecendo, para mim foi a extensão do Chrome do Feedly que quebrou meus modais. Desativar a extensão retornou o comportamento ao normal.
— threeve

Em maio, o problema ocorreu no iOS e foi causado por overflow-x: hiddenaplicado ao contêiner do modal.
— Idmean 17/07/2015

1
Criou 3 exemplos em 3 versões. 3.3.1 funciona bem e os outros não. Versão 3.3.1 jsfiddle Versão 3.3.5 jsfiddle Versão 3.3.6 jsfoddle
— Dimitry

1
Criar um relatório de erro com a equipe do Bootstrap parece que este não é realmente um bug, mesmo que tenha funcionado bem no 3.3.1. Você pode ler mais sobre isso no link que eu publiquei.
— precisa

Um post de relevância para qualquer pessoa que esteja

Respostas:


629

Se o contêiner modal tiver uma posição fixa ou relativa ou estiver dentro de um elemento com posição fixa ou relativa, esse comportamento ocorrerá.

Verifique se o contêiner modal e todos os seus elementos pai estão posicionados da maneira padrão para corrigir o problema.

Aqui estão algumas maneiras de fazer isso:

  1. A maneira mais fácil é simplesmente mover a div modal para que fique fora de qualquer elemento com posicionamento especial. Um bom lugar pode estar logo antes da etiqueta do corpo de fechamento </body>.
  2. Como alternativa, você pode remover position:propriedades CSS do modal e de seus ancestrais até que o problema desapareça. No entanto, isso pode mudar a aparência e o funcionamento da página.

24
Boa pegada. FYI, não apenas "fixo", postion do pai "relativa" faz com que esse problema também
— Giang Nguyen

3
@ Muhd, como você garante que todos os seus elementos pai estejam posicionados da maneira padrão?
— Indago

4
Prefira usar a opção um: "basta mover a div modal para que fique fora de qualquer elemento com posicionamento especial". Thx
— mpgn

9
Eu não entendo essa resposta. Os exemplos do Bootstrap mostram uma div modal com um número de classes ao longo da linha de "modal", "modal-fade", etc. Então, como a movimentação do contêiner modal vai mudar alguma coisa, quando .modal define a posição: fixo?
— Carlos Carlos

4
Eu ainda tenho esse problema. Eu o adicionei logo antes </body>e bodynão tem nenhum positionatributo de estilo. Alguma outra ideia?
— Tuan Anh Tran

383

O problema tem a ver com o posicionamento dos contêineres pai. Você pode "mover" facilmente seu modal desses contêineres antes de exibi-lo. Aqui está como fazer isso se você estivesse showusando seu modal usando js:

$('#myModal').appendTo("body").modal('show');

Ou, se você iniciar o modal usando os botões, solte o .modal('show');e faça:

$('#myModal').appendTo("body") 

Isso manterá toda a funcionalidade normal, permitindo que você mostre o modal usando um botão.


12
Use esse manipulador de eventos genérico para tornar o trabalho @leandrotk solução para todos os modais você pode ter em uma página $('.modal-dialog').parent().on('show.bs.modal', function(e){ $(e.relatedTarget.attributes['data-target'].value).appendTo('body'); })
— Patrick M.

2
@PatrickM. Surpreendente! que funcionou como um encanto em um projeto antigo que estou assumindo e eles tinham modais em todo o lugar!
— Denislexic

5
Isso funciona muito bem quando você realmente não pode corrigir o posicionamento do CSS. Obrigado :)
— alexcasalboni

Existe uma razão pela qual perco toda a formatação CSS ao fazer isso? E uma solução fácil? :-)
— Eugene van der Merwe,

1
Na resposta leandrotk, altere #myModal para .modal para ficar assim: $ ('. Modal'). AppendTo ("body"). Isso funcionará com todos os modais, pois eles têm um modal de classe padrão.
— Ngatia Frankline

170

Eu tentei todas as opções fornecidas acima, mas não consegui usá-las.

O que funcionou: definindo o índice z do .modal-backdrop como -1.

.modal-backdrop {
  z-index: -1;
}

10
Isso funcionou perfeitamente e é de longe a solução mais fácil. Eu useiz-index: 0;
— andrewcockerham

Também pode confirmar que apenas essas opções funcionam! Obrigado!
— Ferry Kranenburg

Obrigado! Isso é um bug no BS3?
— mauriblint

1
Isso não funciona se você estiver usando um tema que tenha muitos índices z variáveis. Por exemplo, definir o pano de fundo para -1fazer com que apareça atrás de outros elementos na página, como painéis. Mas configurá-lo para 3torná-lo acima de tudo, exceto o pop-up modal.
— Justin Skiles

1
Descobri que esse também era o método mais rápido depois de esgotar as sugestões nas respostas classificadas acima. No meu caso, definir o div com a classe modal-dialog para um índice z de 1060 apareceu na frente da sobreposição. Se você usar a barra de navegação que você vai querer mover o modal acima da sobreposição e não o contrário, caso contrário a sua barra de navegação pode aparecer no topo dos insues sobreposição ... caos ...
— Mike Devenney

152

Além disso, verifique se a versão do BootStrap css e js são as mesmas. Versões diferentes também podem fazer com que o modal apareça em segundo plano:

Por exemplo:

Ruim:

<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>

Boa:

<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>

Também foi para mim. Obrigado!
— PedroTanaka

Só tive o mesmo problema, a mesma solução de folha de estilo de versão parece ter ajudado a todos! Obrigado
— HGB

Obrigado, este foi o meu problema exato
— Malcor

Malcor sem problemas, passei muito tempo enquanto descobri esse bug. Como vemos que foi em '14, agora é '16, ainda existem erros. Na verdade, este não é um bug, mas na inicialização autores devem adicionar isso em sua documentação ou algo ..
— Sid

O mesmo acordo aqui, mudamos para gerar nosso SASS e esquecemos completamente o próprio arquivo js .. Essa precisa ser a resposta principal. Como nosso modal é sempre incluído por padrão antes do tag de fechamento do corpo ...
— Irritado 84

116

Eu também encontrei esse problema e nenhuma das soluções funcionou para mim até que eu descobri que realmente não preciso de um pano de fundo. Você pode remover facilmente o pano de fundo com o código a seguir.

<div class="modal fade" id="createModal" data-backdrop="false">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4>Create Project</h4>
            </div>
            <div class="modal-body">Not yet made</div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            </div>
        </div>
    </div>
</div>

Nota : o data-backdropatributo precisa ser definido como false( outras opções : staticou true).


2
De longe, a solução mais fácil e funciona como um encanto!
— learning_to_swim

Brilhante! Eu também precisava exigir o bootstrap - não sei por que todas as minhas outras funcionalidades do Bootstrap funcionam bem, mas precisava fazer o trabalho modal.
— Steve Klein

Perfeito !!! lutou por um dia .. e você salvou meu outro dia. Mais uma vez obrigado .. +1 e felicidades
— Bhaskara 28/04

1
Depois de ler cuidadosamente todas as soluções, achei a mais sensata na versão de hoje do bootstrap e do jQuery. Obrigado.
— Criptografia

3
Obrigado! Esta pergunta tem mais de 140k de visualizações e não entendo por que o bootstrap não pode corrigir isso. oh bem, saúde.
— Chad

58

Consegui fazê-lo, atribuindo um alto valor de índice-z à janela modal APÓS abri-la. Por exemplo:

$("#myModal").modal("show");
$("#myModal").css("z-index", "1500");

Está funcionando (o homem diz que está), por que você baixa o voto? Como eu estou olhando, parece que vai.
— Rolice

Sim, alguém pode explicar por que essa é uma resposta ruim? É só que é meio hacky?
— brandones

6
Eu não entendo os votos negativos. Sim, é hacky, mas as outras soluções não funcionaram para mim, então pensei em contribuir com as pessoas que não se importam em usar soluções "hacky" para fazer com que a maldita coisa funcione.
— Andrew Dyster

Este foi um insight relevante para meu problema específico, colocando um modal sobre um elemento de tela cheia. +1
— Jack Stone

3
É uma resposta ruim porque é um hack e não faz nenhuma tentativa de indicar isso. Outras respostas dizem: "se nada mais funcionar, você poderia ...". A realidade é que o modal é amplamente utilizado na Web e deve funcionar se implementado corretamente. As respostas Hacky não ajudam as pessoas a descobrir como fazer as coisas da maneira correta.
— Lukos

35

A solução fornecida pela @Muhd é a melhor maneira de fazê-lo. Mas se você estiver preso em uma situação em que alterar a estrutura da página não é uma opção, use este truque:

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="false" style="background-color: rgba(0, 0, 0, 0.5);">
<div class="modal-dialog" role="document">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"
                aria-label="Close">
                <span aria-hidden="true">&times;</span>
            </button>
            <h4 class="modal-title" id="myModalLabel">Modal title</h4>
        </div>
        <div class="modal-body">...</div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-primary">Save changes</button>
        </div>
    </div>
</div>

O truque aqui é data-backdrop="false" style="background-color: rgba(0, 0, 0, 0.5);" remover o pano de fundo padrão e criar um modelo fictício, definindo a cor de fundo da caixa de diálogo com algum alfa.

Atualização 1: Como apontado por @Gustyn, clicar no plano de fundo não fecha a caixa de diálogo conforme o esperado. Então, para conseguir isso, você precisa adicionar algum código de script java. Aqui está um exemplo de como você pode conseguir isso.

$('.modal').click(function(event){
    $(event.target).modal('hide');
});

Isso funciona, exceto que clicar no plano de fundo não fecha a caixa de diálogo conforme o esperado.
— Gustyn

Krishnendu você é meu herói. Eu vim trabalhar com desgraça e tristeza em mente. Três dias antes da minha apresentação final para enfrentar esse problema, de repente, era estressante, para dizer o mínimo. U meu amigo merece 100000 votos positivos, infelizmente, só posso lhe dar um :) tenha um dia maravilhosamente abençoado.
— DotNetBeginner

Quando eu tento isso, ele não cobre o fundo completo da página - apenas o elemento div que o modal é declarada no.
— Will Sam

Funcionou perfeitamente. Obrigado!
— Gfernandes

Funcionou perfeitamente. Obrigado!
— Mayank Pandeyz 02/05

16

Um pouco tarde, mas aqui está uma solução genérica -

    var checkeventcount = 1,prevTarget;
    $('.modal').on('show.bs.modal', function (e) {
        if(typeof prevTarget == 'undefined' || (checkeventcount==1 && e.target!=prevTarget))
        {  
          prevTarget = e.target;
          checkeventcount++;
          e.preventDefault();
          $(e.target).appendTo('body').modal('show');
        }
        else if(e.target==prevTarget && checkeventcount==2)
        {
          checkeventcount--;
        }
     });

Visite este link - Bootstrap 3 - modal desaparecendo abaixo do pano de fundo ao usar uma barra lateral fixa para obter detalhes.


Esta foi uma solução perfeita para um plug-in do Wordpress que eu estava criando, onde não conseguia controlar os elementos-pai nos temas de outras pessoas.
— Mark Rummel

Melhor solução até agora!
— digz6666

10

Uma outra maneira de abordar isso é remover o z-index do .modal-backdroparquivo bootstrap.css. Isso fará com que o pano de fundo fique no mesmo nível do resto do seu corpo (ainda desaparecerá) e seu modal fique no topo.

.modal-backdrop se parece com isso

.modal-backdrop {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: #000000;
}

10

Basta adicionar duas linhas de CSS:

.modal-backdrop{z-index: 1050;}
.modal{z-index: 1060;}

O .modal-backdrop deve ter um valor de 1050 para configurá-lo na barra de navegação.


Bom, mas se o contêiner dos modais tiver position: fixedisso não funcionará.
— CPHPython 24/05

10

Isso cobriria todos os modais sem atrapalhar nenhuma das animações ou comportamento esperado.

$(document).on('show.bs.modal', '.modal', function () {
  $(this).appendTo('body');
});

1
solução global. no entanto, é melhor encontrar o problema.
— Milad Abooali

Não acho que seja uma ótima solução, e as páginas com muitos modais? Pode ficar bagunçado.
— Glen

Você pode explicar como ficaria bagunçado? Tudo o que está fazendo é mover o modal de onde ele está atualmente no DOM para o final da tag do corpo. Não está criando nada que ainda não esteja lá, apenas movendo-o e automaticamente fornecendo o índice z superior.
— Cam Tullos

Melhor solução, eu acho. não há necessidade de editar qualquer css e mudança aparência modal
— Moslem7026

8

Acabei de definir:

#myModal {
    z-index: 1500;
}

e funciona ....

Para a pergunta original:

.my-module {
    z-index: 1500;
}

Meu problema também foi o z-index.
— James Bloqueio


8

Esse problema geralmente pode ser observado ao usar coisas como gradientes no CSS para coisas como planos de fundo ou até mesmo cabeçalhos de acordeão.

Infelizmente, modificar ou substituir o CSS principal do Bootstrap é indesejável e pode levar a efeitos colaterais indesejados. A abordagem menos invasiva é adicionardata-backdrop="false" mas você pode perceber que o efeito de desbotamento não funciona mais como o esperado.

Depois de seguir os lançamentos recentes do Bootstrap, a versão 3.3.5 parece resolver esse problema sem efeitos colaterais indesejados.

Baixar: https://github.com/twbs/bootstrap/releases/download/v3.3.5/bootstrap-3.3.5-dist.zip

Certifique-se de incluir os arquivos CSS e JavaScript da 3.3.5.


6

Oi Eu tive o mesmo problema, então percebo que quando você usa o bootsrap 3.1 Ao contrário das versões mais antigas do bootsrap (2.3.2), a estrutura html do modal foi alterada!

você deve agrupar o corpo e o rodapé do cabeçalho modal com diálogo modal e conteúdo modal

<div class="modal hide fade">

  <div class="modal-dialog">
    <div class="modal-content">

    **here goes the modal header body and footer**

    </div>
  </div>

 </div>

+1 verifique se você está usando versões compatíveis do bootstrap.css e bootstrap.js e se sua marcação corresponde à versão que você está usando.
— srayner

Sim, esta foi a minha conclusão e eu a escrevi aqui apenas se alguém tivesse esse problema.
— talsibony

Jesus Cristo, esta resposta está enterrada profundamente. O mesmo caso para o Bootstrap 4.
— Randell

6

nenhuma das soluções sugeridas acima funcionou para mim, mas essa técnica resolveu o problema:

$('#myModal').on('shown.bs.modal', function() {
   //To relate the z-index make sure backdrop and modal are siblings
   $(this).before($('.modal-backdrop'));
   //Now set z-index of modal greater than backdrop
   $(this).css("z-index", parseInt($('.modal-backdrop').css('z-index')) + 1);
}); 

Prefiro assim porque perdi a formatação CSS com os outros métodos.
— Eugene van der Merwe 23/02

6

Eu tive esse problema e a maneira mais fácil de corrigi-lo era o índice z addind maior que 1040 na div de diálogo modal:

<div class="modal-dialog" style="z-index: 1100;">

Acredito que o bootstrap crie um desbotamento de cenário modal div no qual, no meu caso, tenha o z-index 1040, por isso, se você colocar a caixa de diálogo modal em cima disso, ele não ficará mais cinza.


6

Eu tenho uma solução mais leve e melhor ..

Pode ser facilmente resolvido através de alguns estilos CSS adicionais.

  1. ocultar a classe .modal-backdrop(gerada automaticamente a partir do Bootstrap.js)

    .modal-backdrop
    {
    display:none;
    visibility:hidden; 
    position:relative
    }
  2. defina o plano de fundo .modalpara uma imagem de fundo preto translúcido.

    .modal
    {
    background:url("http://bin.smwcentral.net/u/11361/BlackTransparentBackground.png")
    // translucent image from google images 
    z-index:1100; 
    }

Isso funcionará melhor se você tiver um requisito que precise que o modal esteja dentro de um elemento e não próximo à </body>tag.


Você salvou o meu dia ... Esta é uma boa alternativa!
— Notme

@xunga, não se preocupe. por favor, compartilhe esta solução para outras pessoas :)
— JM Tee

você pode visualizar as edições aqui ... stackoverflow.com/posts/42887253/revisions
— notme

Obrigado JM, sua solução foi a única que funcionou para mim.
— Ahmed J.

5

defina o .modal do z-index para um valor mais alto

Por exemplo, .sidebarwrapper possui um índice z de 1100, portanto, defina o índice z de .modal como 1101

.modal {
    z-index: 1101;
}

5

No meu caso, resolva-o, adicione isso na minha folha de estilo:

.modal-backdrop{
  z-index:0;
}

com o depurador do google, pode examinar o elemento BACKDROP E modificar atributos. Boa sorte.


3

na sua barra de navegação navbar-fixed-topprecisa z-index = 1041 e também se você usar bootstarp-combined.min.cssa alteração também .navbar-fixed-top, .navbar-fixed-bottom z-index to 1041


3

Mude a posição absoluta para relativa.

.modal-backdrop {
    position: relative;
    /* ... */
}

1
ele remove o fundo preto
— HCarrasko

3

Você também pode remover o z-index do .modal-backdrop. CSS resultante seria assim.

.modal-backdrop {
}
  .modal-backdrop.in {
    opacity: .35;
    filter: alpha(opacity=35); }

3

Eu removi o pano de fundo modal.

.modal-backdrop {
    display:none;
}

Esta não é a melhor solução, mas funciona para mim.


3

o que eu acho é que:

no bootstrap 3.3.0 não está certo, mas quando no bootstrap 3.3.5 está certo. vamos ver o código. 3.3.0:

this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
    .prependTo(this.$element)

3.3.5

  this.$backdrop = $(document.createElement('div'))
        .addClass('modal-backdrop ' + animate)
        .appendTo(this.$body)

3

Adicione este às suas páginas. Isso funciona para mim.

<script type="text/javascript">
    $('.modal').parent().on('show.bs.modal', function (e) { $(e.relatedTarget.attributes['data-target'].value).appendTo('body'); })
</script>

3

Foi corrigido isso adicionando o estilo abaixo à tag DIV

style="background-color: rgba(0, 0, 0, 0.5);"

E adicione CSS personalizado

.modal-backdrop {position: relative;}


3

Para mim, a solução mais fácil foi colocar meu modal em um invólucro com posição absoluta e índice z maior que o .modal-backdrop. Como o modal-backdrop (pelo menos no meu caso) tem o z-index 1050:

.my-modal-wrapper {
  position: absolute;
  z-index: 1060;
}
<div class="my-modal-wrapper"></div>


O z-index funcionou para mim. Muito obrigado.
— Asif Iqbal

2

No meu caso, eu tinha um wrapper com o seguinte:

.wrapper { margin: 0 auto; position:relative; z-index:1;overflow:hidden;}

Somente removeu o z-index: 1 e não tenho idéia do porquê do problema. também com certeza remover a posição relativa, mas eu precisava.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.