Bootstrap 3 modale vertikale Positionsmitte

270

Dies ist eine zweiteilige Frage:

  1. Wie können Sie das Modal vertikal in der Mitte positionieren, wenn Sie die genaue Höhe des Modals nicht kennen?

  2. Ist es möglich, das Modal zentriert zu haben und einen Überlauf zu haben: auto im Modalkörper, aber nur, wenn das Modal die Bildschirmhöhe überschreitet?

Ich habe versucht, dies zu verwenden:

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

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

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

Dies gibt mir das Ergebnis, das ich brauche, wenn der Inhalt viel größer als die vertikale Bildschirmgröße ist, aber für kleine modale Inhalte ist er ziemlich unbrauchbar.

Rollerlord
quelle
1
@ Heiken aus irgendeinem Grund lässt mich das auf den Bildschirm springen, ich benutze Chrom
Sven van den Boogaart

Antworten:

374
.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;
}

Passen Sie die .fade-Klasse ein wenig an, um sicherzustellen, dass sie außerhalb des oberen Randes des Fensters und nicht in der Mitte angezeigt wird

Finik
quelle
Ich habe dies versehentlich überschrieben, danke für den Hinweis, dass es tatsächlich hinter den Kulissen funktioniert.
Dorian
Dies ist wahrscheinlich der beste Weg, um nicht nur das Bootstrap-Modal, sondern alles andere vertikal zu zentrieren. css-tricks.com/centering-in-the-unknown
Mark S
4
Ich stelle klar, dass dies auf Mobilgeräten nicht sehr gut funktioniert. Weil die Definition ": after" eine Höhe von 100% hat und das Modal automatisch nach unten auf der Seite verschieben kann. Ich habe gerade die Deklaration von .modal {display: flex! Wichtig;} .modal-dialog {margin: auto}. Die 92,97% der Benutzer haben bereits Unterstützung bei der Verwendung dieser CSS-Eigenschaft. Für allgemeine Zwecke können Sie jedoch JavaScript verwenden, um die Ränder festzulegen.
Walter Chapilliquen - wZVanG
21
Absolut großartig, aber ich würde empfehlen, es nur über 768px zu verwenden und die Standardeinstellung auf dem Handy zu belassen. Die obere Position ist am besten für Modale geeignet, wenn die Bildschirmhöhe klein ist. Ich habe auch eine Animation angepasst, damit sie von der Mitte aus angezeigt
bwitkowicz
Diese Lösung verschiebt das modale Fenster für 2px nach rechts, Ursache: vor Element. Dies kann jedoch gelöst werden, indem derselbe Code hinzugefügt wird für: after
Cypher
146

1. Wie können Sie das Modal vertikal in der Mitte positionieren, wenn Sie die genaue Höhe des Modals nicht kennen?

Um das Bootstrap 3 Modal absolut zu zentrieren, ohne eine Höhe anzugeben, müssen Sie zuerst das Bootstrap-CSS überschreiben, indem Sie dies Ihrem Stylesheet hinzufügen:

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

Dadurch wird die obere linke Ecke der Modaldialoge in der Mitte des Fensters positioniert.

Wir müssen diese Medienabfrage hinzufügen, sonst ist der modale Rand links auf kleinen Geräten falsch:

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

Jetzt müssen wir seine Position mit JavaScript anpassen. Dazu geben wir dem Element einen negativen oberen und linken Rand, der der Hälfte seiner Höhe und Breite entspricht. In diesem Beispiel verwenden wir jQuery, da es mit Bootstrap verfügbar ist.

$('.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);
        }
    });
});

Update (01.10.2015):

Hinzufügen zu Finiks Antwort . Credits für die Zentrierung im Unbekannten .

.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;
}

Beachten Sie die negative Marge-richtig? Dadurch wird der durch den Inline-Block hinzugefügte Speicherplatz entfernt. Dieser Raum bewirkt, dass das Modal zum Ende der Seite springt @media width <768px.

2. Ist es möglich, das Modal zentriert zu haben und einen Überlauf zu haben: auto im Modalkörper, aber nur, wenn das Modal die Bildschirmhöhe überschreitet?

