Computer CSS Flex
Das ultimative Flex-Tutorial
Contents
Links
Ausgangssituation
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:block; } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; } <div class="container"> <div class="card">Hallo,</div> <div class="card">das ist ein Test.</div> <div class="card">Und jetzt mit einigen weiteren Worten...</div> </div> <div style="margin:1rem;"></div> <div class="container"> <div class="card">Lorem ipsum dolor sit amet.</div> <div class="card">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.</div> <div class="card">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.</div> </div>
Flex-Default-Verhalten
- Karten nehmen sich die Breite, der durch den Text vorgegeben ist.
- Horizontaler Platz bleibt frei.
- Vertikaler Platz wird ausgefüllt (Hier Display-Fehler).
- Standard-Einstellung
flex-shrink: 1 /* Karte darf verkleinert werden */ flex-grow: 0 /* Freier horizontaler Raum wird auf Karten verteilt */ flex-basis: auto /* Anfängliche Breite, Werte: auto, 10rem, 200px, 10% */ Kurzschreibeweise flex <shrink> <grow> <basis>
Default-Verhalten
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; gap:2rem; } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Container mit größerer Breite
- Übrige horizontaler Raum bleibt ungenutzt (s. oben)
Container mit kleiner Breite
- Karten werden kleiner
- Overflow passiert, falls die Breite kleiner ist min-content
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; gap:2rem; width:30%; } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Flex-grow/shrink/basis
Flex-grow wird angeschaltet: 1
- Der übrige horizontale Raum wird auf die Karten verteilt.
- justify-content hat jetzt keine Auswirkung mehr!!!
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; gap:2rem; } .container > * { flex-grow:1; /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Flex-shrink wird ausgeschaltet: 0
- Karten werden nicht verkleinert, overflow passiert.
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; gap:2rem; width:30%;
} .container > * { flex-shrink:0; /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Flex-basis wird verändert: 0, 100%, 10rem
- flex-basis ist ähnlich wie width (außer flex-basis:0 setzt width auf min-content)
- Benutze nur eins: flex-basis oder width
Flex-basis: 0
- Alle Karten erhalten width:min-content
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; gap:2rem; } .container > * { flex-basis:0; /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Flex-basis: 100%
- Alle Karten sind gleich groß in der Breite.
- Das gleiche wird gemacht,
flex: 1; /* = flex: 1 1 0; */
- Alternative:
width: 100%;
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; gap:2rem; } .container > * { flex-basis:100%; /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Flex-basis: 10rem
- Alle Karten sind 10rem gleich groß in der Breite.
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; gap:2rem; } .container > * { flex-basis:10rem; /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Flex-wrap
Auswirkungen von flex-wrap: wrap
- Karten brechen um, kein overflow.
- Overflow passiert, falls width: min-content unterschritten wird.
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; flex-wrap: wrap; gap:2rem; width:30%; } .container > * { /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Volle Größe beim Umbrechen
- Karten nehmen beim Umbrechen die maximale Breite an.
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; flex-wrap: wrap; gap:2rem; width:30%; } .container > * { flex-grow:1; /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Umschalten Zeilen / Spalten mit media-query
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; flex-direction: column; gap:2rem; } .container > * { flex-basis:100%; /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ } @media (min-width: 800px) { .container { flex-direction:row; } } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px; min-height: 4rem; margin-bottom: 1rem; padding:0.5rem; }
Justify-content
- default: flex-start;
Align-items
- default: stretch;
Ohne stretch
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; gap:2rem; align-items: flex-start; min-height:5rem; } .card { background-color: rgba(255,255,0,0.6); border-radius: 20px;min-height: 4rem;margin-bottom: 1rem; padding:0.5rem; }
align-self
Hallo,
das ist ein Test.
Und jetzt mit einigen weiteren Worten...
Lorem ipsum dolor sit amet.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo, ex.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus magnam, blanditiis exercitationem tempore eveniet ducimus? Dolore sed eligendi distinctio id.
* { box-sizing: border-box; } .container { border: 1px firebrick solid; display:flex; gap:2rem; align-items: flex-start; min-height:5rem; }
.card:nth-child(1) { background-color: pink; align-self:stretch; }
.card { background-color: rgba(255,255,0,0.6); border-radius: 20px;min-height: 4rem;margin-bottom: 1rem; padding:0.5rem; }
Traps and Pitfalls
flex-grow:1 -> justify-content
justify-content funktioniert nach flex-grow:1 nicht mehr.
flex-direction: column -> use height
justify-content braucht nun eine Höhe, um Platz verwenden zu können.
flex-direction: column; justify-content: center; min-height: 100vh;
space-around -> space-evenly
Benutze
justify-content: space-evenly;
anstatt space-around
Flex vs Grid
Standard-Einstellung
Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing
elit.
Voluptatibus
hic!
Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing
elit.
Voluptatibus
hic!
* { box-sizing: border-box; } .container { /*FLEX*/ border: 5px solid hotpink; display:flex; flex-wrap:wrap; gap:1rem; width:30%; } .container { /*GRID*/ border: 5px solid hotpink; display:grid; grid-template-columns: repeat(auto-fit, minmax(5rem, 1fr)); gap:1rem; width:30%; }
.card { font-family: sans-serif; background-color: rgb(19, 32, 111); color: rgb(212, 223, 255); border: 1px rgb(162, 172, 236) solid; padding:0.5rem; }
<div class="container"> <div class="card">Lorem</div> <div class="card">ipsum</div> <div class="card">dolor</div> <div class="card">sit</div> <div class="card">amet</div> <div class="card">consectetur</div> <div class="card">adipisicing</div> <div class="card">elit.</div> <div class="card">Voluptatibus</div> <div class="card">hic!</div> </div>
flex:1 nutzt den gesamten Raum
Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing
elit.
Voluptatibus
hic!
Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing
elit.
Voluptatibus
hic!
* { box-sizing: border-box; } .container { border: 5px solid hotpink; display:flex; flex-wrap:wrap; gap:1rem; width:30%; } .container > * { flex: 1; /* = flex: 1 1 0; */ /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ }
.card { font-family: sans-serif; background-color: rgb(19, 32, 111); color: rgb(212, 223, 255); border: 1px rgb(162, 172, 236) solid; padding:0.5rem; }
flex-basis:100% nutzt den gesamten Raum, Spalten gleich groß
Vorsicht:
- flex-wrap: wrap darf nicht hinzugefügt werden!
- min-content aller Elemente darf nicht die Größe des Containers überschreiten!
Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing
elit.
Voluptatibus
hic!
Lorem
ipsum
dolor
sit
* { box-sizing: border-box; } .container { border: 5px solid hotpink; display:flex; flex-wrap:nowrap; gap:1rem; width:30%; } .container > * { flex-basis: 100%; /* = flex: 1 1 0; */ /* Defaults flex-shrink:1; flex-grow:0; flex-basis:auto; */ }
.card { font-family: sans-serif; background-color: rgb(19, 32, 111); color: rgb(212, 223, 255); border: 1px rgb(162, 172, 236) solid; padding:0.5rem; }
Grid ähnlich nutzen wie flex
In Spalten anordnen
display: grid; grid-auto-flow: column;
Mit 3 Spalten
display: grid; grid-template-columns: 1fr 1fr 1fr;
oder
display: grid; grid-template-columns: repeat(3,1fr);
autofit: Min/Max-Größe
display: grid; grid-template-columns: repeat(autofit,minmax(5rem,1fr));
Layout-Patterns
Spalten gleich groß: nimm grid!
Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing
elit.
Voluptatibus
hic!
* { box-sizing: border-box; } .container { /*GRID*/ border: 5px solid hotpink; display:grid; grid-template-columns: repeat(auto-fit, minmax(5rem, 1fr)); gap:1rem; width:30%; }
oder 3 Spalten
.container { /*GRID*/ border: 5px solid hotpink; display:grid; grid-template-columns: 1fr 1fr 1fr; gap:1rem; width:30%; }
.card { font-family: sans-serif; background-color: rgb(19, 32, 111); color: rgb(212, 223, 255); border: 1px rgb(162, 172, 236) solid; padding:0.5rem; }
<div class="container"> <div class="card">Lorem</div> <div class="card">ipsum</div> <div class="card">dolor</div> <div class="card">sit</div> <div class="card">amet</div> <div class="card">consectetur</div> <div class="card">adipisicing</div> <div class="card">elit.</div> <div class="card">Voluptatibus</div> <div class="card">hic!</div> </div>
Spalten gleich groß, kein wrap: flex
.even-columns { display: flex; gap: 1rem; } .even-columns > * { flex-basis: 100%; }
oder
.even-columns > * { flex:1; /* = flex: 1 1 0;*/ }
Lorem
ipsum
dolor
sit
Vorsicht:
- flex-wrap: wrap darf nicht hinzugefügt werden!
- min-content aller Elemente darf nicht die Größe des Containers überschreiten!
Spalten gleich groß mit wrap: (fast) wie grid
.gridish { display: flex; flex-wrap: wrap; gap: 1rem; } .gridish > * { flex: 1 1 10rem; }
oder drei Spalten:
.gridish > * { flex: 1 1 33%; }
Lorem
ipsum
dolor
Lorem
ipsum
dolor
sit
Vorsicht:
- sind in der letzten Zeile weniger Elemente, dann erhalten sie den gesamten Raum der Zeile
Spalten aufgeteilt: flex
.content-sidebar { display: flex; flex-wrap: wrap; gap: 1rem; } .content-sidebar *:nth-child(1) { flex: 1 1 70%; min-width: 25ch; } .content-sidebar *:nth-child(2) { flex: 1 1 25%; /*max-width:25%; evt für letzte Element*/ }
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsum sint soluta ipsam, vero eveniet, aut nemo corporis fugiat, rem maxime repellendus eaque officiis sit laborum eligendi error. Cumque, saepe ratione. Unde earum doloremque, explicabo, sed accusamus officia laboriosam, porro nisi natus mollitia facere. Dolor, consequatur quia dignissimos maiores nihil dolore illum veniam eligendi, consequuntur veritatis cum quis voluptatum amet facilis optio sequi quos, est harum nostrum molestiae praesentium velit iure ducimus natus. Nobis laborum officiis soluta modi necessitatibus sint? Omnis architecto doloremque id ipsum impedit, eligendi cumque dicta explicabo quibusdam odit, maxime veritatis harum nisi sit magnam modi, reprehenderit distinctio.
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Ipsa distinctio aliquid ducimus nam praesentium similique labore cumque nisi. Magnam, ratione!
Spalten aufgeteilt: Main-Sidebar, Umbruch width 100%
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsum sint soluta ipsam, vero eveniet, aut nemo corporis fugiat, rem maxime repellendus eaque officiis sit laborum eligendi error. Cumque, saepe ratione. Unde earum doloremque, explicabo, sed accusamus officia laboriosam, porro nisi natus mollitia facere. Dolor, consequatur quia dignissimos maiores nihil dolore illum veniam eligendi, consequuntur veritatis cum quis voluptatum amet facilis optio sequi quos, est harum nostrum molestiae praesentium velit iure ducimus natus. Nobis laborum officiis soluta modi necessitatibus sint? Omnis architecto doloremque id ipsum impedit, eligendi cumque dicta explicabo quibusdam odit, maxime veritatis harum nisi sit magnam modi, reprehenderit distinctio.
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Ipsa distinctio aliquid ducimus nam praesentium similique labore cumque nisi. Magnam, ratione!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsum sint soluta ipsam, vero eveniet, aut nemo corporis fugiat, rem maxime repellendus eaque officiis sit laborum eligendi error. Cumque, saepe ratione. Unde earum doloremque, explicabo, sed accusamus officia laboriosam, porro nisi natus mollitia facere. Dolor, consequatur quia dignissimos maiores nihil dolore illum veniam eligendi, consequuntur veritatis cum quis voluptatum amet facilis optio sequi quos, est harum nostrum molestiae praesentium velit iure ducimus natus. Nobis laborum officiis soluta modi necessitatibus sint? Omnis architecto doloremque id ipsum impedit, eligendi cumque dicta explicabo quibusdam odit, maxime veritatis harum nisi sit magnam modi, reprehenderit distinctio.
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Ipsa distinctio aliquid ducimus nam praesentium similique labore cumque nisi. Magnam, ratione!
* { box-sizing: border-box; } .container { border: 5px solid hotpink; display:flex; flex-wrap:wrap; gap:1rem; width:50%; } .container > :first-child { flex-basis:68%; flex-grow:9999; border: 1px dashed black; } .container > :last-child { flex-basis:28%; flex-grow:1; border: 1px dashed black; } .card { font-family: sans-serif; background-color: rgb(19, 32, 111); color: rgb(212, 223, 255); border: 1px rgb(162, 172, 236) solid; padding:0.5rem; }
<div class="card"> Lorem ipsum ....</div> <div class="card"> Lorem ipsum dolor ...</div> </div>
Grid zum Scrollen
Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing
elit.
Voluptatibus
hic!
* { box-sizing: border-box; } .container { /*GRID*/ border: 5px solid hotpink; display:grid; grid-auto-flow: column; grid-auto-columns: 20%; overflow-x: scroll; scroll-snap-type: x mandatory; gap:1rem; width:30%; } .container > * { scroll-snap-align: start; } .card { font-family: sans-serif; background-color: rgb(19, 32, 111); color: rgb(212, 223, 255); border: 1px rgb(162, 172, 236) solid; padding:0.5rem; }