Abschnitt 10 · Lektion 6
Das implizite Raster
Bis hierher hast du Raster gebaut, bei denen die Spuren definiert waren. In der Praxis ist das die Ausnahme.
Fast jedes Raster ist implizit
<div class="galerie">
<div class="kachel">1</div>
<div class="kachel">2 mit deutlich mehr Text, damit diese Zeile höher wird als die anderen beiden</div>
<div class="kachel">3</div>
<div class="kachel">4</div>
<div class="kachel">5</div>
<div class="kachel">6</div>
</div> *,
*::before,
*::after {
box-sizing: border-box;
}
body {
font-family: system-ui, sans-serif;
line-height: 1.5;
}
/* Nur die Spalten sind definiert. Die beiden Zeilen
entstehen von allein, weil sechs Kacheln in ein
dreispaltiges Raster fallen. Ihre Höhe richtet sich
nach ihrem Inhalt, deshalb ist die erste hoch und
die zweite flach. */
.galerie {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 8px;
padding: 8px;
background-color: #e4e4e7;
}
.kachel {
padding: 12px;
font-weight: 700;
color: #ffffff;
background-color: #2563eb;
} Der Normalfall sieht so aus: Du legst drei Spalten an und wirfst zwölf Karten hinein. Vier Zeilen entstehen, und geschrieben hat sie niemand.
Alles, was über grid-template-columns und grid-template-rows hinausgeht, landet im impliziten Raster. Der Browser legt so viele Spuren an, wie er braucht.
Ihre Größe richtet sich nach dem Inhalt, und das ist genau der Punkt, an dem es unruhig aussieht. Eine Zeile mit viel Text ist hoch, die nächste flach, und die Galerie wirkt zerrissen, obwohl formal nichts falsch ist.
Der Streifen macht daraus zwei Zahlen. Zeig auf die Galerie: Im Reiter „Werte” steht grid-template-rows: 312px 48px. Im Reiter „Regeln” steht unter deiner Regel keine einzige Zeile über Zeilen. Beide stammen also vom Browser, und die eine ist mehr als sechsmal so hoch wie die andere.
grid-auto-rows
<div class="galerie">
<div class="kachel">1</div>
<div class="kachel">2 mit deutlich mehr Text, damit diese Zeile höher wird als die anderen beiden</div>
<div class="kachel">3</div>
<div class="kachel">4</div>
<div class="kachel">5</div>
<div class="kachel">6</div>
</div> *,
*::before,
*::after {
box-sizing: border-box;
}
body {
font-family: system-ui, sans-serif;
line-height: 1.5;
}
/* minmax(140px, auto) heißt: mindestens 140px hoch,
aber wachsen darfst du. Eine feste Höhe würde den
langen Text abschneiden, auto allein ließe die
flache Zeile flach. Im Fließtext steht 200px als
üblicher Wert, hier sind es 140, damit beide Zeilen
nebeneinander ins Bild passen. */
.galerie {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: minmax(140px, auto);
gap: 8px;
padding: 8px;
background-color: #e4e4e7;
}
.kachel {
padding: 12px;
font-weight: 700;
color: #ffffff;
background-color: #2563eb;
} grid-auto-rows sagt allen automatisch entstehenden Zeilen, wie hoch sie sein sollen. Es gibt auch grid-auto-columns, das brauchst du seltener.
Der übliche Wert ist keine feste Zahl, sondern minmax(200px, auto):
- Eine feste Höhe schneidet zu langen Inhalt ab oder lässt ihn überlaufen.
autoallein ist der Zustand von eben, jede Zeile so hoch wie ihr Inhalt.minmax(200px, auto)ist beides: mindestens so hoch, und wachsen darf sie trotzdem.
Im Beispiel steht minmax(140px, auto), und die Wirkung ist an einer einzelnen Kachel abzulesen: Die vierte ist ohne die Zeile 48 hoch und mit ihr 140. Die hohe Zeile darüber bleibt in beiden Fällen bei 312, denn auto als Obergrenze heißt, dass sie wachsen darf.
Das ist derselbe Gedanke wie bei min-height aus Lektion 4.3. Eine Untergrenze beruhigt das Bild, eine Obergrenze macht Ärger.
grid-auto-flow
<p class="titel">ohne dense: die Lücke bleibt, Reihenfolge stimmt</p>
<div class="galerie ohne">
<div class="kachel">1</div>
<div class="kachel">2</div>
<div class="kachel breit">3 (span 2)</div>
<div class="kachel">4</div>
<div class="kachel">5</div>
</div>
<p class="titel">mit dense: Lücke zu, aber die 4 sitzt jetzt vor der 3</p>
<div class="galerie mit">
<div class="kachel">1</div>
<div class="kachel">2</div>
<div class="kachel breit">3 (span 2)</div>
<div class="kachel">4</div>
<div class="kachel">5</div>
</div> *,
*::before,
*::after {
box-sizing: border-box;
}
body {
font-family: system-ui, sans-serif;
line-height: 1.5;
}
.titel {
margin-bottom: 4px;
font-size: 14px;
color: #52525b;
}
.galerie {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 80px;
gap: 8px;
margin-bottom: 20px;
padding: 8px;
background-color: #e4e4e7;
}
.kachel {
padding: 12px;
font-weight: 700;
color: #ffffff;
background-color: #2563eb;
}
.breit {
grid-column: span 2;
background-color: #b91c1c;
}
/* Die 3 braucht zwei nebeneinander liegende Spuren
und passt deshalb nicht mehr in die erste Zeile.
dense holt die 4 nach vorn in die freie Zelle. */
.mit {
grid-auto-flow: row dense;
} grid-auto-flow bestimmt, in welcher Richtung der Browser die Elemente einsortiert:
rowist der Standard: erst die Zeile voll, dann die nächste.columnfüllt seitwärts, erst die Spalte voll, dann die nächste.denseist ein Zusatz zu beiden:row denseodercolumn dense.
Ohne dense arbeitet der Browser stur in Markup-Reihenfolge. Passt ein breites Element nicht mehr in den Rest der Zeile, rutscht es in die nächste und lässt eine Lücke stehen.
Mit dense schaut er zurück und zieht spätere, kleinere Elemente in die frühere Lücke. Die Galerie ist dicht gepackt, und man muss nichts von Hand umsortieren.
Der Preis steht im Beispiel: die sichtbare Reihenfolge stimmt nicht mehr mit dem Markup überein. Die 4 sitzt vor der 3, obwohl sie danach im Dokument steht. Damit hast du denselben Fall wie bei order in 9.6: Tastatur und Screenreader folgen weiter dem Dokument, das Auge nicht.
Für eine Bildergalerie, in der die Reihenfolge nichts bedeutet, ist dense genau richtig. Für eine Liste von Artikeln, in der die neuesten oben stehen sollen, ist es ein Fehler.
Zum Mitnehmen
In der Praxis ist fast jedes Raster implizit. Man legt drei Spalten an und wirft zwölf Karten hinein, und die vier Zeilen darunter hat niemand geschrieben. grid-auto-rows ist die Eigenschaft, die diesen Zeilen sagt, wie hoch sie sein sollen.
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.