Abschnitt 9 · Lektion 5
Abstände mit gap
Abstände zwischen Flex-Items lassen sich mit margin bauen. Das funktioniert, und es hat einen Haken, den du erst am Rand des Containers siehst.
Abstand gehört an den Container
<p class="titel">mit margin-right: hinter dem letzten klebt Luft</p>
<div class="reihe margin">
<div class="kasten">1</div>
<div class="kasten">2</div>
<div class="kasten">3</div>
</div>
<p class="titel">mit gap: außen bleibt es sauber</p>
<div class="reihe luecke">
<div class="kasten">1</div>
<div class="kasten">2</div>
<div class="kasten">3</div>
</div> body {
font-family: system-ui, sans-serif;
}
.titel {
margin-bottom: 4px;
font-size: 14px;
color: #52525b;
}
/* Die rote Kante markiert das Ende des Containers.
Oben klebt hinter dem dritten Kasten noch ein
Außenabstand, den niemand bestellt hat.
width: fit-content zieht die Kante direkt hinter
den Inhalt. Ohne diese Zeile wäre die Reihe so
breit wie die Seite und die Kante läge so weit
rechts, dass man den Unterschied nicht sähe. */
.reihe {
display: flex;
width: fit-content;
margin-bottom: 24px;
border-right: 4px solid #b91c1c;
background-color: #f4f4f5;
}
.kasten {
padding: 8px 16px;
font-weight: 700;
color: #ffffff;
background-color: #2563eb;
}
.margin .kasten {
margin-right: 24px;
}
.luecke {
gap: 24px;
} margin-right an jedem Item setzt den Abstand auch hinter das letzte. Im Beispiel markiert die rote Kante das Ende des Containers. Oben bleibt vor ihr noch ein leerer Streifen, den niemand haben wollte.
Die klassische Antwort darauf steht in vielen älteren Stylesheets.
.kasten:last-child { margin-right: 0; }
Das ist eine Regel, die nur existiert, um eine andere Regel zu reparieren. Ändert sich die Richtung, muss sie mitwandern. Braucht es auch senkrecht Abstand, muss sie verdoppelt werden. Und in umgebrochenen Reihen stimmen ihretwegen die Abstände am Zeilenende nicht.
Bei gap liegt der Abstand nur zwischen den Items. Außen liegt nichts, hinter dem letzten liegt nichts, und die Reparaturregel entfällt komplett.
Dahinter steckt eine Denkweise, die über diese eine Eigenschaft hinausgeht. Der Abstand zwischen Geschwistern gehört an den Container, nicht an die Kinder. Der Container weiß, wie seine Kinder zueinander stehen. Ein einzelnes Kind weiß nicht einmal, ob es das letzte ist.
Zwei Richtungen
<div class="projekte">
<div class="karte">Tipptrainer</div>
<div class="karte">Referenz</div>
<div class="karte">Newsletter</div>
<div class="karte">Portfolio</div>
<div class="karte">Archiv</div>
</div> *,
*::before,
*::after {
box-sizing: border-box;
}
body {
font-family: system-ui, sans-serif;
}
/* row-gap trennt die Zeilen, column-gap die Spalten.
Das Shorthand gap nimmt beide: erst die Zeilen,
dann die Spalten. Ein einzelner Wert gilt für
beide Richtungen. */
.projekte {
display: flex;
flex-wrap: wrap;
row-gap: 12px;
column-gap: 24px;
padding: 8px;
background-color: #f4f4f5;
}
.karte {
width: 130px;
padding: 16px;
border-radius: 12px;
font-weight: 700;
background-color: #ffffff;
} Es gibt drei Schreibweisen.
row-gapist der Abstand zwischen den Zeilen.column-gapist der Abstand zwischen den Spalten.gapist das Shorthand für beide. Ein Wert gilt für beide Richtungen, zwei Werte bedeuten erst Zeilen, dann Spalten.
In einer Reihe ohne Umbruch wirkt nur column-gap, es gibt ja keine zweite Zeile. Sobald flex-wrap: wrap dazukommt, wird row-gap sichtbar.
gap funktioniert in Flexbox, in Grid und in mehrspaltigem Text auf dieselbe Weise, und du lernst es damit einmal für alle drei Layout-Modelle. Und es fällt nie zusammen. Das Margin Collapsing aus Lektion 4.4 betrifft nur Außenabstände, und gap ist die Lücke zwischen den Items, die keinem von ihnen gehört.
Beides zusammen geht schief
<p class="titel">nur gap: 24px zwischen den Punkten</p>
<ul class="menue sauber">
<li>Start</li>
<li>Projekte</li>
<li>Kontakt</li>
</ul>
<p class="titel">gap plus vergessener margin-right: 40px</p>
<ul class="menue doppelt">
<li>Start</li>
<li>Projekte</li>
<li>Kontakt</li>
</ul> body {
font-family: system-ui, sans-serif;
}
.titel {
margin-bottom: 4px;
font-size: 14px;
color: #52525b;
}
.menue {
display: flex;
gap: 24px;
margin: 0 0 24px 0;
padding: 16px;
list-style: none;
background-color: #18181b;
}
.menue li {
padding: 4px 8px;
font-weight: 700;
color: #ffffff;
background-color: #2563eb;
}
/* Der Außenabstand aus dem alten Stylesheet steht
noch da. Er verschwindet nicht, weil gap dazukommt,
er addiert sich. Im Stylesheet steht 24, auf dem
Bildschirm liegen 40. */
.doppelt li {
margin-right: 16px;
} gap ersetzt den alten Außenabstand nicht, es kommt dazu. Schreibst du gap: 24px an den Container und lässt den margin-right: 16px an den Kindern stehen, hast du auf dem Bildschirm 40px. Im Stylesheet steht 24, gemessen sind es 40, und man sucht den Fehler an der falschen Stelle. Beim Umstellen passiert das leicht, denn die alten Außenabstände stehen an den Kindern und damit ganz woanders als die neue Zeile am Container.
Zum Einführen von gap gehört deshalb immer ein zweiter Schritt. Die alten Außenabstände kommen raus, und zwar an jedem einzelnen Kind.
In der Aufgabe stammt ein Stylesheet aus der Zeit vor gap.
Zum Mitnehmen
gap legt Abstand nur zwischen die Items, nie außen herum. Die alte Regel, die beim letzten Kind den Außenabstand wieder auf null setzt, braucht es damit nicht mehr, und alte Außenabstände an den Kindern kommen beim Umstieg raus.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
Was in dieser Lektion steckt
-
Artikel mit 3 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe im Editor, direkt im Browser geprüft
Öffnet sich mit dem Basis Konto.