193 votes

Centrage vertical de la fenêtre modale Bootstrap

Je voudrais centrer ma modale sur la fenêtre d'affichage (au milieu). J'ai essayé d'ajouter quelques propriétés css.

 .modal { position: fixed; top:50%; left:50%; }   

J'utilise cet exemple http://jsfiddle.net/rniemeyer/Wjjnd/

J'ai essayé

$("#MyModal").modal('show').css(
    {
        'margin-top': function () {
            return -($(this).height() / 2);
        },
        'margin-left': function () {
            return -($(this).width() / 2);
        }
    })

0 votes

Essayez de passer outre .modal.fade.in également

0 votes

3 votes

Essayez ceci zerosixthree.se/ J'utilise : .modal.fade.in { top : 50% ; transform : translateY(-50%) ; }

268voto

Rens de Nobel Points 362

Cela fait l'affaire : http://jsfiddle.net/sRmLV/1140/

Il utilise un helper-div et quelques css personnalisés. Aucun javascript ou jQuery n'est nécessaire.

HTML (basée sur la méthode Bootstrap code de démonstration )

<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">Launch demo modal</button>

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="vertical-alignment-helper">
        <div class="modal-dialog vertical-align-center">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</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>
    </div>
</div>

CSS

.vertical-alignment-helper {
    display:table;
    height: 100%;
    width: 100%;
    pointer-events:none; /* This makes sure that we can still click outside of the modal to close it */
}
.vertical-align-center {
    /* To center vertically */
    display: table-cell;
    vertical-align: middle;
    pointer-events:none;
}
.modal-content {
    /* Bootstrap sets the size of the modal in the modal-dialog class, we need to inherit it */
    width:inherit;
    max-width:inherit; /* For Bootstrap 4 - to avoid the modal window stretching full width */
    height:inherit;
    /* To center horizontally */
    margin: 0 auto;
    pointer-events: all;
}

0 votes

Avec cette solution, à cause de la hauteur : 100% ; et de la largeur : 100% ; vous ne pouvez pas fermer les modales en cliquant hors des modales. Pouvez-vous penser à une solution pour ce problème @Rens de Nobel ?

1 votes

Cette solution semble fonctionner parfaitement (sauf qu'elle m'empêche de fermer les modales en cliquant dessus). Mais d'une manière ou d'une autre, elle fait échouer certains de mes tests e2e avec protractor (et je n'arrive pas à trouver la raison, je n'ai pas l'impression qu'il s'agisse d'un bug). Quoi qu'il en soit, je vais revenir à la réponse en javascript pour ne pas perdre plus de temps sur ce sujet. Mais comme je l'ai dit, cela semble fonctionner correctement, je préviens juste les personnes qui font des tests e2e avec protractor de faire attention.

3 votes

@pcatre, merci pour le conseil ! J'ai mis à jour le code avec un correctif pour cela. Le réglage de pointer-events:none ; sur les classes d'alignement fait l'affaire. Testé dans IE11, les dernières versions de Chrome et Firefox et iOS Safari.

93voto

Arany Points 229

Comme la réponse de gpcola ne fonctionnait pas pour moi, j'ai modifié un peu la réponse pour qu'elle fonctionne maintenant. J'ai utilisé "margin-top" au lieu de transform. De plus, j'utilise l'événement "show" au lieu de "shown" parce qu'après cela, j'avais un très mauvais saut de positionnement (visible lorsque vous avez des animations bootstrap). Assurez-vous de définir l'affichage à "block" avant le positionnement, sinon $dialog.height() sera 0 et la modale ne sera pas centrée complètement.

(function ($) {
    "use strict";
    function centerModal() {
        $(this).css('display', 'block');
        var $dialog  = $(this).find(".modal-dialog"),
        offset       = ($(window).height() - $dialog.height()) / 2,
        bottomMargin = parseInt($dialog.css('marginBottom'), 10);

        // Make sure you don't hide the top part of the modal w/ a negative margin if it's longer than the screen height, and keep the margin equal to the bottom margin of the modal
        if(offset < bottomMargin) offset = bottomMargin;
        $dialog.css("margin-top", offset);
    }

    $(document).on('show.bs.modal', '.modal', centerModal);
    $(window).on("resize", function () {
        $('.modal:visible').each(centerModal);
    });
}(jQuery));

6 votes

Celui-ci est parfait ! Juste au lieu de $(document).height() il faut utiliser $(window).height() à la ligne 4. De plus, je changerais la dernière ligne en : $('.modal:visible').each(centerModal);

0 votes

Cela fonctionne parfaitement pour moi, merci. Quand on utilise ce code, il faut aussi mettre le padding top et bottom du modal-dialog à 0px ,pour un centrage parfait.

0 votes

Cela ne fonctionne pas si la modale est plus haute que la hauteur de la fenêtre. J'ai donc ajouté la ligne suivante juste avant de définir la marge supérieure de la boîte de dialogue : if(offset < 0) offset = 0; Je colle le bloc entier dans une réponse au cas où ce ne serait pas clair !

88voto

user1279047 Points 323

C'est ce que j'ai fait pour mon application. Si vous regardez les classes suivantes dans le fichier bootstrap.css .modal-dialog a un padding par défaut de 10px et @media screen et (min-width : 768px) .modal-dialog a un padding supérieur fixé à 30px. Dans mon fichier css personnalisé, j'ai donc défini un remplissage supérieur de 15 % pour tous les écrans sans spécifier de largeur d'écran. J'espère que cela vous aidera.

.modal-dialog {
  padding-top: 15%;
}

6 votes

Cela ne fonctionne que pour les petites boîtes d'alret, et ne fonctionne pas pour les grandes boîtes

0 votes

Vous pourriez vous contenter de postuler pour les petits modaux : .modal-dialog.modal-sm { padding-top:15%; }

72voto

taha shahid Points 11

Le meilleur moyen que j'ai trouvé pour tous les navigateurs HTML5 :

body.modal-open .modal {
    display: flex !important;
    height: 100%;
} 

body.modal-open .modal .modal-dialog {
    margin: auto;
}

2 votes

J'ai aimé cette solution, très propre. Je ne suis pas sûr pour les ordinateurs de bureau ou les anciennes versions de Safari, mais elle semble fonctionner correctement sous iOS 8.

1 votes

Oui, je suis d'accord avec @NicolasGaller. Cela fonctionne bien pour moi aussi. J'ai testé dans Chrome et Firefox. Cela fonctionne bien.

2 votes

Il s'agit d'une grande amélioration progressive en css uniquement. Aucun js n'est requis et tout navigateur qui ne supporte pas le flexbox obtiendra le placement modal par défaut du bootstrap.

25voto

user3389 Points 1
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="table">
        <div class="table-cell">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</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>
        </div>
    </div>
</div>

// Styles

.table {
 display: table;
 height:100%;
}
.table-cell {
display: table-cell;
vertical-align: middle;
}

3 votes

C'est la réponse universelle. Je ne sais pas pourquoi personne n'a voté pour.

3 votes

J'ai passé en revue au moins 4 entrées d'OS, chacune contenant une douzaine de propositions. BTW, à l'âge du HTML5, cela devrait être une fonctionnalité intégrée à un cadre au moins. Au lieu de jongler.

1 votes

Notez également que si vous indiquez width:100% pour le style de tableau, vous obtiendrez un centrage horizontal (dans le cas où la modale n'est pas masquée par un débordement).

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