Como redimensionar o modal Bootstrap do Twitter dinamicamente com base no conteúdo

101

Tenho um banco de dados que contém diversos tipos de dados, como vídeos do Youtube, vídeos do Vimeo, texto, imagens do Imgur, etc. Todos eles têm diferentes alturas e larguras. Tudo o que encontrei ao pesquisar na Internet foi alterar o tamanho para apenas um parâmetro. Tem que ser igual ao conteúdo do pop-up.

Este é o meu código HTML. Eu também uso Ajax para chamar o conteúdo.

<div id="modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3 id="ModalLabel"></h3>
    </div>
    <div class="modal-body">

    </div>
</div> 
Erdem Ece
fonte

Respostas:

112

Como seu conteúdo deve ser dinâmico, você pode definir as propriedades css do modal dinamicamente no showevento do modal, que redimensionará o modal substituindo suas especificações padrão. O motivo de ser bootstrap aplica-se a altura máxima ao corpo modal com a regra css conforme abaixo:

.modal-body {
    position: relative;
    overflow-y: auto;
    max-height: 400px;
    padding: 15px;
}

Portanto, você pode adicionar estilos embutidos dinamicamente usando o cssmétodo jquery :

Para versões mais recentes do uso de bootstrap show.bs.modal

$('#modal').on('show.bs.modal', function () {
       $(this).find('.modal-body').css({
              width:'auto', //probably not needed
              height:'auto', //probably not needed 
              'max-height':'100%'
       });
});

Para versões mais antigas do uso de bootstrap show

$('#modal').on('show', function () {
       $(this).find('.modal-body').css({
              width:'auto', //probably not needed
              height:'auto', //probably not needed 
              'max-height':'100%'
       });
});

ou use uma regra css para substituir:

.autoModal.modal .modal-body{
    max-height: 100%;
}

e adicione esta classe autoModalaos seus modais de destino.

Altere o conteúdo dinamicamente no fiddle, você verá o modal sendo redimensionado de acordo. Demo

A versão mais recente do bootstrap consulte o disponível event names.

  • show.bs.modal Este evento é disparado imediatamente quando o método show instance é chamado. Se causado por um clique, o elemento clicado fica disponível como a propriedade relatedTarget do evento.
  • mostrado.bs.modal Este evento é disparado quando o modal torna -se visível para o usuário (irá aguardar a conclusão das transições CSS). Se causado por um clique, o elemento clicado fica disponível como a propriedade relatedTarget do evento.
  • hide.bs.modal Este evento é disparado imediatamente quando o método de instância ocultar é chamado.
  • hidden.bs.modal Este evento é disparado quando o modal termina de ser escondido do usuário (irá aguardar a conclusão das transições CSS).
  • carregado.bs.modal Este evento é disparado quando o modal carrega o conteúdo usando a opção remota.

Versão mais antiga do bootstrap modal events compatível.

  • Show - Este evento é disparado imediatamente quando o método de instância show é chamado.
  • mostrado - Este evento é disparado quando o modal torna-se visível para o usuário (irá aguardar a conclusão das transições css).
  • hide - Este evento é disparado imediatamente quando o método de instância hide é chamado.
  • oculto - Este evento é disparado quando o modal termina de ser oculto do usuário (irá aguardar a conclusão das transições css).