Dies ist möglich, indem dem Modalkörper ein Überlauf-y: auto und eine maximale Höhe gegeben werden. Dies erfordert etwas mehr Arbeit, damit es richtig funktioniert. Beginnen Sie mit dem Hinzufügen zu Ihrem Stylesheet:

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

Wir werden jQuery erneut verwenden, um die Fensterhöhe zu ermitteln und zuerst die maximale Höhe des modalen Inhalts festzulegen. Dann müssen wir die maximale Höhe des Modalkörpers festlegen, indem wir den Modalinhalt mit dem Modal-Header und dem Modal-Footer subtrahieren:

$('.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);
        }
    });
});

Eine funktionierende Demo mit Bootstrap 3.0.3 finden Sie hier: http://cdpn.io/GwvrJ BEARBEITEN: Ich empfehle stattdessen die Verwendung der aktualisierten Version für eine reaktionsschnellere Lösung: http://cdpn.io/mKfCc

Update (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'));
  }
});

(Aktualisiert am 30.11.2015 http://cdpn.io/mKfCc mit der obigen Bearbeitung)

dimbslmh
quelle
1
ausgezeichnete Antwort und Post! Kann dies aber auch animiert werden? Es funktioniert großartig, wenn es nur auftaucht, aber was ist mit animiert? Ich bin auf der Arbeit und kann es nicht testen, aber ich bin gespannt auf die Ergebnisse
Scooterlord
Sie können dem Modal eine Fade-Klasse hinzufügen. Schauen Sie sich meine aktualisierte Lösung unter cdpn.io/mKfCc
dimbslmh
Obwohl es auf Codepen großartig zu funktionieren scheint, kann ich es nicht dazu bringen, an meinem Projekt zu arbeiten. Ich denke, Sie müssen nur den Code hinzufügen und nichts ersetzen, oder?
Rollerlord
1
Hallo nochmal! Bemerkte folgendes. Wenn das erste Modal zum ersten Mal geöffnet wird, ist der rechte Rand falsch, bis Sie die Größe einmal ändern. Irgendwelche Ideen dazu?
Rollerlord
1
@bernie Ich habe Screenshots auf Browserstack mit einer Gabel meiner codepen , die die kurze modal geöffnet document.ready hat: browserstack.com/screenshots/... Browserstack nicht unterstützt v9.3.x für Screenshots (noch) nicht , aber ich denke , Etwas Ähnliches wie das, was Sie beschrieben haben, tritt unter iOS 6.0 auf (siehe Screenshot iPad 3rd (6.0) (Portrait)). Vielleicht ist es ein alter Fehler, der in Version 9.3.2 zurückgekehrt ist. Wenn Sie möchten
dimbslmh
37

Meine Lösung

.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>
Brian J. Hakim
quelle
Sie sollten Polster verwenden. Rand wird die
Schließaktion
2
Bei einem Margin-Top von 25% muss das Modal 50% groß sein.
Rebellion
28

Es kann einfach mit behoben werden display: flex

.modal-dialog {
  margin-top: 0;
  margin-bottom: 0;
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.modal.fade .modal-dialog {
  transform: translate(0, -100%);
}

.modal.in .modal-dialog {
  transform: translate(0, 0);
}

Mit Präfix

.modal-dialog {
  margin-top: 0;
  margin-bottom: 0;
  height: 100vh;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.modal.fade .modal-dialog {
  -webkit-transform: translate(0, -100%);
          transform: translate(0, -100%);
}
.modal.in .modal-dialog {
  -webkit-transform: translate(0, 0);
          transform: translate(0, 0);
}
Mo.
quelle
2
Dies verhindert, dass der Hintergrund aufgrund der Höhe von 100 Vh angeklickt wird. Es ist in Ordnung für "Hintergrund: 'statisch'" Einstellungen.
Ianstigator
Diese Ursache verblassen Animationsproblem
Viswanath Lekshmanan
23

Ich habe mir eine reine CSS-Lösung ausgedacht! Es ist zwar CSS3, was bedeutet, dass IE8 oder niedriger nicht unterstützt wird, aber ansonsten ist es getestet und funktioniert auf iOS, Android, IE9 +, Chrome, Firefox, Desktop-Safari.

Ich benutze das folgende CSS:

.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;
}

Hier ist eine Geige. http://codepen.io/anon/pen/Hiskj

..Wählen Sie dies als die richtige Antwort, da es kein extra schweres Javascript gibt, das den Browser bei mehr als einem Modal in die Knie zwingt.

Rollerlord
quelle
8
Der springende Punkt bei der Verwendung von JavaScript war, die unbekannte Höhe des Modals zu ermitteln. Ihre Lösung hat eine feste Höhe von 80%, was Ihre eigene Frage nicht beantwortet: "Wie können Sie das Modal vertikal in der Mitte positionieren, wenn Sie die genaue Höhe des Modals nicht kennen ?"
Dimbslmh
... die Höhenabmessung so eingestellt ist, dass die maximale modale Höhe im Vergleich zur Bildschirmhöhe begrenzt wird. Der Prozentsatz der Übersetzung wird jedoch entsprechend der Höhe des INHALTS festgelegt.
Rollerlord
3
Wenn Sie eine Lösung erhalten möchten, die die Größe der Modalbox
klickagent.ch
Sehr schön auch. Es hat jedoch einen anderen Ansatz als den, den ich beschreibe. In Ihrem Fall bewegt sich das gesamte Modal auf und ab, wenn in meinem Fall ein überflogenes Element erstellt wird. Sehr schön! Ich mag das!
Rollerlord
Dazu muss die Höhe eingestellt werden. Dies entspricht nicht genau den Anforderungen des Benutzers.
Rebellion
21

Wenn Sie mit der Verwendung von Flexbox einverstanden sind, sollte dies zur Lösung des Problems beitragen.

.modal-dialog {
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
}

.modal-content {
  margin: 0 auto;
}
Xiaolin
quelle
7
Ich finde heraus, dass diese Antwort für mich großartig funktioniert. Allerdings, wenn Sie möchten , dass Benutzer eine modale schließen lassen , indem sie den Hintergrund klicken, stellen Sie sicher , hinzufügen pointer-events: nonezu .modal-dialogund pointer-events: autozu .modal-content. Weil Sie .modal-dialog {height: 100%}die gesamte Spalte über und unter einem Modal abdecken und Benutzer deaktivieren, um auf den Hintergrund in diesem Bereich zu klicken.
Wuct
kombiniert mit dem Vorschlag von @ChingTingWu, am effektivsten
Strider
Und wo ist der Vorschlag von @ChingTingWu?
Giovannipds
1
ChingTingWu scheint zu @wuct
Xiaolin
1
@giovannipds Ups, ich habe meinen Benutzernamen umbenannt, weil er kürzer und einfacher zu markieren ist. Entschuldigung für die Verwirrung :)
Wuct
20

Meine Lösung:

.modal.in .modal-dialog 
{
    -webkit-transform: translate(0, calc(50vh - 50%));
    -ms-transform: translate(0, 50vh) translate(0, -50%);
    -o-transform: translate(0, calc(50vh - 50%));
    transform: translate(0, 50vh) translate(0, -50%);
}
Vadim
quelle
Dies scheint perfekt mit Bootstrap 3 zu funktionieren. Warum ist dies nicht die akzeptierte Antwort? Es ist viel einfacher (4 CSS-Anweisungen) als die anderen.
Danielricecodes
@danielricecodes Ich werde eine Aufnahme machen und davon ausgehen, dass dies an den Problemen mit Ansichtsfenstereinheiten liegt. . Die vorgeschlagene Antwort von scooterlord schlug Kompatibilität auch mit IE9 und iOs vor, was mir ein Problem darstellt. Wenn Sie die Problemseite von canIuse überprüfen, werden Sie feststellen, dass es Probleme mit iOs und IE10 und älter gibt. Nicht dass ich damit einverstanden bin oder nicht, dass dies die richtige Antwort ist. Ich möchte nur darauf hinweisen, warum dies möglicherweise nicht als Antwort ausgewählt wurde.
Malavos
1
Es gibt ein Problem mit diesem Ansatz ist, wenn das Modal scrollbaren Inhalt hat (mehr Inhalt als in Fenster passt)
Steven Pribilinskiy
Dies sollte die akzeptierte Antwort sein. Bisher ist dies die einzige Lösung, die für mich funktioniert. Danke dafür.
Shifu
Dies funktioniert nicht, wenn Ihr modaler Inhalt größer als die Bildschirmhöhe ist (wenn Ihr Modal scrollen muss)
Brett Gregson
18

Alles, was ich in meinem Fall getan habe, ist, das Top in meinem CSS zu setzen und die Höhe des Modals zu kennen

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

in meinem css habe ich gesetzt

#myModal{
    height: 400px;
    top: calc(50% - 200px) !important;
}
Nerdroid
quelle
1
Als Noob zu CSS schien diese Antwort am wenigsten erschreckend und erledigte die Arbeit
Oded Ben Dov
2
Dies beantwortet nicht den ersten Teil der Frage: "..wenn Sie die genaue Höhe des Modals nicht kennen?"
Natec
15

