Was ist Flexbox?
CSS bietet viele Werkzeuge und Eigenschaften, die wir verwenden können, um Elemente auf einer Webseite zu positionieren.
In dieser Lektion lernen wir das Flexible Box Modell Layout oder Flexbox kennen, ein Tool, das die Positionierung von Elementen erheblich vereinfacht.
Ein Flexbox-Layout besteht aus zwei wichtigen Komponenten: Flex-Container und Flex-Elementen.
Ein Flex-Container ist ein Element auf einer Seite, das Flex-Elemente enthält. Alle direkten untergeordneten Elemente eines Flex-Containers sind Flex-Elemente. Diese Unterscheidung ist wichtig, da einige der Eigenschaften, die wir in dieser Lektion lernen, für Flex-Container gelten, während andere für Flex-Elemente gelten.
Um ein Element als Flex-Container zu kennzeichnen, legen wir die display Eigenschaft auf flex oder inline-flex. Sobald ein Element ein Flex-Container ist, gibt es mehrere Eigenschaften, mit denen wir festlegen können, wie sich seine untergeordneten Elemente verhalten.
In dieser Lektion werden wir diese Eigenschaften behandel:
justify-content
align-items
flex-grow
flex-shrink
flex-basis
flex
flex-wrap
align-content
flex-direction
flex-flow
Flexbox ist ein elegantes Tool, mit dem sich Positionierungsprobleme, die vorher möglicherweise schwierig waren, ganz einfach lösen lassen.
Jedes Element kann ein Flex-Container sein. Flex-Container sind hilfreiche Tools zum Erstellen von Webseiten, die auf Änderungen der Bildschirmgröße reagieren. Untergeordnete Elemente von Flex-Containern ändern ihre Größe und Position ihres übergeordneten Containers.
Damit ein Element zu einem Flex-Container wird, muss seine Anzeigeeigenschaft auf Flex gesetzt sein.
Im obigen Beispiel sind alle Divs mit der Klasse container, Flex-Container. Wenn wir untergeordnete Elemente haben, sind diese flexible Elemente. Ein Div mit der Deklaration display:flex; bleibt auf Blockebene - keine anderen Elemente erscheinen in derselben Zeile.
Allerdings ändert sich dadurch das Verhalten der untergeordneten Elemente. Untergeordnete Elemente beginnen nicht in neuen Zeilen. In den folgenden Übungen werden wir behandeln, wie sich die Flex-display Eigenschaft auf die Positionierung untergeordneter Elemente auswirkt.
In der vorherigen Übung haben wir vielleicht bemerkt, dass, als wir einem div - einem Element auf Blockebene - den display Wert flex gaben, es ein Element auf Blockebene blieb. Was ist, wenn wir möchten, dass mehrere Flex-Container inline miteinander angezeigt werden?
Wenn wir nicht wollen, dass div-Elemente, Elemente auf Blockebene sind, würden wir display: inline; verwenden. Flexbox stellt jedoch den inline-flex Wert für die Display-Eigenschaft bereit, der es uns ermöglicht, Flex-Container zu erstellen, die auch Inline Elemente sind.
Im obigen Beispiel gibt es zwei Container-Divs. Ohne eine Breite würde jedes Div die gesamte Breite der Seite ausdehnen. Die Absätze innerhalb jedes Divs würden auch übereinander angezeigt, da es sich bei Absätzen um Elemente auf Blockebene handelt.
Wenn wir den Wert der Anzeigeeigenschaft in inline-flex ändern, werden die Divs inline zueinander angezeigt, wenn die Seite breit genug ist. Im Verlauf dieser Lektion werden wir detaillierter darauf eingehen, wie flexible Elemente anzeigt werden.
Beachten wir, dass im obigen Beispiel die Größe des Flex-Containers festgelegt ist. Derzeit überschreibt die Größe des übergeordneten Containers die Größe seiner untergeordneten Elemente. Wenn das übergeordnete Element zu klein ist, werden die flexiblen Elemente verkleinert, um sie an die Größe des übergeordneten Containers anzupassen. Warum das so ist, schauen wir uns in einer späteren Übung an.
Im obigen Beispiel beanspruchen die .child Divs mehr Breite (300 Pixel), als das container Div zulässt (200 Pixel). Die .child Divs werden verkleinert, um sie an die Größe des Containers anzupassen. In späteren Übungen werden wir verschiedene Möglichkeiten erkunden, damit umzugehen.
Als wir in früheren Übungen den display Wert der übergeordneten Container in flex oder inline-flex geändert haben, wurden alle untergeordneten Elemente (Flex-Elemente) in Richtung der oberen linken Ecke des übergeordneten Containers verschoben. Dies ist das Standardverhalten von Flex-Containern und ihren untergeordneten Elementen. Wir können angeben, wie sich Flex-Elemente entlang der Hauptachse von links nach rechts ausbreiten. In einer späteren Übung erfahren wir mehr über Achsen.
Um die Elemente von links nach rechts zu positionieren, verwenden wir eine Eigenschaft namens justify-content.
Im obigen Beispiel setzen wir den Wert von justify-content auf flex-end. Dadurch werden alle Flex-Elemente auf die rechte Seite des Flex-Containers verschoben.
Nachfolgend sind fünf häufig verwendete Werte für die Eigenschaft "justify-content" aufgeführt:
flex-start - Alle Elemente werden der Reihe nach positioniert, beginnend links vom übergeordneten Container, ohne zusätzlichen Abstand zwischen oder vor ihnen.
flex-end - Alle Elemente werden der Reihe nach positioniert, wobei das letze Element auf der rechten Seite des übergeordneten Containers beginnt und kein zusätzlicher Abstand zwischen oder nach ihnen besteht.
center - Alle Elemente werden der Reihe nach in der Mitte des übergeordneten Containers positioniert, ohne zusätzlichen Platz davor, dazwischen oder danach.
space-around - Elemente werden mit gleichem Abstand vor und nach jedem Element positioniert, was zu einem doppelten Abstand zwischen den Elementen führt.
space-between - Elemente werden mit gleichem Abstand zwischen ihnen positioniert, jedoch ohne zusätzlichen Abstand vor dem ersten oder nach den letzen Elementen.
In den obigen Definitionen bedeutet "kein zusätzlicher Leerraum", dass die äußeren Abstände zu nebenliegenden Elementen (margins) und die äußeren Ränder des Elements (borders) beachtet werden, aber zwischen den Elementen nicht mehr Leerraum (als in der Stilregel für das jeweilige Element angegeben) hinzugefügt wird. Die Größe jedes einzelnen Flex-Elements wird durch diese Eigenschaft nicht verändert.
In der vorherigen Übung haben wir gelernt, wie wir den Inhalt eines Flex-Containers von links nach rechts auf der Seite ausrichten. Es ist auch möglich, Flex-Artikel vertikal innerhalb des Containers auszurichten. Die Eigenschaft align-items ermöglicht es, Flex-Elemente vertikal anzuordnen.
Im obigen Beispiel ist die Eigenschaft align-items auf "baseline" gesetzt, Dies bedeutet, dass die Grundlinie des Inhalts jedes Elements ausgerichtet wird.
Nachfolgend sind fünf häufig verwendete Werte für die Eigenschaft align-items aufgeführt:
flex-start - Alle Elemente werden oben im übergeordneten Container positioniert.
flex-end - Alle Elemente werden am unteren Rand des übergeordneten Containers positioniert.
center - Die Mitte aller Elemente wird auf halbem Weg zwischen der Ober- und Unterseite des übergeordneten Containers positioniert.
baseline - Am unteren Rand wird der Inhalt aller Elemente aneinander ausgerichtet.
stretch - Wenn möglich, werden die Elemente vom oberen zum unteren Rand des Containers gestreckt (dies ist der Standardwert, Elemente mit einer angegebenen Höhe werden nicht gestreckt, Elemente mit einer minimalen Höhe oder kleiner angegebenen Höhe werden gestreckt).
Diese fünf Werte sagen den Elementen, wie sie sich entlang der Querachse des übergeordneten Containers verhalten sollen. In diesen Beispielen erstreckt sich die Querachse von der Ober- bis zur Unterseite des Containers. Wir werden in einer zukünftigen Übung mehr darüber erfahren.
Möglicherweise sind wir mit den Eigenschaften min-height und max-height, min-width und max-width nicht vertraut, die sicherstellen, dass ein Element mindestens eine bestimmte Größe oder höchstens eine bestimmte Größe hat. Wir werden sehen, wie nützlich diese im Verlauf dieser Lektion werden.
Jetzt werden wir jeden der fünf oben genannten Werte in Aktion sehen!
In der Übung Inline-Flex haben wir gelernt, dass alle Flex-Elemente proportional schrumpfen, wenn der Flex-Container zu klein ist. Wenn der übergeordnete Container jedoch größer als nötig ist, werden die Flex-Elemente standardmäßig nicht gedehnt. Mit der flex-grow Eigenschaft können wir festlegen, ob Elemente wachsen sollen, um einen Container zu füllen, und auch, welche Elemente proportional mehr oder weniger wachsen sollen als andere.
Im obigen Beispiel hat das .container Div den Anzeigewert flex, sodass seine drei untergeordneten Divs nebeneinander positioniert werden. Wenn im .container Div zusätzlicher Platz vorhanden ist (in diesem Fall, wenn es breiter als 300 Pixel ist), werden die Flex-Elemente vergrößert, um ihn auszufüllen. Das .center Div wird doppelt so stark gedehnt wie die .side Divs. Wenn zum Beispiel 60 zusätzliche Pixel Platz wären, würde das mittlere Div 30 Pixel absorbieren und die seitlichen Divs würden jeweils 15 Pixel absorbieren.
Wenn für ein Element eine maximale Breite (max-width) festgelegt ist, wird es nicht größer, selbst wenn mehr Platz zum Absorbieren vorhanden ist.
Alle zuvor gelernten Eigenschaften werden in Flex-Containern oder den übergeordneten Elementen deklariert. Diese Eigenschaft flex-grow ist die erste, die wir gelernt haben und die für Flex-Elemente deklariert wird.
So wie die Eigenschaft flex-grow, flexible Elemente proportional streckt, kann die Eigenschaft flex-shrink verwendet werden, um anzugeben, welche Elemente in welchen Proportionen verkleinert werden.
Möglicherweise ist uns in früheren Übungen aufgefallen, dass Flex-Elemente schrumpfen, wenn der Flex-Container zu klein war, obwohl wir die Eigenschaft nicht deklariert hatten. Dies liegt daran, dass der Standardwert von flex-shrink 1 ist. Flex-Elemente wachsen jedoch nicht, es sei denn, die Eigenschaft flex-grow wird deklariert, da der Standardwert von flex-grow 0 ist.
Im obigen Beispiel wird das .center Div doppelt so stark verkleinert wie die .side Divs, wenn das .container Div zu klein ist, um die darin enthaltenen Elemente aufzunehmen. Wenn der Inhalt 60 Pixel zu groß für den ihn umgebenden Flex-Containers ist, wird das .center Div um 30 Pixel und die äußeren Divs um jeweils 15 Pixel verkleinert. Die Ränder werden durch flex-grow und flex-shrink nicht beeinflusst.
Beachten wir, dass die minimale und maximale Breite Vorrang vor Flex-vergrößerung und Flex-verschrumpfung hat. Wie bei flex-grow wird flex-shrink nur verwendet, wenn der übergeordnete Container zu klein ist oder der Browser angepasst wird.
In den beiden vorherigen Übungen wurden die Abmessungen der Divs durch die mit CSS festgelegten Höhen und Breiten bestimmt. Eine andere Möglichkeit zur Festlegung der Breite eines Flex-Elements ist mit der flex-basis Eigenschaft. Flex-basis ermöglicht uns, die Breite eines Elements anzugeben, bevor es gedehnt oder verkleinert wird.
Im obigen Beispiel sind die .side Divs 100 Pixel breit und das .center Div 150 Pixel breit, wenn das .container Div genau die richtige Menge an Platz hat (350 Pixel plus etwas mehr für Ränder und Rahmen). Wenn das .container Div größer ist, nimmt das .center Div doppelt so viel Platz ein wie die .side Div.
Das Gleiche würde gelten, wenn wir auch den oben genannten Divs flex-shrink Werte zuweisen würden.
Die Kurzschrift-Eigenschaft flex bietet eine bequeme Möglichkeit, anzugeben, wie Elemente gedehnt und verkleinert werden, und vereinfacht gleichzeitig das erforderliche CSS. Mit der Flex-Eigenschaft können wir flex-grow, flex-shrink und flex-basis in einer Zeile deklarieren.
Hinweis: Die Flex-Eigenschaft unterscheidet sich vom Flex-Wert, der für die Display-Eigenschaft verwendet wird.
Im obigen Beispiel wachsen alle Elemente mit der Klasse "groß" doppelt so stark wie Elemente mit der Klasse "klein". Bedenken wir, dass dies nicht bedeutet, dass große Elemente doppelt so groß sind wie kleine Elemente, sondern dass sie nur mehr zusätzlichen Platz beanspruchen.
Das folgende CSS deklariert diese drei Eigenschaften in einer Zeile:
Im obigen Beispiel verwenden wir die Eigenschaft flex um die Werte für flex-grow, flex-shrink und flex-basis (in dieser Reihenfolge) alle in einer Zeile zu deklarieren.
Im obigen Beispiel verwenden wir die Flex-Eigenschaft, um flex-grow und flex-shrink zu deklarieren, aber nicht flex-basis.
Im obigen Beispiel verwenden wir die Flex-Eigenschaft, um flex-grow und flex-basis zu deklarieren. Beachten wir, dass es keine Möglichkeit gibt, nur flex-shrink und flex-basis mit zwei Werten festzulegen.
Manchmal möchten wir nicht, dass unser Inhalt verkleinert wird, um in den Container zu passen. Stattdessen möchten wir, dass Flex-Elemente bei Bedarf in die nächste Zeile verschoben werden. Dies kann mit der Eigenschaft flex-wrap deklariert werden.
Die flex-wrap Eigenschaft kann drei Werte annehmen:
wrap - Untergeordnete Elemente eines Flex-Containers, die nicht in eine Zeile passen, werden in die nächste Zeile verschoben
wrap-reverse - Dieselbe Funktionalität wie wrap, aber die Reihenfolge der Zeilen innerhalb eines Flex-Containers ist umgekehrt (z.B. wird in einer zweireihigen Flexbox die erste Zeile aus einem wrap-Container zur zweiten in umgekehrter Reihenfolge und die zweite Zeile aus dem wrap-Container zur ersten in umgekehrter Reihenfolge)
nowrap - verhindert das Umbrechen von Elementen. Dies ist der Standardwert und ist nur erforderlich, um einen durch eine andere CSS-Regel festgelegten Umbruchwert zu überschreiben.
Im obigen Beispiel sind drei Flex-Elemente in einem übergeordneten Flex-Container enthalten. Der Flex-Container ist nur 250 Pixel breit, sodass die drei 100 Pixel breiten Flex-Elemente nicht in die selbe Zeile passen. Die Einstellung flex-wrap: wrap; bewirkt, dass das ditte, überlaufende Element in einer neuen Zeile unter den beiden anderen Elementen angezeigt wird.
Hinweis: Die flex-wrap Eigenschaft wird auf Flex-Containern deklariert.
Manchmal möchten wir nicht, dass unsere Inhalte verkleinert werden, damit sie in den Container passen. Stattdessen möchten wir möglicherweise, dass flexible Elemente bei Bedarf in die nächste Zeile verschoben werden. Dies kann mit der Flex-Eigenschaft deklariert werden.
Die Eigenschaft align-items kann drei werte annehmen:
Align-Items dient zum Ausrichten von Elementen innerhalb einer einzelnen Zeile. Wenn ein Flex-Container über mehrere Inhaltszeilen verfügt, können wir align-content verwenden, um die Zeilen von oben nach unten anzuordnen.
Nachfolgend sind einige der am häufigsten verwendeten align-content Werte aufgeführt:
flex-start - Alle Elementreihen werden oben im übergeordneten Container ohne zusätzlichen Abstand dazwischen positioniert.
flex-end - Alle Elementreihen werden am unteren Rand des übergeordneten Containers ohne zusätzlichen Abstand dazwischen positioniert.
center - Alle Elementreihen werden in der Mitte des übergeordneten Elements ohne zusätzlichen Abstand dazwischen positioniert.
space-between - Alle Elementreihen werden gleichmäßig von der Ober- bis zur Unterseite des Containers verteilt, ohne dass über der ersten oder unter der letzen Platz ist.
space-around - Alle Elementreihen werden in gleichmäßigen Abständen von der Ober- bis zur Unterseite des Containers angeordnet, mit dem gleichen Abstand oben und unten sowie zwischen den einzelnen Elementen.
stretch - Wenn eine Mindesthöhe oder keine Höhe angegeben ist, werden die Elementreihen so gestreckt, dass sie den übergeordneten Container von oben nach unten ausfüllen (Standardwert).
Im obigen Beispiel befinden sich vier Flex Elemente in einem Flex Container. Die Flex Elemente sind jeweils auf eine Breite von 150 Pixel eingestellt, der übergeordnete Container ist jedoch nur 400 Pixel breit. Dies bedeutet, dass nicht mehr als zwei Elemente auf der selben Zeile angezeigt werden können. Die anderen beiden Elemente werden in die nächste Zeile umgebrochen und im Flex Container befinden sich zwei Reihen von Divs gleichmäßig von oben nach unten im übergeordneten Container verteilt sind, mit gleichem Abstand vor der ersten Reihe und nach der zweiten, mit einem doppeltem Abstand zwischen den Zeilen.
Hinweis: Die Eigenschaft align-content wird für Flex Container deklariert.
Bisher haben wir nur flexible Artikel behandelt, die sich horizontal dehnen und schrumpfen und vertikal wickeln lassen. Wie bereits erwähnt, haben Flex-Container zwei Achsen: eine Hauptachse und eine Querachse. Standardmäßig ist die Hauptachse horizontal und die Querachse vertikal.
Die Hauptachse dient zur Positionierung von Flex-Elementen mit folgenden Eigenschaften:
justify-content
flex-wrap
flex-grow
flex-shrink
Die Querachse dient zur Positionierung von Flex-Elementen mit folgenden Eigenschaften:
align-items
align-content
Hauptachse und Querachse sind austauschbar. Wir können sie mit der flex-direction Eigenschaft wechseln. Wenn wir die Eigenschaft "flex-direction" hinzufügen und ihr den Wert "column" (Spalte) zuweisen, werden die Flex-Elemente vertikal und nicht horizontal angeordnet.
Im obigen Beispiel werden die fünf Divs in einer vertikalen Spalte positioniert. Alle diese Divs könnten in eine horizontale Reihe passen. Der Spaltenwert weist den Browser jedoch an, die Divs übereinander zu stapeln. Wie oben erläutert, verhalten sich Eigenschaften wie justify-content nicht wie in den vorherigen Beispielen.
Die Eigenschaft "flex-direction" kann vier Werte annehmen:
row - Elemente werden von links nach rechts über das übergeordnete Element positioniert, beginnend in der oberen linken Ecke (Standard).
row-reverse - Elemente werden von rechts nach links über das übergeordnete Element positioniert, beginnend in der oberen rechten Ecke.
column - Elemente werden von oben nach unten am übergeordneten Element positioniert, beginnend in der oberen linken Ecke.
column-reverse - Elemente werden von unten nach oben am übergeordneten Element positioniert, beginnend in der unteren linken Ecke.
Hinweis: Die Eigenschaft "flex-direction" wird für Flex-Container deklariert.
Wie die Kurzschrift Eigenschaft flex wird auch die Kurzform-Eigenschaft flex-flow verwendet, um sowohl die Eigenschaft flex-wrap als auch flex-direction in einer Zeile zu deklarieren.
Im obigen Beispiel verwenden wir zwei Zeilen, um das zu erreichen, was auch mit einer Zeile erreicht werden kann.
Im obigen Beispiel ist der erste Wert in der flex-flow-Deklaration ein flex-direction-Wert und der zweite ein flex-wrap-Wert. Alle Werte für flex-direction und flex-wrap werden akzeptiert.
Hinweis: Die Eigenschaft "flex-flow" wird für Flex-Container deklariert.
Bisher hatten wir mehrere Flex-Container auf derselben Seite, um die Positionierung von Flex-Elementen zu untersuchen. Es ist auch möglich, Flex-Container ineinander zu positionieren.
Im obigen Beispiel wird ein Div mit drei kleineren Bildern von oben nach unten auf der linken Seite der Seite angezeigt (.left). Es gibt auch ein Div mit einem großen Bild, das auf der rechten Seite der Seite angezeigt wird (.rechts). Das linke Div hat eine kleinere flex-basis aber dehnt sich, um mehr zusätzlichen Raum zu füllen, das rechte Div hat eine größere flex-basis, aber dehnt sich, um weniger zusätzlichen Raum zu füllen. Beide Divs sind Flex-Elemente und Flex-Container. Die Elemente haben Eigenschaften, die bestimmen, wie sie im übergeordneten Container positioniert werden und wie ihre Flex-Unterelemente in ihnen positioniert werden.
Wir haben bereits wichtige Eigenschaften von Flexboxen kennengelernt. Wichtig ist das man diese Eigenschaften oft übt und ausprobiert um zu wissen, was jede Eigenschaft bewirkt.
Damit wird das Layouten mehrerer Elemente zum Kinderspiel. Wir wissen alles was wir brauchen, um es in unseren eigenen Projekten einzusetzen.
display: flex - ändert ein Element in einen Container auf Blockebene mit darin enthaltenen Flex-Elementen.
display: inline-flex - ermöglicht die Anzeige mehrerer Flex-Container in einer Linie zueinander.
justify-content - wird verwendet, um Elemente entlang der Hauptachse anzuordnen.
align-items - wird verwendet, um Elemente entlang der Querachse anzuordnen.
flex-grow - wird verwendet, um anzugeben, wie viel Platz (und in welchen Proportionen) Flex-Elemente entlang der Hauptachse einnehmen.
flex-shrink - wird verwendet, um anzugeben, wie stark Flex-Elemente schrumpfen und in welchen Verhältnis sie entlang der Hauptachse stehen.
flex-basis - wird verwendet, um die Anfangsgröße eines mit flex-grow und/oder flex-shrink formatierten Elements anzugeben.
flex - wird verwendet um flex-grow, flex-shrink und flex-basis in einer Deklaration anzugeben.
flex-wrap - gibt an, dass Elemente entlang der Querachse verschoben werden sollen, wenn der Flex-Container nicht groß genug ist.
align-content - wird verwendet, um Zeilen entlang der Querachse anzuordnen.
flex-direction - wird zum Festlegen der Haupt- und Querachsen verwendet.
flex-flow - wird verwendet, um flex-wrap und flex-direction in einer Deklaration anzugeben.
Flex-Container können ineinander verschachtelt werden, indem display: flex oder display: inline-flex für untergeordnete Elemente von Flex-Containern deklariert werden.
Erstellen eines Rasters
Erstellen von Spalten
Erstellen von Zeilen
Rastervorlage
Fraktion
repeat() Funktion
minmax Funktion
Rasterabstand