Zentrieren mit Flexbox - verschiedene Möglichkeiten
Geschrieben am:
Mit dem CSS-Layoutmodul Flexbox lassen sich Elemente einfach zentrieren.
Allerdings gibt es dafür unterschiedliche Ansätze: Entweder man verwendet zur Zentrierung die Eigenschaften align-items:center
und justify-content: center
oder aber man setzt dafür auf die altbekannte Eigenschaft margin
.
Nehmen wir folgende Ausgangsbasis:
<body>
<div class="zentriert">Zentriert :-)</div>
</body>
Das Element, das zentriert werden soll, befindet sich innerhalb von body
und hat keine festgelegte Höhe oder Breite.
Hinweis: inzwischen habe ich mich noch ein zweites Mal mit dem Thema der Zentrierung per margin und justify-content/align-items befasst.
Zentrieren mit align-items und justify-content
Der erste Ansatz sieht folgendermaßen aus.
Um .zentriert
zu zentrieren, machen wir body
zum Flexcontainer und sorgen mit align-items: center
und justify-content: center
für die mittige Anordnung des Flexitems. In der Standardsyntax sieht das folgendermaßen aus:
body {
display: flex;
align-items: center;
justify-content: center;
}
Bei jsfiddle gibt es das Beispiel zum Austesten - hier auch mit den anderen notwendigen Flexbox-Angaben für Browser, die Vorversionen von Flexbox verstehen: https://jsfiddle.net/fmaurice/8fg3kogm/
Zentrieren über margin
Eleganter, weil kürzer, ist es allerdings, wenn man die Zentrierung über margin
beim Flexitem erledigt. margin
hat nämlich bei Flexbox eine besondere Rolle: “Prior to alignment via justify-content and align-self, any positive free space is distributed to auto margins in that dimension” (http://www.w3.org/TR/css-flexbox-1/#auto-margins). Das heißt, bevor die Anordnung mit justify-content
und align-self
stattfindet, wird der freie Platz den Auto-Margins in dieser Richtung zugeschlagen. Damit erreichen wir auch eine Zentrierung über folgende Angaben:
body {
display: flex;
height: 100vh;
}
.zentriert {
margin: auto;
}
Von dieser kurzen knappen Lösung war ich begeistert … allerdings spielte der Internet Explorer 11 nicht mit. Hier ist der Inhalt zwar in der Horizontalen zentriert, aber nicht vertikal.
(Zuerst hatte ich noch vermutet, es würde an dem bekannten min-height
-Problem bei Flexbox im Internet Explorer herrühren, http://philipwalton.com/articles/normalizing-cross-browser-flexbox-bugs/, aber das war nicht der Fall).
https://jsfiddle.net/fmaurice/ak1ge773/
Kombi: Zentrieren mit align-items und margin
Deswegen empfiehlt sich eine Kombination der beiden Ansätze: für die vertikale Zentrierung greift man auf align-items
zurück, für die andere auf margin
: Und da es in älteren iOS-Safari zu Probleme mit height: 100vh
kommt, ist es besser auf height: 100%
zu setzen. Das ergibt also:
body {
display: flex;
height: 100%;
align-items: center;
}
.zentriert {
margin: auto;
}