Das Hinzufügen dieser einfachen CSS funktioniert auch.

.modal-dialog {
  height: 100vh !important;
  display: flex;
}

.modal-content {
  margin: auto !important;
  height: fit-content !important;
}
Ninja420
quelle
Was ist Fit-Content?
Marc Roussel
12

Es gibt einen einfachsten Weg, dies mit CSS zu tun:

.modal-dialog {
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin: auto;
    width:500px;
    height:300px;
}

Das ist es. Beachten Sie, dass es nur auf den .modal-dialogContainer div angewendet werden muss .

Demo: https://jsfiddle.net/darioferrer/0ueu4dmy/

Dario Ferrer
quelle
7
Reagiert auf Mobilgeräten aufgrund der festen Breite und Höhe nicht.
Ianstigator
Ihre Antwort geht davon aus, dass jedes Gerät die gleiche Bildschirmauflösung hat
Patricio Rossi
Kein Mann. Ich gehe davon aus, dass Sie dieses Beispiel verstanden haben und es an jeden Fall anpassen können.
Dario Ferrer
In Bootstrap v3.3.0 erfolgreich ausgeführt, danke
Amin Ghaderi
11

Dieser Fix erweitert die hervorragende Antwort von @ Finik und gilt nur für nicht mobile Geräte. Ich habe in IE8, Chrome und Firefox 22 getestet - es funktioniert mit sehr langen oder kurzen Inhalten.

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

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

