Comment redimensionner dynamiquement Twitter Bootstrap modal en fonction du contenu

101

J'ai du contenu de base de données qui contient différents types de données, comme des vidéos Youtube, des vidéos Vimeo, du texte, des images Imgur, etc. Tous ont des hauteurs et largeurs différentes. Tout ce que j'ai trouvé en cherchant sur Internet, c'est de changer la taille en un seul paramètre. Il doit être le même que le contenu de la fenêtre contextuelle.

Ceci est mon code HTML. J'utilise également Ajax pour appeler le contenu.

<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
la source

Réponses:

112

Étant donné que votre contenu doit être dynamique, vous pouvez définir les propriétés css du modal de manière dynamique lors de l' showévénement du modal, ce qui redimensionnera le modal en remplaçant ses spécifications par défaut. La raison d'être bootstrap applique une hauteur maximale au corps modal avec la règle css comme ci-dessous:

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

Ainsi, vous pouvez ajouter des styles en ligne de manière dynamique en utilisant la cssméthode jquery :

Pour les nouvelles versions de bootstrap, utilisez 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%'
       });
});

Pour les anciennes versions de bootstrap, utilisez show

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

ou utilisez une règle css pour remplacer:

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

et ajoutez cette classe autoModalà vos modaux cibles.

Changez le contenu dynamiquement dans le violon, vous verrez le modal se redimensionner en conséquence. Demo

La version plus récente de bootstrap voit le fichier disponible event names.

  • show.bs.modal Cet événement se déclenche immédiatement lorsque la méthode de l'instance show est appelée. S'il est provoqué par un clic, l'élément cliqué est disponible en tant que propriété relatedTarget de l'événement.
  • montré.bs.modal Cet événement est déclenché lorsque le modal a été rendu visible à l'utilisateur (attendra la fin des transitions CSS). S'il est provoqué par un clic, l'élément cliqué est disponible en tant que propriété relatedTarget de l'événement.
  • hide.bs.modal Cet événement est déclenché immédiatement lorsque la méthode d'instance hide a été appelée.
  • hidden.bs.modal Cet événement est déclenché lorsque le modal a fini d'être caché à l'utilisateur (attendra la fin des transitions CSS).
  • chargé.bs.modal Cet événement est déclenché lorsque le modal a chargé du contenu à l'aide de l'option remote.

Ancienne version de bootstrap modal events prise en charge.

  • Show - Cet événement se déclenche immédiatement lorsque la méthode de l'instance show est appelée.
  • montré - Cet événement est déclenché lorsque le modal a été rendu visible à l'utilisateur (attendra la fin des transitions css).
  • hide - Cet événement est déclenché immédiatement lorsque la méthode d'instance hide a été appelée.
  • hidden - Cet événement est déclenché lorsque le modal a fini d'être caché à l'utilisateur (attendra la fin des transitions css).
PSL
la source
J'ai dû changer #modal en même chose que .moda-body maintenant cela fonctionne parfaitement. Merci beaucoup!
Erdem Ece
8
@PSL, +1 pour la réponse et pour m'avoir présenté kbd dans SO.
Rolando Isidoro
ressemble à l'événement show ne fonctionne pas. cela a fonctionné: $('#modal').on('show.bs.modal', function () { getbootstrap.com/javascript/#modals-events
joym8
+1 pour les détails et accueillir l'ancien et le nouveau. Maintenant, si seulement il ne remplissait pas seulement toute la largeur de l'écran et était en fait de taille dynamique.
Luminous le
@PSL sur le runtime comment peut manipuler la largeur du modal? Je veux dire le rendre plus petit ou plus grand avec JavaScript?
Sredny M Casanova
119

Cela a fonctionné pour moi, rien de ce qui précède n'a fonctionné.