PSL
fonte
Tive que mudar #modal para o mesmo que .moda-body agora funciona perfeitamente. Muito obrigado!
Erdem Ece
8
@PSL, +1 pela resposta e por me apresentar a kbd no SO.
Rolando Isidoro
parece que o evento show não funciona. funcionou: $('#modal').on('show.bs.modal', function () { getbootstrap.com/javascript/#modals-events
joym8
1 para detalhes e acomodando o antigo e o novo. Agora, se apenas não ocupasse toda a largura da tela e fosse realmente dinâmico em tamanho.
Luminous
@PSL em tempo de execução como pode manipular a largura do modal? Quero dizer torná-lo menor ou maior com JavaScript?
Sredny M Casanova
119

Isso funcionou para mim, nenhuma das opções acima funcionou.

.modal-dialog{
    position: relative;
    display: table; /* This is important */ 
    overflow-y: auto;    
    overflow-x: auto;
    width: auto;
    min-width: 300px;   
}
Amit Shah
fonte
1
@maheshreddy Bem-vindo, não se esqueça de votar +1 se isso ajudar. para que outros possam confiar mais nesta resposta e tentar.
Amit Shah
Ele define dinamicamente a altura, mas desta vez a caixa de diálogo modal é aberta no lado esquerdo da tela. Como corrigi-lo?
Jack,
1
mas isso não está funcionando em uma visualização móvel responsiva. É muito bom trabalhar em telas de laptop.
chetan,
4
Isso funcionou, mas teve o impacto indesejado de o modal não ser mais centralizado verticalmente na página. Não é grande coisa, mas pensei em mencionar algo.
John Allard de
22

Não consegui que a resposta do PSL funcionasse para mim, então descobri que tudo o que tenho a fazer é definir o div que contém o conteúdo modal style="display: table;". O próprio conteúdo modal diz quão grande ele deseja ser e o modal o acomoda.

Luminoso
fonte
5
Também não consegui fazer a resposta do PSL funcionar. (Talvez porque eu estava usando a versão Angular do bootstrap) Isso funcionou para mim. Apenas para observar que este estilo é adicionado na classe .modal-dialog +1
user227353
Apliquei sua solução ao div tendo como classe "modal-content" ,, Funcionou para mim.
Mehdi
10

Há muitas maneiras de fazer isso se você quiser escrever css, então adicione o seguinte

.modal-dialog{
  display: table
}

Caso você queira adicionar inline

<div class="modal-dialog" style="display:table;">
//enter code here
</div>

Não adicione display:table;à classe de conteúdo modal. ele fez seu trabalho, mas preparou seu modal para um tamanho grande, veja as imagens a seguir. a primeira imagem é se você adicionar estilo ao diálogo modal, No caso de você adicionar estilo ao diálogo modal se você adicionar estilo ao conteúdo modal. parece disposto. insira a descrição da imagem aqui

waqas ali
fonte
7

para bootstrap 3 use como

$('#myModal').on('hidden.bs.modal', function () {
// do something…
})
user2678868
fonte
4
Apenas para adicionar a isso, o arquivo hidden.bs.modal será acionado depois que o modal for fechado. Use show.bs.modal para disparar no bootstrap 3 quando o modal for disparado.
d3c0y
Como isso redimensionará o diálogo de alguma forma ou forma? É simplesmente uma função de retorno de chamada que é acionada quando o diálogo modal está oculto (ou mostrado).
user1438038
4

Css simples funciona para mim

.modal-dialog { 
max-width : 100% ;
}
Pascal
fonte
2

Eu simplesmente substituo o css:

.modal-dialog {
    max-width: 1000px;
}
Andrew Gale
fonte
2

definido width:fit-contentno div modal.

Subhashis Pal
fonte
1

Você pode fazer isso se usar o plug-in de diálogo jquery de gijgo.com e definir a largura como automática.

$("#dialog").dialog({
  uiLibrary: 'bootstrap',
  width: 'auto'
});
<html>
<head>
  <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
  <link href="http://code.gijgo.com/1.0.0/css/gijgo.css" rel="stylesheet" type="text/css">
  <script src="http://code.gijgo.com/1.0.0/js/gijgo.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
</head>
<body>
 <div id="dialog" title="Wikipedia">
   <img src="https://upload.wikimedia.org/wikipedia/en/thumb/8/80/Wikipedia-logo-v2.svg/1122px-Wikipedia-logo-v2.svg.png" width="320"/>
 </div>
</body>
</html>

Você também pode permitir que os usuários controlem o tamanho se definir redimensionável como verdadeiro. Você pode ver uma demonstração sobre isso em http://gijgo.com/Dialog/Demos/bootstrap-modal-resizable

Atanas Atanasov
fonte
1

Uma solução CSS simples que centralizará vertical e horizontalmente o modal:

.modal.show {
  display: flex !important;
  justify-content: center;
}

.modal-dialog {
  align-self: center;
}
Kirk Ross
fonte
0

Para Bootstrap 2, ajuste automaticamente a altura do modelo dinamicamente

  //Auto adjust modal height on open 
  $('#modal').on('shown',function(){
     var offset = 0;
     $(this).find('.modal-body').attr('style','max-height:'+($(window).height()-offset)+'px !important;');
  });
SudarP
fonte
0

Eu tive o mesmo problema com o bootstrap 3 e a altura do div do corpo modal não querendo ser maior que 442 px. Este foi todo o css necessário para corrigi-lo no meu caso:

.modal-body {
    overflow-y: auto;
}
Brett Drake
fonte
0

A minha solução foi apenas adicionar o estilo abaixo. <div class="modal-body" style="clear: both;overflow: hidden;">

Furquan
fonte
0

No Bootstrap 4 - tem um estilo de:

@media (min-width: 576px)
.modal-dialog {
    max-width: 500px;
}

então, se você está procurando redimensionar a largura modal para um pouco mais de largura, sugiro usar isso em seu css, por exemplo:

.modal-dialog { max-width: 87vw; }

Observe que a configuração width: 87vw;não substituirá a do bootstrap max-width: 500px;.

Zulkifil
fonte
0

Minha pesquisa me trouxe até aqui, então poderia muito bem adicionar meus dois centavos de ideia. Se você estiver usando o modal Bootstrap do Twitter amigável do Monkey , você pode fazer algo assim:

    var dialog = new BootstrapDialog({
        id: 'myDialog',
        title: 'Title',
        closable: false,
        // whatever you like configuration here...
    });

    dialog.realize();
    if (isContentAYoutubeVideo()) {
        dialog.getModalDialog().css('width', '80%'); // set the width to whatever you like
    }
    dialog.open();

Espero que isto ajude.

jpllosa
fonte