Um das responsive Design so einfach wie möglich gestalten zu können, wurden mit CSS3 so genannte Flexboxen eingeführt. Diese haben einige Vorteile, welche das Layouten von Webseiten vereinfachen:
Dabei definiert der Webseitenentwickler nur das gewünschte Verhalten – die Positionierung von Boxen berechnet der Browser automatisch.
Basis für das Seitenlayout mit Flexboxen ist die Annahme, dass die Boxen,
welche angeordnet werden sollen, in einer gemeinsamen Container-Box stehen,
d.h., man geht immer von einer verschachtelten Struktur aus. Dies leitet sich auch
vom "Mobile First"-Prinzip ab: zunächst werden alle Boxen für das Seitenlayout
definiert, anschließend werden sie mit Inhalten gefüllt (Elemente p
,
ul/ol
, a
oder img
usw.). Die
Seitenlayoutboxen werden oft als Flexboxen benutzt.
Im folgenden Beispiel ist eine verschachtelte Struktur und ihr Standardaufbau im
Browser
dargestellt: die blau umrandete Container-Box enthält vier farblich gekennzeichnete
div
-Boxen. Diese werden standardmäßig im Browser nach den folgenden
Regeln angeordnet:
See the Pen CSS – Flexboxen – Standard by Barbara Dörsam, HdM Stuttgart (@bdhdm) on CodePen.
Nun kann aus der Container-Box eine Flexbox gemacht werden: Flexboxen werden
durch
den Wert flex
für die Eigenschaft display
für den
Container definiert:
#container {
display: flex;
}
Bei den enthaltenen Boxen (Flex-Items) müssen keine weiteren Informationen hinterlegt werden. Der Browser berechnet standardmäßig die Breite und Höhe aller direkt enthaltenen Boxen so, dass sie
See the Pen CSS – Flexboxen – Flex by Barbara Dörsam, HdM Stuttgart (@bdhdm) on CodePen.
Neben der Eigenschaft display: flex;
kann noch die Richtung der
enthaltenen Boxen definiert werden.
Dafür steht das Attribut flex-direction
zur Verfügung:
flex-direction: row;
flex-direction: column;
flex-direction: row-reverse;
row
, allerdings werden die Boxen in der umgekehrten
Reihenfolge dargestellt.flex-direction: column-reverse;
column
, allerdings werden die Boxen in der umgekehrten
Reihenfolge dargestellt.
Setzen Sie im obigen Beispiel das
Attribut
flex-direction
für das Element #container
und
belegen
Sie
es nacheinander mit verschiedenen Werten.
Beobachten Sie die Änderungen in der
Browser-Ansicht.
Falls der Online-Editor gerade nicht zugänglich sein sollte, können Sie das
Beispiel hier herunterladen.
Entzippen Sie das Zip-Archiv und betrachten Sie die HTML- und CSS-Dateien im
Verzeichnis 01_Layout_als_Flexbox
.
Fassen Sie die Auswirkungen der unterschiedlichen Werte in dem Dokument "Flexboxen.docx" zusammen.
Falls Sie kein MS Word haben, steht hier auch das PDF zur Verfügung.
Die Flex-Items werden anhand zweier Achsen ausgerichtet, der
Hauptachse und
der Querachse.
Welche Achse damit gemeint ist, hängt vom Wert der Eigenschaft
flex-direction
ab:
row
oder row-reverse
:
column
oder column-reverse
:
Entlang dieser beiden Achsen können nun die Inhalte einer Flexbox ausgerichtet werden.
Die Ausrichtung an der Hauptachse erfolgt mit der Eigenschaft
align-items
:
See the Pen CSS – Flexboxen – AlignItems by Barbara Dörsam, HdM Stuttgart (@bdhdm) on CodePen.
Das Attribut
align-items
kann folgende Werte haben (die Erläuterung im Text bezieht
sich auf die Einstellung
flex-direction: row;
):
stretch
flex-start
flex-end
center
Belegen Sie im obigen Beispiel das
Attribut
align-items
nacheinander mit verschiedenen Werten.
Beobachten Sie die Änderungen in der
Browser-Ansicht.
Überprüfen Sie auch die Auswirkungen, wenn die Eigenschaft
flex-direction: column;
gesetzt ist.
Falls der Online-Editor gerade nicht zugänglich sein sollte, können Sie das
Beispiel hier herunterladen bzw.
das Archiv aus dem letzten Schritt benutzen.
Betrachten Sie die HTML- und CSS-Dateien im
Verzeichnis 02_Ausrichtung_an_der_Hauptachse
.
Fassen Sie die Auswirkungen der unterschiedlichen Werte in dem Dokument "Flexboxen.docx" zusammen.
Falls Sie kein MS Word haben, steht hier auch das PDF zur Verfügung.
Die Ausrichtung an der Querachse erfolgt mit der Eigenschaft
justify-content
:
See the Pen CSS – Flexboxen – JustifyContent by Barbara Dörsam, HdM Stuttgart (@bdhdm) on CodePen.
Verändern Sie im obigen Beispiel das Attribut
justify-content
und beobachten Sie die Änderungen in der
Browser-Ansicht (bei der Einstellung: flex-direction: row;
):
flex-start
flex-end
center
space-between
space-around
Beachten Sie: die Einstellungen machen nur Sinn, wenn die enthaltenen Boxen insgesamt nicht so breit sind wie die Containerbox, d.h., es muss noch horizontaler Platz übrig bleiben, um die Boxen horizontal ausrichten zu können.
Belegen Sie im obigen Beispiel das
Attribut
justify-content
nacheinander mit verschiedenen Werten.
Beobachten Sie die Änderungen in der
Browser-Ansicht.
Überprüfen Sie auch die Auswirkungen, wenn die Eigenschaft
flex-direction: column;
gesetzt ist. Achten Sie dabei darauf,
dass
die die Höhe der Container-Box beschränken müssen, um eine Auswirkung zu
sehen.
Falls der Online-Editor gerade nicht zugänglich sein sollte, können Sie das
Beispiel hier herunterladen bzw.
das Archiv aus dem letzten Schritt benutzen.
Betrachten Sie die HTML- und CSS-Dateien im
Verzeichnis 03_Ausrichtung_an_der_Querachse
.
Fassen Sie die Auswirkungen der unterschiedlichen Werte in dem Dokument "Flexboxen.docx" zusammen.
Falls Sie kein MS Word haben, steht hier auch das PDF zur Verfügung.
Solten die Flex-Items sehr breit werden, ist es oft sinnvoll, sie bei
schmaleren Browserfenstern teilweise auch untereinander anordnen zu können.
Um dieses Verhalten zu erreichen, gibt es die Eigenschaft
flex-wrap
Sie definiert einen automatischen Zeilenumbruch für Flex-Items, wenn diese insgesamt zu breit für den Container sind:
See the Pen CSS – Flexboxen – FlexWrap by Barbara Dörsam, HdM Stuttgart (@bdhdm) on CodePen.
Das Attribut
flex-wrap
kann folgende Werte haben (bei der Einstellung:
flex-direction: row;
):
no-wrap
wrap
wrap-reverse
Wird die Eigenschaft flex-wrap: wrap
oder
flex-wrap: wrap-reverse
gesetzt, so kann zusätzlich definiert
werden, wie die vertikale Verteilung der Zeilen erfolgt.
See the Pen CSS – Flexboxen – AlignContent by Barbara Dörsam, HdM Stuttgart (@bdhdm) on CodePen.
Das Attribut
align-content
kann dabei folgende Werte haben:
flex-start
flex-end
center
space-between
space-around
stretch
Belegen Sie im obigen Beispiel das
Attribut flex-wrap
und
align-content
nacheinander mit verschiedenen Werten.
Beobachten Sie die Änderungen in der
Browser-Ansicht.
Falls der Online-Editor gerade nicht zugänglich sein sollte, können Sie das
Beispiel hier herunterladen bzw.
das Archiv aus dem letzten Schritt benutzen.
Betrachten Sie die HTML- und CSS-Dateien im
Verzeichnis 04_Zeilenumbruch
.
Fassen Sie die Auswirkungen der unterschiedlichen Werte in dem Dokument "Flexboxen.docx" zusammen.
Falls Sie kein MS Word haben, steht hier auch das PDF zur Verfügung.
Mit der Eigenschaft flex-basis
kann die Basisbreite der
Flex-Items definiert werden.
Diese Eigenschaft wird tatsächlich bei den einzelnen Flex-Items gesetzt,
nicht in der Flexbox selbst.
Folgende Werte können für die Basisbreite der Flexitems gesetzt werden:
content
auto
See the Pen CSS - Flexboxen - FlexBasis by Barbara Dörsam, HdM Stuttgart (@bdhdm) on CodePen.
Die CSS3- und HTML5-Standards werden ständig weiter entwickelt. Viele Browser-Hersteller setzen CSS-Eigenschaften auch schon in einem frühen Zustand des Standards um, noch bevor der Standard endgültig freigegeben wird. Browser setzen neue CSS-Regeln oft auch als „private“ Eigenschaften, d.h., ihre Eigenschaften werden nicht vom Standard, sondern vom Browser-Hersteller definiert.
Um solche Eigenschaften zu kennzeichnen, gibt es so genannte Browser-Präfixe. Browser-Präfixe werden für diejenigen Browser benutzt, die eine CSS-Regel experimentell bieten. Wenn eine CSS-Regel final standardisiert wurde und ein Browser diese unterstützt, kann der Browser-Präfix gelöscht werden.
Folgende Browser-Präfixe werden benutzt:
Präfix | Browser |
---|---|
-moz- |
Firefox |
-ms- |
Internet Explorer |
-khtml- |
Konqueror |
-o- |
Opera (ältere Versionen) |
-webkit- |
Chrome, Opera (neue Versionen), Safari |
Beispiel:
#container {
display: -webkit-flex;
display: flex;
-webkit-flex-wrap: wrap;
flex-wrap: wrap;
-webkit-justify-content: space-between;
justify-content: space-between;
}