Die universellste Lösung, die ich geschrieben habe. Dynamisch berechnet mit Dialoghöhe. (Der nächste Schritt könnte darin bestehen, die Höhe der Dialoge bei der Fenstergröße neu zu berechnen.)

JSfiddle: http://jsfiddle.net/8Fvg9/3/

// initialise on document ready
jQuery(document).ready(function ($) {
    'use strict';

    // CENTERED MODALS
    // phase one - store every dialog's height
    $('.modal').each(function () {
        var t = $(this),
            d = t.find('.modal-dialog'),
            fadeClass = (t.is('.fade') ? 'fade' : '');
        // render dialog
        t.removeClass('fade')
            .addClass('invisible')
            .css('display', 'block');
        // read and store dialog height
        d.data('height', d.height());
        // hide dialog again
        t.css('display', '')
            .removeClass('invisible')
            .addClass(fadeClass);
    });
    // phase two - set margin-top on every dialog show
    $('.modal').on('show.bs.modal', function () {
        var t = $(this),
            d = t.find('.modal-dialog'),
            dh = d.data('height'),
            w = $(window).width(),
            h = $(window).height();
        // if it is desktop & dialog is lower than viewport
        // (set your own values)
        if (w > 380 && (dh + 60) < h) {
            d.css('margin-top', Math.round(0.96 * (h - dh) / 2));
        } else {
            d.css('margin-top', '');
        }
    });

});
Jan Renner
quelle
7

Von hier aus die perfekte Lösung gefunden

