284 votes

Bootstrap 3 modal vertical position center

Il s'agit d'une question en deux parties :

  1. Comment positionner la modale verticalement au centre lorsque l'on ne connaît pas la hauteur exacte de la modale ?

  2. Est-il possible d'avoir la modale centrée et d'avoir overflow:auto dans le corps de la modale, mais seulement si la modale dépasse la hauteur de l'écran ?

J'ai essayé d'utiliser ceci :

.modal-dialog {
  height: 80% !important;
  padding-top:10%;
}

.modal-content {
  height: 100% !important;
  overflow:visible;
}

.modal-body {
  height: 80%;
  overflow: auto;
}

Cela me donne le résultat dont j'ai besoin lorsque le contenu est beaucoup plus grand que la taille de l'écran vertical, mais pour les petits contenus modaux, c'est pratiquement inutilisable.

1 votes

@Heiken pour une raison quelconque, cela me fait sauter en bas de l'écran, j'utilise chrome.

385voto

Finik Points 11
.modal {
  text-align: center;
}

@media screen and (min-width: 768px) { 
  .modal:before {
    display: inline-block;
    vertical-align: middle;
    content: " ";
    height: 100%;
  }
}

.modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

Et ajustez un peu la classe .fade pour être sûr qu'il apparaisse sur le bord supérieur de la fenêtre, au lieu du centre.

0 votes

En fait, j'ai remplacé cette fonction par erreur, merci de m'avoir fait remarquer que cela fonctionne en coulisses.

0 votes

C'est probablement le meilleur moyen de centrer verticalement non seulement la modale bootstrap mais aussi tout le reste. css-tricks.com/centering-in-the-known

4 votes

Je précise que cela ne fonctionne pas très bien sur Mobile. Car la définition ":after" a une hauteur de 100% et peut automatiquement déplacer la modale vers le bas de la page. Je viens de résoudre le problème en déclarant .modal {display : flex ! Important;} .modal-dialog {margin : auto}. Les 92,97% des gens ont déjà un support pour utiliser cette propriété CSS, cependant pour une suporte générale on peut utiliser JavaScript pour définir les marges.

152voto

dimbslmh Points 301

1. Comment positionner la modale verticalement au centre lorsque l'on ne connaît pas la hauteur exacte de la modale ?

Pour centrer de manière absolue la modale Bootstrap 3 sans déclarer de hauteur, vous devez d'abord écraser le CSS Bootstrap en ajoutant ceci à votre feuille de style :

~~.modal-dialog-center { / Edited classname 10/03/2014 / margin: 0; position: absolute; top: 50%; left: 50%; }

Cela positionnera le coin supérieur gauche de la boîte de dialogue modale au centre de la fenêtre.

Nous devons ajouter cette requête média, sinon la marge gauche de la modale est incorrecte sur les petits appareils :

@media (max-width: 767px) {
  .modal-dialog-center { /* Edited classname 10/03/2014 */
    width: 100%;
  }
} 

Nous allons maintenant devoir ajuster sa position avec JavaScript. Pour ce faire, nous donnons à l'élément une marge négative en haut et à gauche égale à la moitié de sa hauteur et de sa largeur. Dans cet exemple, nous utiliserons jQuery car il est disponible avec Bootstrap.

$('.modal').on('shown.bs.modal', function() {
    $(this).find('.modal-dialog').css({
        'margin-top': function () {
            return -($(this).outerHeight() / 2);
        },
        'margin-left': function () {
            return -($(this).outerWidth() / 2);
        }
    });
});~~ 

Mise à jour (01/10/2015) :

Complément d'information La réponse de Finik . Crédits à Se centrer sur l'inconnu .

.modal {
  text-align: center;
  padding: 0!important;
}

.modal:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -4px; /* Adjusts for spacing */
}

.modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

Vous remarquez la marge négative à droite ? Cela supprime l'espace ajouté par inline-block. Cet espace fait que la modale saute au bas de la page @media width < 768px.

2. Est-il possible d'avoir la modale centrée et d'avoir overflow:auto dans le corps de la modale, mais seulement si la modale dépasse la hauteur de l'écran ?

Cela est possible en donnant au corps modal un overflow-y:auto et une hauteur maximale. Cela demande un peu plus de travail pour que cela fonctionne correctement. Commencez par ajouter ceci à votre feuille de style :

~~.modal-body { overflow-y: auto; } .modal-footer { margin-top: 0; }

Nous allons à nouveau utiliser jQuery pour obtenir la hauteur de la fenêtre et définir la hauteur maximale du contenu modal en premier lieu. Ensuite, nous devons définir la hauteur maximale du corps de la modale, en soustrayant le contenu de la modale avec le modal-header et le modal-footer :

$('.modal').on('shown.bs.modal', function() {
    var contentHeight = $(window).height() - 60;
    var headerHeight = $(this).find('.modal-header').outerHeight() || 2;
    var footerHeight = $(this).find('.modal-footer').outerHeight() || 2;

    $(this).find('.modal-content').css({
        'max-height': function () {
            return contentHeight;
        }
    });

    $(this).find('.modal-body').css({
        'max-height': function () {
            return (contentHeight - (headerHeight + footerHeight));
        }
    });

    $(this).find('.modal-dialog').css({
        'margin-top': function () {
            return -($(this).outerHeight() / 2);
        },
        'margin-left': function () {
            return -($(this).outerWidth() / 2);
        }
    });
});~~ 

