Flexbox: Horizontal und vertikal zentrieren
Wie man div horizontal und vertikal innerhalb des Containers mit Flexbox zentriert. Im folgenden Beispiel möchte ich jede Zahl unter einander (in Reihen), die horizontal zentriert sind.
.flex-container {
padding: 0;
margin: 0;
list-style: none;
display: flex;
align-items: center;
justify-content: center;
}
row {
width: 100%;
}
.flex-item {
background: tomato;
padding: 5px;
width: 200px;
height: 150px;
margin: 10px;
line-height: 150px;
color: white;
font-weight: bold;
font-size: 3em;
text-align: center;
}
<div class="flex-container">
<div class="row">
<span class="flex-item">1</span>
</div>
<div class="row">
<span class="flex-item">2</span>
</div>
<div class="row">
<span class="flex-item">3</span>
</div>
<div class="row">
<span class="flex-item">4</span>
</div>
</div>
579
3
Ich denke, Sie wollen etwas wie das Folgende.
Siehe Demo unter: http://jsfiddle.net/audetwebdesign/tFscL/
Ihre
.flex-item'-Elemente sollten auf Blockebene sein (
divstatt
span`), wenn Sie wollen, dass die Höhe und das obere/untere Padding richtig funktionieren.Setzen Sie außerdem bei
.row
die Breite aufauto
anstelle von100%
.Ihre
.flex-container
Eigenschaften sind in Ordnung.Wenn Sie möchten, dass die "row" vertikal im Viewport zentriert wird, weisen Sie "html" und "body" eine Höhe von 100 % zu und heben Sie auch die Ränder von "body" auf.
Beachten Sie, dass
.flex-container
eine Höhe benötigt, um den Effekt der vertikalen Ausrichtung zu sehen, andernfalls berechnet der Container die minimale Höhe, die benötigt wird, um den Inhalt zu umschließen, was in diesem Beispiel weniger als die Höhe des Viewports ist.Fußnote: Die Eigenschaften
flex-flow
,flex-direction
,flex-wrap
hätten dieses Design einfacher implementieren können. Ich denke, dass der "row"-Container nicht benötigt wird, es sei denn, man möchte den Elementen ein gewisses Styling hinzufügen (Hintergrundbild, Rahmen usw.).Eine nützliche Ressource ist: http://demo.agektmr.com/flexbox/
Wie man Elemente in Flexbox vertikal und horizontal zentriert
Im Folgenden finden Sie zwei allgemeine Lösungen für die Zentrierung.
Eine für vertikal ausgerichtete Flexelemente (
flex-direction: column
) und die andere für horizontal ausgerichtete Flexelemente (flex-direction: row
).In beiden Fällen kann die Höhe der zentrierten Divs variabel, undefiniert, unbekannt oder wie auch immer sein. Die Höhe der zentrierten Divs spielt keine Rolle.
Hier's das HTML für beide:
CSS (ohne dekorative Stile)
Wenn Flex-Elemente vertikal gestapelt werden:
[DEMO](http://jsfiddle.net/8o29y7pd/)
Wenn Flexelemente horizontal gestapelt werden:
Passen Sie die Regel "flex-direction" aus dem obigen Code an.
[DEMO](http://jsfiddle.net/8o29y7pd/3/)
Zentrierung des Inhalts der flexiblen Elemente
Der Geltungsbereich eines [Flex-Formatierungskontexts] (https://www.w3.org/TR/css-flexbox-1/#flex-containers) ist auf eine Eltern-Kind-Beziehung beschränkt. Die Nachkommen eines Flex-Containers, die über die Kinder hinausgehen, nehmen nicht am Flex-Layout teil und ignorieren die Flex-Eigenschaften. Im Grunde genommen sind Flex-Eigenschaften nicht über die Kinder hinaus vererbbar.
Daher müssen Sie immer
display: flex
oderdisplay: inline-flex
auf ein übergeordnetes Element anwenden, um Flex-Eigenschaften auf das Kind anzuwenden.Um Text oder andere Inhalte, die in einem flex-Element enthalten sind, vertikal und/oder horizontal zu zentrieren, machen Sie das Element zu einem (verschachtelten) flex-Container und wiederholen Sie die Zentrierungsregeln.
Mehr Details hier: https://stackoverflow.com/q/25311541/3597276
Alternativ können Sie auch
margin: auto
auf das Inhaltselement des flex-Elements anwenden.Erfahren Sie mehr über Flex
auto
margins hier: Methoden zum Ausrichten von Flex-Elementen (siehe Box#56).Zentrieren mehrerer Zeilen von Flex-Elementen
Wenn ein Flex-Container mehrere Zeilen hat (aufgrund von Umbrüchen), ist die Eigenschaft
align-content
für die achsenübergreifende Ausrichtung notwendig.Aus der Spezifikation:
[**8.4. Packing Flex Lines: the
align-content
Mehr Details hier: https://stackoverflow.com/q/42613359/3597276
Browser-Unterstützung
Flexbox wird von allen wichtigen Browsern unterstützt, außer IE < 10. Einige neuere Browser-Versionen, wie Safari 8 und IE10, erfordern Hersteller-Präfixe. Für eine schnelle Möglichkeit, Präfixe hinzuzufügen, verwenden Sie Autoprefixer. Mehr Details in diese Antwort.
Zentrierungslösung für ältere Browser
Eine alternative Lösung für die Zentrierung mithilfe von CSS-Tabellen und Positionierungseigenschaften finden Sie in dieser Antwort: https://stackoverflow.com/a/31977476/3597276
Vergessen Sie nicht, wichtige browserspezifische Attribute zu verwenden:
align-items: center; -->
justify-content: center; -->
Zum besseren Verständnis von Flex können Sie diese beiden Links lesen: http://css-tricks.com/almanac/properties/j/justify-content/ und http://ptb2.me/flexbox/
Viel Glück!