grid-template-areas – ein Layout, das man im Code sehen kann
Statt Zeilen- und Spaltennummern zu zählen, malst du dein Layout als kleine ASCII-Zeichnung ins CSS. Auf dem Handy schreibst du die Zeichnung einfach anders – dieselben Bausteine, andere Anordnung, kein einziger geänderter HTML-Knoten.
Von allen CSS-Funktionen der letzten Jahre ist das die, bei der ich am ehesten „warum ging das nicht immer so?" denke. Du beschreibst dein Layout als Bild — im Code:
.seite {
display: grid;
grid-template-areas:
"kopf kopf"
"leiste inhalt"
"fuss fuss";
grid-template-columns: 240px 1fr;
gap: 20px;
}
.kopf { grid-area: kopf; }
.leiste { grid-area: leiste; }
.inhalt { grid-area: inhalt; }
.fuss { grid-area: fuss; }Man muss das nicht erklären. Die Kopfzeile geht über beide Spalten, links die Leiste, rechts der Inhalt, unten die Fußzeile über die volle Breite. Wer in einem halben Jahr in diese Datei schaut, sieht das Layout, statt es aus grid-column: 1 / 3 rekonstruieren zu müssen.
Auf dem Handy: dieselben Teile, andere Zeichnung
@media (max-width: 700px) {
.seite {
grid-template-areas:
"kopf"
"inhalt"
"leiste"
"fuss";
grid-template-columns: 1fr;
}
}Das ist der eigentliche Gewinn. Die Seitenleiste rutscht auf dem Handy unter den Inhalt — im HTML hat sich nichts geändert, es steht dort weiterhin vor dem Inhalt. Und weil sich nur die Darstellung ändert, bleibt die Vorlesereihenfolge für Screenreader die des HTML.
Das ist übrigens der Punkt, an dem man aufpassen muss: Eine Anordnung, die visuell stark von der HTML-Reihenfolge abweicht, verwirrt Nutzer, die per Tastatur navigieren. Ein Umsortieren wie hier ist unkritisch; ein Layout, in dem der Absenden-Knopf optisch vor den Feldern steht, wäre es nicht.
Leere Felder
Ein Punkt lässt eine Zelle bewusst frei:
grid-template-areas:
"bild titel"
". text";Praktisch für Layouts, in denen etwas eingerückt weiterlaufen soll.
Zwei Dinge, die ich mir gemerkt habe
Alle Zeilen brauchen gleich viele Felder. Vergisst du eines, ist die ganze Regel ungültig — und zwar stillschweigend. Das Layout fällt dann auf ein einspaltiges Grid zurück, was beim Suchen zuerst wie ein anderer Fehler aussieht.
Ein Bereich muss ein Rechteck sein. "a b a" funktioniert nicht, weil a sonst zwei getrennte Flecken wäre. Klingt einschränkend, ist es in der Praxis nie.
Wann Areas, wann nicht?
Für das Seitengerüst — Kopf, Leiste, Inhalt, Fuß — nehme ich immer Areas. Für Listen gleichartiger Karten dagegen nicht: Da will man keine Namen vergeben, sondern repeat(auto-fill, minmax(240px, 1fr)) und den Browser rechnen lassen.
Grob gesagt: benannte Bereiche für das, was einmalig ist; automatische Spalten für das, was sich wiederholt.
Du hast eine Seite, deren Layout auf dem Handy zerfällt? Häufig ist es genau der Sprung von „nebeneinander" zu „untereinander", der nie sauber definiert wurde. Melde dich, ich schaue es mir an.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Text nach drei Zeilen abschneiden – line-clamp statt JavaScript
Kartenlisten sehen nur dann ordentlich aus, wenn alle Vorschautexte gleich hoch sind. Das serverseitig auf 120 Zeichen zu kürzen geht schief, sobald die Karte schmaler wird – CSS kann das seit Jahren selbst.
subgrid – Karten, deren Zeilen wirklich auf einer Linie liegen
Drei Karten nebeneinander, jede mit Titel, Text und Knopf – und alles steht leicht versetzt, weil ein Titel zweizeilig ist. Mit subgrid teilen sich die Karten die Zeilen des Eltern-Grids, und alles sitzt bündig. Ohne feste Höhen, ohne JavaScript.
accent-color – Checkboxen und Regler in deiner Markenfarbe, in einer Zeile
Checkboxen und Radiobuttons waren jahrelang der Grund, warum Leute sie mit appearance: none nachgebaut haben – und dabei die Tastaturbedienung verloren. Eine einzige CSS-Eigenschaft macht das überflüssig.