Hier kommt leider so kompliziertes Zeugs wie
flex-grow
flex-shrink
flex-basis
ins Spiel
flex grow, flex shrink und flex basis verteilen den freien Platz oder steuern das Schrumpfen, wenn das Platzangebot des Flex-Elternelements zu klein oder zu groß für die Flex-Items ist.
Diese Eigenschaften muss in den Flex-Kindern platziert werden!
flex-grow:
Der flex-grow:
Wert bestimmt den Wachsumsfaktor eines Flex-Items.
flex-shrink:
Der flex-shrink:
legt fest, um welchen Faktor ein Flex-Item gegenüber den anderen Flex-Items schrumpft, wenn der Raum des Flex-Containers zu klein wird.
Der Vorgabewert ist 1 – anteilig. flex-shrink : 0 verhindert das Verkleinern des Flex-Items.
flex-basis:
Der flex-basis:
Wert setzt die anfängliche Mindestgrösse des Flex-Kindes. Sofern nicht anderweitig schon angegeben.
Ein Beispiel mit den Browser-Defaultwerten für grow, shrink und basis
:
Bei den folgenden Beispielen sollte der Bildschirm in seiner Breite verändert werden können um die jeweiligen Effekte zu überprüfen. Das funktioniert am Besten mit einem Desktop.
/* ======================
Defaultwerte lt. https://www.w3.org/TR/css-flexbox-1/
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
======================= */
HTML:
<div class="flex-elternelement">
<div>Flexkind 1</div>
<div>Flexkind 2</div>
<div>Flexkind 3</div>
<div>Flexkind 4</div>
<div>Flexkind 5</div>
</div>
CSS:
.flex-elternelement {
display: flex;
gap: 10px;
}
.flex-elternelement div:nth-of-child(1) {keine Angaben}
.flex-elternelement div:nth-of-child(2) {somit}
.flex-elternelement div:nth-of-child(3) {Browser-Default}
.flex-elternelement div:nth-of-child(4) {Werte}
.flex-elternelement div:nth-of-child(5) {...}
Flexkind 3 mit Zusatztext
Ohne display: flex;
würden die Kästchen jetzt untereinander stehen weil sie Blockelemente (DIV's) sind und somit die gesamte verfügbare Breite einnehmen würden.
Mit display: flex;
im Elternelement stehen sie aber nun nebeneinander weil hier der CSS-Defaultwert des Browsers flex-direction: row;
ist.
Der Inhalt bestimmt momentan die Breite der Flex-items. Gleicher Inhalt = Gleiche Breite. Wegen des fehlenden Inhaltes wird auch das Elternelement nicht vollständig ausgefüllt. Das sieht man nur bei genügend breitem Bildschirm, nix Handy! :-)
Beim Zusammenschieben des Browserfensters verhalten sich die Kästchen recht "elastisch" bis sie bei ca. 530px aus dem Elternelement überschwappen ("Overflow").
Die Länge der Wörter "Flexkind" und "Zusatztext" sowie "gap: 10px;
" bestimmen hier den Zeitpunkt des Overflows.
Jetzt kommt flex-grow
ins Spiel
Hier kann man schön die Wirkung von flex-grow
beobachten.
Als erstes wird das Elternelement vollständig gefüllt.
Flexkind 1, 2, 3 wachsen wenn der Bildschirm vergrössert wird.
Flexkind 4 + 5 bleiben unverändert. Hier bestimmt der Inhalt die Breite.
Flexkind 1 dehnt sich etwas aus.
Flexkind 2 wächst doppelt so viel wie 1.
Flexkind 3 wächst 3 mal soviel wie Flexkind 1.
Beim Verkleinern des Bildschirms auf ca. <510px beginnt wieder der Overflow. Wie man das vermeidet sehen wir etwas später.
flex-grow: Nur beim zweiten Kind
Bei Flex-Kind 1, 3, 4 und 5 sind keine Angaben von flex-grow (flex-grow: 0;) Sie schrumpfen auf den Textinhalt.
Was mir hier auffällt:
Das zweite Flex-Kind dehnt sich mehr als 2-fach aus!?
flex-grow: Das interessiert mich jetzt aber ;-)
Alle Flexkinder jetzt mit (flex-grow: 1;) und Kind 2 mit (flex-grow: 2;)
Ok, das sieht jetzt besser aus.
flex-grow: Wie vorher aber mit mehr Inhalt
Flexkind 1
flex-grow: 1
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
Flexkind 2
flex-grow: 2
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
Flexkind 3
flex-grow: 1
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
Flexkind 4
flex-grow: 1
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
Erkenntnis:
Bei viel Inhalt macht sich flex-grow: 2;
kaum bemerkbar. Letztendlich ist ja auch kein überschüssiger Platz verfügbar.
flex-shrink: Ab hier wird jetzt unbarmherzig "geshrinkt":
Defaultwerte:
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
Flexkind 1
CSS: Defaultwerte:
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
Flexkind 2
CSS:
flex-grow: 2;
flex-shrink: 1;
flex-basis: auto;
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
Flexkind 3
CSS:
flex-grow: 2;
flex-shrink: 2;
flex-basis: auto;
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
Flexkind 4
CSS:
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
Flexkind 5
CSS:
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
Erkenntnis:
Ich blick' nicht mehr durch!
Der Textinhalt hat auf jeden Fall grossen Einfluss.
Das Ganze nochmal mit wenig Text:
Flexkind 1
CSS: Defaultwerte:
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
Flexkind 2
CSS:
flex-grow: 2;
flex-shrink: 1;
flex-basis: auto;
Flexkind 3
CSS:
flex-grow: 2;
flex-shrink: 2;
flex-basis: auto;
Flexkind 4
CSS:
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
Flexkind 5
CSS:
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
Erkenntnis:
text
flex-basis:
Beim Verkleinern des Browserfensters schrumpft Flex-Kind 2 wegen flex-shrink: 2;
mehr als Kind 1 + 2.
Umgekehrt vergrössert sich Flex-Kind 2 auf bis zu 500px wegen flex-basis: 500px;
. Die ursprüngliche Angabe von width: 300px;
wird ignoriert.
width: 300px;
flex-grow: 1;
flex-shrink: 1;
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
width: 300px;
flex-grow: 1
flex-shrink: 2;
flex-basis: 500px;
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
width: 300px;
flex-grow: 1;
flex-shrink: 1;
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
flex-wrap: Flex-Items umbrechen
Um Flex-Kinder bei Platzmangel im Elternelement in eine neue Reihe springen zu lassen gibt es die Eigenschaft flex-wrap:
flex-wrap:
wird im Elternelement platziert.
HTML:
<div class="flex-elternelement">
<a href="#0">Flexkind 1<a>
<a href="#0">Flexkind 2<a>
<a href="#0">Flexkind 3<a>
<a href="#0">Flexkind 4<a>
</div>
CSS:
.flex-elternelement {
display: flex;
flex-wrap: wrap; /* Siehe unten */
border: 2px solid red;
}
.flex-elternelement a {
width: 230px;
text-decoration: none;
text-align: center;
padding 10px;
margin: 10px;
border: 2px solid green;
}
Beispiel: Das Verhalten der normalen Kind-Elemente mit einer Breite von 230px (ohne display: flex; und flex-wrap)
Bei kleiner als 730px gibt es Chaos!
Nun das Verhalten, jetzt als Flex-Kinder, mit einer Breite von 230px (mit display: flex; und ohne flex-wrap)
Hmm,- obwohl die Kind-Elemente eine Breite von 230px haben schieben sie sich bei Platzmanel zusammen!
Wie vorher, aber nun mit display: flex
und flex-wrap: wrap;
Sobald der Platz im Elternelement nicht mehr ausreicht, springen die Flex-Kinder in eine neue Reihe.
Beispiel: wie vorher, zusätzlich mit flex-grow: 1;
bei den Flex-Kindern:
Im Gegensatz zu dem vorherigen Beispiel sieht man schön die Vorteile von Flexbox-Layout.
Dass das nach unten umspringende Element dann den gesamten Platz einnimmt kann man vermeiden, indem man den Flex-Kindern eine feste Breite mitgibt.