CSS/Tutorials/Grid/Verschachtelte Raster
Das Grid Layout ist perfekt für zweidimensionale Raster in flachen HTML-Strukturen wie Bildergalerien.
Mit dem CSS Grid Layout Module Level 2 ist es nun möglich, solch verschachtelte Raster (subgrids) zu erzeugen, die sich an das „Eltern-Raster“ anpassen.[1]
Inhaltsverzeichnis
verschachtelte Raster
herkömmliche Vorgehensweise
Ein Element wird mit display:grid
zu einem Grid-Container, dessen direkten Kinder sich dann als Grid-Items in ein Raster ordnen. Kinder dieser Grid-Items (Kindeskinder des Grid-Containers) werden aber wieder im normalen Elementfluss platziert.
Bisher konnten Raster verschachtelt werden, indem das Grid-Item mit display:grid
zu einem weiteren Grid-Container wurde. Dabei störten aber Abstände wie gap, padding und margin, die dann entsprechend angepasst werden mussten.
In diesem Beispiel besteht der article aus einer Produktvorschau mehrerer Karten, die mit einem figure-Element mit 3 Kind-Elementen realisiert werden:
article {
display: grid;
grid-template-columns: repeat[4, 1fr);
}
figure {
display: grid;
grid-template-rows: auto 1fr auto;
}
Jedes figure-Element wird zu einem eigenen Grid-Container, der den Inhalt auf den jeweils verfügbaren Platz aufteilt. Dabei entstehen aber je nach Textlänge unterschiedlich große Überschiften und figcaptions.
subgrid
Level 2 der CSS Grid Layout Spezifikation beinhaltet einen subgrid
-Wert für grid-template-columns
und grid-template-rows
, mit dem Sie das Raster auch in weiteren Kindeskind-Elementen fortführen können.[2]
<style>
article {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(12em, 1fr));
grid-template-rows: auto 1fr auto;
gap: 1em;
}
figure {
grid-row: auto / span 3; /* soll sich über drei Reihen des Elterngrid erstrecken */
display: grid;
grid-template-rows: subgrid;
gap: 0; /* innerhalb des subgrids sollen keine Abstände sein */
border: medium solid #c32e04;
margin: 0;
}
Da sich der Grid-Container des figure-Elements nach dem Eltern-Grid des article-Elements ausrichtet, haben jetzt alle h3-Überscrhiften und auch die figcaption jeweils die gleiche Höhe.
Liniennamen und Subgrid
Die Namen benannter Linien eines Eltern-Rasters werden an das subgrid weitergegeben. Also können wir subgrid-Items entsprechend dieser Liniennamen positionieren:
.grid {
display: grid;
grid-template-columns: [a] 1fr [b] 2fr [c] 1fr [d] 2fr [e] 1fr [f] 2fr [g];
grid-template-rows: auto auto auto;
}
.item {
grid-column: 2 / 6;
grid-row: 1 / 3;
display: grid;
grid-template-columns: subgrid;
grid-template-rows: 10em 5em 200px 200px;
}
.subitem {
grid-column: c / e;
}
Fazit
Subgrids sind nützlich, um gleiche Rasterzellen in verschiedenen Geschwister-Elementen zu erzeugen. Sobald Sie so ein verschachteltes Raster erschaffen haben, können Sie es aber nicht mehr durch die implizierte Erzeugung weiterer Zellen erweitern. Weitere Grid-Items werden im letzten verfügbaren track übereinander dargestellt und verdecken sich so gegenseitig.
Allerdings können Sie nur eine Dimension ihres Subgrids mit subgrid
festlegen und damit die andere Dimension so anlegen, dass sich weitere Elemente wie gewohnt einfügen.
Die Browserunterstützung blieb bis heute (Stand März 2023) ungenügend. Eine zeitgemäße Alternative wären wohl die neuen Container Queries
Weblinks
- ↑ W3C: CSS Grid Layout Module Level 2
- ↑ MDN: Subgrid
- smashing magazine: CSS Grid Level 2: Here Comes Subgrid
- Why display: contents is not CSS Grid Layout subgrid Rachel Andrew am 20.07. 2017
- mauriceweb: subgrid – das Wichtigste zum neuen Spieler bei CSS-Grid vom 11. Sep 2019
Beispiele
- codepen: Matryoshka grid von Gunnar Bittersmann
Mit Custom properties wird ein template-Variable für subgrids mehrfach verwendet.