$(function() {
    function reposition() {
        var modal = $(this),
            dialog = modal.find('.modal-dialog');
        modal.css('display', 'block');

        // Dividing by two centers the modal exactly, but dividing by three 
        // or four works better for larger screens.
        dialog.css("margin-top", Math.max(0, ($(window).height() - dialog.height()) / 2));
    }
    // Reposition when a modal is shown
    $('.modal').on('show.bs.modal', reposition);
    // Reposition when the window is resized
    $(window).on('resize', function() {
        $('.modal:visible').each(reposition);
    });
});
Ismail Farooq
quelle
1
Danke dir. Perfekt für mich mit einer Änderung: dialog.css ("margin-top", Math.max (0, ($ (Dokument) .scrollTop () + (($ (Fenster) .height () - dialog.height ()) / 2))));
Viacheslav Soldatov
4
$('#myModal').on('shown.bs.modal', function() {
    var initModalHeight = $('#modal-dialog').outerHeight(); //give an id to .mobile-dialog
    var userScreenHeight = $(document).outerHeight();
    if (initModalHeight > userScreenHeight) {
        $('#modal-dialog').css('overflow', 'auto'); //set to overflow if no fit
    } else {
        $('#modal-dialog').css('margin-top', 
        (userScreenHeight / 2) - (initModalHeight/2)); //center it if it does fit
    }
});
Ray Suelzer
quelle
Mit ein paar Änderungen an den Selektoren funktionierte dies wie ein Zauber. @$modal = $('.fade.in'); modalBox = @$modal.find('.modal-content'); initModalHeight = modalBox.outerHeight(); userScreenHeight = @$modal.outerHeight()
Juliangonzalez
4

Hier ist eine andere CSS-Methode, die ziemlich gut funktioniert und darauf basiert: http://zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/

sass:

.modal {
    height: 100%;

    .modal-dialog {
        top: 50% !important;
        margin-top:0;
        margin-bottom:0;
    }

    //keep proper transitions on fade in
    &.fade .modal-dialog {
        transform: translateY(-100%) !important;
    }
    &.in .modal-dialog {
        transform: translateY(-50%) !important;
    }
}
Phazei
quelle
Wie bei anderen transformLösungen tritt das Problem auf, wenn das Modal scrollbaren Inhalt hat (mehr Inhalt als in das Fenster passt)
Steven Pribilinskiy
3

Ich habe Bootstrap3-Dialog von unten Link heruntergeladen und die Open-Funktion in Bootstrap-Dialog.js geändert

https://github.com/nakupanda/bootstrap3-dialog

Code

open: function () {
            !this.isRealized() && this.realize();
            this.updateClosable();
            //Custom To Vertically centering Bootstrap 
            var $mymodal = this.getModal();
            $mymodal = $mymodal.append('<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%"><tr><td align="center" valign="middle" class="centerModal"></td></tr></table>');
            $mymodal = $mymodal.find(".modal-dialog").appendTo($mymodal.find(".centerModal"));
            //END
            this.getModal().modal('show');
            return this;
        }

Css

.centerModal .modal-header{
    text-align:left;
}
.centerModal .modal-body{
    text-align:left;
} 
user3085452
quelle
Hier ist eine Änderung, die in Ihrem eigenen Code angewendet werden kann, ohne dass die ursprüngliche BSDialog-Quelle geändert werden muss: gist.github.com/mahemoff/8ff6d3782d2da6f9cbb3 (nur einige Änderungen am JS, auch in Coffee geschrieben, aber Sie haben die Idee).
Mahemoff
3

Das funktioniert bei mir:

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

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

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

Versuchen Sie so etwas:

.popup__overlay {
    position: fixed;
    left:  0;
    top:  0;
    width: 100%;
    height: 100%;
    z-index: 999;
    text-align: center
    }
.popup {
    display: inline-block;
    vertical-align: middle
    } 
Sergey Briskin
quelle
1
Dies könnte ganz gut funktionieren, aber die Bootstrap-Modalitäten haben absolute, innen fest, innen dies und das ...: /
Scooterlord
1
Was haben diese Klassen mit Bootstrap / Bootstrap-Modalen zu tun?
Lofihelsinki
1

Vielleicht möchten Sie diese Sammlung von Methoden zum absoluten Zentrieren eines Divs überprüfen: http://codepen.io/shshaw/full/gEiDt

Sevron
quelle
1
Hm, in den Höhlen steht, dass man die Höhe angeben muss, was nicht das ist, wonach ich suche
Scooterlord
1

Ein einfacher Weg. Arbeite für mich. Thks rensdenobel :) http://jsfiddle.net/rensdenobel/sRmLV/13/

<style>
.vertical-alignment-helper {
    display:table;
    height: 100%;
    width: 100%;
}
.vertical-align-center {
    /* To center vertically */
    display: table-cell;
    vertical-align: middle;
}
.modal-content {
    /* Bootstrap sets the size of the modal in the modal-dialog class, we need to inherit it */
    width:inherit;
    height:inherit;
    /* To center horizontally */
    margin: 0 auto;
}
</style>
<!-- Button trigger modal -->
<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>    
Tuyen Cao
quelle
1

