Ich weiß also, dass wir ein Div horizontal zentrieren können, wenn wir es verwenden margin:0 auto;
. Sollte margin:auto auto;
funktionieren, wie ich denke, dass es funktionieren sollte? Auch vertikal zentrieren?
Warum funktioniert das auch nicht vertical-align:middle;
?
.black {
position:absolute;
top:0;
bottom:0;
left:0;
right:0;
background:rgba(0,0,0,.5);
}
.message {
background:yellow;
width:200px;
margin:auto auto;
padding:10px;
}
<div class="black">
<div class="message">
This is a popup message.
</div>
</div>
Antworten:
Update August 2020
Obwohl das Folgende für die nützlichen Informationen immer noch lesenswert ist, haben wir Flexbox schon seit einiger Zeit. Verwenden Sie es einfach gemäß dieser Antwort .
Sie können nicht verwenden:
vertical-align:middle
weil es nicht für Elemente auf Blockebene giltmargin-top:auto
undmargin-bottom:auto
weil ihre verwendeten Werte als Null berechnet würdenmargin-top:-50%
weil prozentuale Randwerte relativ zur Breite des enthaltenen Blocks berechnet werdenTatsächlich machen es die Algorithmen zur Berechnung des Dokumentenflusses und der Elementhöhe unmöglich, Ränder zum vertikalen Zentrieren eines Elements innerhalb seines übergeordneten Elements zu verwenden. Wenn der Wert eines vertikalen Randes geändert wird, wird eine Neuberechnung der Höhe des übergeordneten Elements (Reflow) ausgelöst, die wiederum eine Neuzentrierung des ursprünglichen Elements auslöst. Dies macht es zu einer Endlosschleife.
Sie können verwenden:
Einige solche Problemumgehungen, die für Ihr Szenario funktionieren. Die drei Elemente müssen so verschachtelt sein:
JSFiddle funktioniert laut Browsershot einwandfrei .
quelle
#
ist ein Hack, dem die Regel vorangestellt wird, die nur von IE7 und darunter interpretiert wird. Sie bevorzugen stattdessen diese Regeln in einem IE-spezifischen Sheet enthalten bedingten Kommentare mit usw.position: absolute; top: 50%; transform: translateY(-50%);
ist es auch machbar und sehr beliebt ... (im Gegensatz dazu musstop:50%;margin: - $halfHeight
man die Größe nicht im Voraus kennen ...)Da diese Frage 2012 gestellt wurde und wir mit der Browserunterstützung für Flexboxen einen langen Weg zurückgelegt haben, hatte ich das Gefühl, dass diese Antwort obligatorisch ist.
Wenn die Anzeige des übergeordneten Containers ist
flex
, dann ja ,margin: auto auto
(auch bekanntmargin: auto
) arbeiten wird es zum Zentrum sowohl horizontal als auch vertikal, unabhängig davon , ob es ein istinline
oderblock
Element.Beachten Sie, dass die Breite / Höhe nicht unbedingt angegeben werden muss, wie in diesem Beispiel jfiddle, bei dem die Größe relativ zum Ansichtsfenster verwendet wird.
Obwohl die Browserunterstützung für Flexboxen zum Zeitpunkt der Veröffentlichung auf einem Allzeithoch ist, wird sie von vielen Browsern immer noch nicht unterstützt oder es werden Herstellerpräfixe benötigt. Aktuelle Informationen zur Browserunterstützung finden Sie unter http://caniuse.com/flexbox .
Aktualisieren
Da diese Antwort ein wenig Beachtung fand, möchte ich auch darauf hinweisen, dass Sie überhaupt nicht angeben müssen,
margin
ob Sie verwenden,display: flex
und alle Elemente im Container zentrieren möchten:quelle
Hier ist die beste Lösung, die ich gefunden habe: http://jsfiddle.net/yWnZ2/446/ Funktioniert in Chrome, Firefox, Safari, IE8-11 und Edge.
Wenn Sie ein erklärt haben
height
(height: 1em
,height: 50%
usw.) oder es ist ein Element , auf dem der Browser die Höhe weiß (img
,svg
, odercanvas
zum Beispiel), dann alles , was Sie für die vertikale Zentrierung benötigen , ist dies:Normalerweise möchten Sie ein
width
odermax-width
so angeben, dass sich der Inhalt nicht über die gesamte Länge des Bildschirms / Containers erstreckt.Wenn Sie dies für ein Modal verwenden, das immer im Ansichtsfenster zentriert sein soll und andere Inhalte überlappt, verwenden Sie es
position: fixed;
für beide Elemente anstelle vonposition: absolute
. http://jsfiddle.net/yWnZ2/445/Hier ist eine vollständigere Beschreibung: http://codepen.io/shshaw/pen/gEiDt
quelle
position: relative
zum übergeordneten Element hinzu , und das Element wird im übergeordneten Element zentriert. Ich habe im Smashing Magazine einen viel größeren Artikel über die Technik geschrieben, wenn Sie mehr lesen möchtenparent
. Vielen Dank!display: table
für Inhalte mit variabler Höhe verwenden. Andernfalls sollte diese Methode wie erwartet funktionieren. Lesen Sie die Beschreibung durch, um weitere Einzelheiten zu erfahren . Sie sollten auch in der Lage sein, die vollständige Ansicht in IE8 / 9 zu testen, um festzustellen, ob Probleme vorliegen.Bearbeiten: Es ist 2020, ich würde stattdessen Flexbox verwenden.
Ursprüngliche Antwort:
Html
CSS
quelle
Ich weiß, dass die Frage aus dem Jahr 2012 stammt, aber ich habe den einfachsten Weg aller Zeiten gefunden und wollte ihn teilen.
HTML:
und CSS:
quelle
Wenn Sie die Höhe des Divs kennen, das Sie zentrieren möchten , können Sie es absolut innerhalb des übergeordneten Div positionieren und dann den
top
Wert auf setzen50%
. Dadurch wird die Spitze des Kindes 50% des Weges des Elternteils gesenkt, dh zu niedrig. Ziehen Sie es wieder nach oben, indem Sie es auf diemargin-top
Hälfte seiner Höhe einstellen . Jetzt haben Sie den vertikalen Mittelpunkt des untergeordneten Divs am vertikalen Mittelpunkt des Elternteils - vertikal zentriert!Beispiel:
http://jsfiddle.net/yWnZ2/2/
quelle
margin-top
kann nicht in% bezogen auf die Elementhöhe eingestellt werden, so dass Sie mit einem Maße abhängig fix am Ende dannmargin-top
.Diese beiden Lösungen erfordern nur zwei verschachtelte Elemente.
Erstens - Relative und absolute Positionierung, wenn der Inhalt statisch ist (manuelle Mitte).
https://jsfiddle.net/GlupiJas/5mv3j171/
oder für flüssiges Design - für das genaue Content Center verwenden Sie stattdessen das folgende Beispiel:
https://jsfiddle.net/GlupiJas/w3jnjuv0/
Sie müssen die Mindesthöhe festlegen, falls der Inhalt 50% der Fensterhöhe überschreitet. Sie können diese Höhe auch mit einer Medienabfrage für Mobil- und Tablet-Geräte bearbeiten. Aber nur, wenn Sie mit Responsive Design spielen.
Ich denke, Sie könnten noch weiter gehen und ein einfaches JavaScript / JQuery-Skript verwenden, um die Mindesthöhe oder die feste Höhe zu ändern, wenn dies aus irgendeinem Grund erforderlich ist.
Zweitens : Wenn der Inhalt flüssig ist, können Sie auch CSS-Eigenschaften für Tabellen und Tabellenzellen mit vertikaler Ausrichtung und zentrierter Textausrichtung verwenden:
und
Funktioniert und skaliert perfekt und wird häufig als reaktionsschnelle Webdesign-Lösung mit Rasterlayouts und Medienabfragen verwendet, die die Breite des Objekts beeinflussen.
https://jsfiddle.net/GlupiJas/4daf2v36/
Ich bevorzuge eine Tabellenlösung für die exakte Inhaltszentrierung, aber in einigen Fällen ist die relative absolute Positionierung besser geeignet, insbesondere wenn wir den exakten Anteil der Inhaltsausrichtung nicht beibehalten möchten.
quelle
quelle
Es gibt keine einfache Möglichkeit, div vertikal zu zentrieren, die in jeder Situation den Trick macht.
Es gibt jedoch viele Möglichkeiten, dies je nach Situation zu tun.
Hier sind einige davon:
Sie können auch für "CSS vertikale Zentrierung" googeln
quelle
variable Höhe, Rand oben und unten automatisch
variable Höhe, Rand oben und unten automatisch
quelle
Verwenden der Flexbox:
HTML:
CSS:
Zeige Ergebnis
quelle
quelle