.modal-dialog{
    position: relative;
    display: table; /* This is important */ 
    overflow-y: auto;    
    overflow-x: auto;
    width: auto;
    min-width: 300px;   
}
Amit Shah
la source
1
@maheshreddy Bienvenue, n'oubliez pas de voter +1 si cela vous aide. afin que d'autres puissent mettre plus de confiance sur cette réponse et essayer.
Amit Shah
Il définit dynamiquement la hauteur, mais cette fois la boîte de dialogue modale est ouverte sur le côté gauche de l'écran. Comment le réparer?
Jack
1
mais cela ne fonctionne pas dans une vue mobile réactive. Cela fonctionne assez bien sur les écrans d'ordinateurs portables.
chetan
4
Cela a fonctionné, mais cela a eu pour conséquence involontaire que le modal n'était plus centré verticalement dans la page. Pas grand-chose du tout mais je pensais mentionner quelque chose.
John Allard
22

Je ne pouvais pas faire fonctionner la réponse de PSL pour moi, alors j'ai trouvé que tout ce que j'avais à faire était de définir la div contenant le contenu modal avec style="display: table;". Le contenu modal lui-même indique la taille qu'il souhaite et le modal l'adapte.

Lumineux
la source
5
Je n'ai pas non plus réussi à faire fonctionner la réponse de PSL. (Peut-être parce que j'utilisais la version angulaire de bootstrap) Cela a fonctionné pour moi. Juste pour noter que ce style est ajouté sur la classe .modal-dialog +1
user227353
J'ai appliqué votre solution à la div ayant comme classe "modal-content" ,, a travaillé pour moi.
Mehdi
10

Il existe de nombreuses façons de le faire si vous souhaitez écrire du CSS, puis ajoutez ce qui suit

.modal-dialog{
  display: table
}

Dans le cas où vous souhaitez ajouter en ligne

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

N'ajoutez pas display:table;à la classe de contenu modal. il a fait votre travail mais disposez votre modal pour une grande taille, voir les captures d'écran suivantes. La première image est si vous ajoutez du style à la boîte de dialogue modale Dans le cas où vous ajoutez du style à la boîte de dialogue modale si vous ajoutez du style au contenu modal. il a l'air disposé. entrez la description de l'image ici

waqas ali
la source
7

pour bootstrap 3, utilisez comme

$('#myModal').on('hidden.bs.modal', function () {
// do something…
})
user2678868
la source
4
Juste pour ajouter à cela hidden.bs.modal se déclenchera après la fermeture du modal. Utilisez show.bs.modal pour lancer le bootstrap 3 lorsque le modal est déclenché.
d3c0y
Comment cela redimensionnera-t-il la boîte de dialogue d'une manière ou d'une autre? Il s'agit simplement d'une fonction de rappel qui est déclenchée lorsque la boîte de dialogue modale est masquée (ou affichée).
user1438038
4

Simple Css fonctionne pour moi

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

Je remplace simplement le css:

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

défini width:fit-contentsur le div modal.

Subhashis Pal
la source
1

Vous pouvez le faire si vous utilisez le plugin jquery dialog de gijgo.com et définissez la largeur sur auto.

$("#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>

Vous pouvez également autoriser les utilisateurs à contrôler la taille si vous définissez redimensionnable sur true. Vous pouvez voir une démo à ce sujet sur http://gijgo.com/Dialog/Demos/bootstrap-modal-resizable

Atanas Atanasov
la source
1

Une solution CSS simple qui va centrer verticalement et horizontalement le modal:

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

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

Pour Bootstrap 2 Auto ajuster la hauteur du modèle de manière dynamique

  //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
la source
0

J'ai eu le même problème avec bootstrap 3 et la hauteur de la div modal-body ne voulant pas être supérieure à 442px. C'était tout le css nécessaire pour le résoudre dans mon cas:

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

Mine Solution était juste d'ajouter le style ci-dessous. <div class="modal-body" style="clear: both;overflow: hidden;">

Furquan
la source
0

Depuis Bootstrap 4 - il a un style de:

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

donc si vous cherchez à redimensionner la largeur modale à une largeur plus grande, je vous suggère de l'utiliser dans votre css par exemple:

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

Notez que ce paramètre width: 87vw;ne remplacera pas celui de bootstrap max-width: 500px;.

Zulkifil
la source
0

Ma recherche m'a conduit ici, alors autant ajouter mes deux cents d'idée. Si vous utilisez le modal Twitter Bootstrap convivial de Monkey, vous pouvez faire quelque chose comme ceci:

    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();

J'espère que cela t'aides.

jpllosa
la source