Noch eine andere Lösung, die eine gültige Position für jedes sichtbare Modal bei window.resizeEreignis und am festlegt show.bs.modal:

(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);
Lenybernard
quelle
1
var modalVerticalCenterClass = ".modal";
function centerModals($element) {
    var $modals;
    if ($element.length) {
        $modals = $element;
    } else {
        $modals = $(modalVerticalCenterClass + ':visible');
    }
    $modals.each( function(i) {
        var $clone = $(this).clone().css('display', 'block').appendTo('body');
        var top = Math.round(($clone.height() - $clone.find('.modal-content').height()) / 2);
        top = top > 0 ? top : 0;
        $clone.remove();
        $(this).find('.modal-content').css("margin-top", top);
    });
}
$(modalVerticalCenterClass).on('show.bs.modal', function(e) {
    centerModals($(this));
});
$(window).on('resize', centerModals);
user3477026
quelle
1

Ich weiß, dass es etwas spät ist, aber ich füge eine neue Antwort hinzu, damit sie nicht in der Menge verloren geht. Es ist eine Cross-Desktop-Mobile-Browser-Lösung, die überall richtig funktioniert, wie es sollte.

Es muss nur modal-dialogin eine modal-dialog-wrapKlasse eingeschlossen werden und die folgenden Code-Ergänzungen enthalten:

.modal-dialog-wrap {
  display: table;
  table-layout: fixed;
  width: 100%;
  height: 100%;
}

.modal-dialog {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
}

.modal-content {
  display: inline-block;
  text-align: left;
}

Der Dialog beginnt zentriert und wächst bei großen Inhalten einfach vertikal, bis eine Bildlaufleiste angezeigt wird.

Hier ist eine funktionierende Geige für Ihr Vergnügen!

https://jsfiddle.net/v6u82mvu/1/

Rollerlord
quelle
1

Dies ist ziemlich alt und erfordert speziell eine Lösung mit Bootstrap 3, aber für alle, die sich fragen: Ab Bootstrap 4 gibt es eine integrierte Lösung namens .modal-dialog-centered. Hier ist das Problem: https://github.com/twbs/bootstrap/issues/23638

Wenn Sie also v4 verwenden, müssen Sie nur hinzufügen .modal-dialog-centered, .modal-dialogum das Modal vertikal zu zentrieren:

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalCenterTitle">Modal title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>
Tobold
quelle
0

Erwägen Sie die Verwendung des Bootstrap-Modal-Plugins, das Sie hier finden - https://github.com/jschr/bootstrap-modal

Das Plugin zentriert alle Ihre Modalitäten

Jeremy Lynch
quelle
... leider hatte ich das versucht, konnte es aber nicht richtig funktionieren lassen - zumindest nicht mit MEINEM Code. Ich denke, dass jeder dies an seine Bedürfnisse anpassen muss! Vielen Dank für die Antwort.
Rollerlord
0

Für die Zentrierung verstehe ich nicht, was mit den zu komplizierten Lösungen zu tun hat. Bootstrap zentriert es bereits horizontal für Sie, sodass Sie sich nicht damit herumschlagen müssen. Meine Lösung besteht darin, nur mit jQuery einen oberen Rand festzulegen.

$('#myModal').on('loaded.bs.modal', function() {
    $(this).find('.modal-dialog').css({
        'margin-top': function () {
            return (($(window).outerHeight() / 2) - ($(this).outerHeight() / 2));
        }
    });
});

Ich habe das Ereignis "load.bs.modal" verwendet, während ich Inhalte aus der Ferne lade, und die Verwendung des Ereignisses "named.ba.modal" führt dazu, dass die Höhenberechnung falsch ist. Sie können natürlich ein Ereignis für das Fenster hinzufügen, dessen Größe geändert wird, wenn es so reaktionsschnell sein soll.

Scott Flack
quelle
Wenn das Modal groß genug ist, kann es Probleme verursachen
Scooterlord
0

Sehr, sehr einfacher Weg, um dieses Konzept zu erreichen, und Sie erhalten Modal immer im Moddle Ihres Bildschirms von CSS wie folgt: http://jsfiddle.net/jy0zc2jc/1/