Vous pouvez trouver ici une démo fonctionnelle avec Bootstrap 3.0.3 : http://cdpn.io/GwvrJ EDIT : Je recommande d'utiliser plutôt la version mise à jour pour une solution plus réactive : http://cdpn.io/mKfCc

Mise à jour (30/11/2015) :

function setModalMaxHeight(element) {
  this.$element     = $(element);  
  this.$content     = this.$element.find('.modal-content');
  var borderWidth   = this.$content.outerHeight() - this.$content.innerHeight();
  var dialogMargin  = $(window).width() < 768 ? 20 : 60;
  var contentHeight = $(window).height() - (dialogMargin + borderWidth);
  var headerHeight  = this.$element.find('.modal-header').outerHeight() || 0;
  var footerHeight  = this.$element.find('.modal-footer').outerHeight() || 0;
  var maxHeight     = contentHeight - (headerHeight + footerHeight);

  this.$content.css({
      'overflow': 'hidden'
  });

  this.$element
    .find('.modal-body').css({
      'max-height': maxHeight,
      'overflow-y': 'auto'
  });
}

$('.modal').on('show.bs.modal', function() {
  $(this).show();
  setModalMaxHeight(this);
});

$(window).resize(function() {
  if ($('.modal.in').length != 0) {
    setModalMaxHeight($('.modal.in'));
  }
});

(Mis à jour le 30/11/2015 http://cdpn.io/mKfCc avec la modification ci-dessus)

1 votes

Excellente réponse et post ! Cependant, peut-on également l'animer ? Cela fonctionne très bien lorsqu'il s'agit d'une simple apparition, mais qu'en est-il de l'animation ? Je suis au travail et ne peux pas le tester pour le moment, mais je suis impatient de voir les résultats.

0 votes

Vous pouvez ajouter une classe de fondu sur la modale. Consultez ma solution mise à jour à l'adresse cdpn.io/mKfCc

0 votes

Bien qu'il semble fonctionner parfaitement sur Codepen, je n'arrive pas à le faire fonctionner sur mon projet. Je suppose qu'il suffit d'ajouter le code et non de remplacer quelque chose, n'est-ce pas ?

40voto

Brian J. Hakim Points 410

Ma solution

.modal-dialog-center {
    margin-top: 25%;
}

    <div id="waitForm" class="modal">
        <div class="modal-dialog modal-dialog-center">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                    <h4 id="headerBlock" class="modal-title"></h4>
                </div>
                <div class="modal-body">
                    <span id="bodyBlock"></span>
                    <br/>
                    <p style="text-align: center">
                        <img src="@Url.Content("~/Content/images/progress-loader.gif")" alt="progress"/>
                    </p>   
                </div>
            </div>
        </div>
    </div>

0 votes

Vous devez utiliser padding-top. margin interrompra l'action de fermeture lorsque vous cliquez dans la superposition.

3 votes

Si la marge supérieure est fixée à 25 %, la modale doit avoir une hauteur de 50 %.

25voto

scooterlord Points 1669

J'ai trouvé une solution purement css ! C'est css3 cependant, ce qui signifie que ie8 ou inférieur n'est pas supporté, mais à part cela, il est testé et fonctionne sur ios, Android, ie9+, chrome, firefox, desktop safari .

J'utilise le css suivant :

.modal-dialog {
  position:absolute;
  top:50% !important;
  transform: translate(0, -50%) !important;
  -ms-transform: translate(0, -50%) !important;
  -webkit-transform: translate(0, -50%) !important;
  margin:auto 5%;
  width:90%;
  height:80%;
}
.modal-content {
  min-height:100%;
  position:absolute;
  top:0;
  bottom:0;
  left:0;
  right:0; 
}
.modal-body {
  position:absolute;
  top:45px; /** height of header **/
  bottom:45px;  /** height of footer **/
  left:0;
  right:0;
  overflow-y:auto;
}
.modal-footer {
  position:absolute;
  bottom:0;
  left:0;
  right:0;
}

Voici un violon. http://codepen.io/anon/pen/Hiskj

en sélectionnant cette réponse comme étant la bonne, car il n'y a pas de javascript lourd supplémentaire qui met le navigateur à genoux en cas de plusieurs modales.

8 votes

Le but de l'utilisation de JavaScript était d'obtenir la inconnu hauteur de la modale. Votre solution a une hauteur fixe de 80%, ce qui ne répond pas à votre propre question : "Comment pouvez-vous positionner la modale verticalement au centre lorsque vous je ne connais pas la hauteur exacte de la modale ?"

0 votes

...la dimension hauteur est définie pour limiter la hauteur MAXIMALE de la modale par rapport à la hauteur de l'écran. Cependant, le pourcentage de la traduction est fixé en fonction de la hauteur du CONTENU.

3 votes

Si vous souhaitez obtenir une solution qui ne modifie pas la taille de la boîte modale, essayez également la solution css suivante : tweaks.klickagent.ch/#30.05.2014_TwitterBootstrapCenterModal

20voto

Moes Points 1665

Tout ce que j'ai fait dans mon cas, c'est de définir la hauteur de la modale dans mon css en connaissant la hauteur de la modale.

<div id="myModal" class="modal fade"> ... </div>

Dans mon css, j'ai mis

#myModal{
    height: 400px;
    top: calc(50% - 200px) !important;
}

1 votes

En tant que novice en css, cette réponse m'a semblé la moins effrayante et a permis de faire le travail.

2 votes

Cela ne répond pas à la première partie de la question : " quand on ne connaît pas la hauteur exacte de la modale ?"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X