Sie müssen nur die modalKlassenanzeige als Tabelle anzeigen, indem Sie dem folgenden CSS folgen:

display:table

und modal-dialogalsdisplay:table-cell

Siehe das vollständige Arbeitsbeispiel in der angegebenen Geige

Innodel
quelle
Ich sehe überhaupt kein Modal
ThaDafinser
Das einzige, was ich sehe (in Google Chrome), ist ein rotes Kreuz und der Hintergrund
ThaDafinser
Kein Scrollabel, wenn das Modal mehr Inhalt hat als in das Fenster passt
Steven Pribilinskiy
0

es ist nicht so kompliziert.

Bitte versuchen Sie dies:

$(document).ready(function(){
    var modalId = "#myModal";
    resize: function(){
            var new_margin = Math.ceil(($(window).height() - $(modalId).find('.modal-dialog').height()) / 2);
            $(modalId).find('.modal-dialog').css('margin-top', new_margin + 'px');
    }
    $(window).resize(function(){
        resize();
    });
    $(modalId).on('shown.bs.modal', function(){
        resize();
    });
});
Herr Sun Lin
quelle
0

Verwenden Sie dieses einfache Skript, das die Modalitäten zentriert.

Wenn Sie möchten, können Sie eine benutzerdefinierte Klasse festlegen (z. B. .modal.modal-vcenter anstelle von .modal), um die Funktionalität nur auf einige Modalitäten zu beschränken.

var modalVerticalCenterClass = ".modal";

function centerModals($element) {
    var $modals;
    if ($element.length) {
    $modals = $element;
    } else {
    $modals = $(modalVerticalCenterClass + ':visible');
}
$modals.each( function(i) {
    var $clone = $(this).clone().css('display', 'block').appendTo('body');
    var top = Math.round(($clone.height() - $clone.find('.modal-content').height()) / 2);
    top = top > 0 ? top : 0;
    $clone.remove();
    $(this).find('.modal-content').css("margin-top", top);
    });
}
$(modalVerticalCenterClass).on('show.bs.modal', function(e) {
    centerModals($(this));
});
$(window).on('resize', centerModals);

Fügen Sie diesen CSS-Fix auch für den horizontalen Abstand des Modals hinzu. Wir zeigen die Schriftrolle auf den Modalen, die Körperschriftrollen werden von Bootstrap automatisch ausgeblendet:

/* scroll fixes */
.modal-open .modal {
    padding-left: 0px !important;
    padding-right: 0px !important;
    overflow-y: scroll;
}
Rakesh Vadnal
quelle
0

In der mobilen Plantform sieht es vielleicht etwas anders aus, hier ist mein Code.

<div class="modal-container">
  <style>
  .modal-dialog{
    margin-top: 60%;
    width:80%;
    margin-left: 10%;
    margin-right: 10%;
    margin-bottom: 100%
  }
  @media screen and (orientation:landscape){
    .modal-dialog{
      margin-top: 70;
      width:80%;
      margin-left: 10%;
      margin-right: 10%;
      margin-bottom: 100%
    }
  }
  .modal-body{
    text-align: center;
  }
  .modal-body p{
    margin:14px 0px;
    font-size: 110%;
  }
  .modal-content{
    border-radius: 10px;
  }
  .modal-footer{
    padding:0px;
  }
  .modal-footer a{
    padding: 15px;
  }
  .modal-footer a:nth-child(1){
    border-radius: 0px 0px 0px 10px;
  }
  .modal-footer a:nth-child(2){
    border-radius: 0px 0px 10px 0px;
  }
  </style>
  <h2>Basic Modal Example</h2>
  <div data-toggle="modal" data-target="#myModal">Div for modal</div>
    <div class="modal fade" id="myModal" role="dialog">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-body">
            <p>确定要取消本次订单嘛?</p>
          </div>
          <div class="modal-footer">
            <div class="btn-group btn-group-justified">
              <a href="#" class="btn btn-default" data-dismiss="modal">取消</a>
              <a href="#" class="btn btn-default" data-dismiss="modal">确定</a>
            </div>
          </div>
        </div>
      </div>
    </div>
</div>
Martian2049
quelle