display: contents – Element-Eigenschaften eliminieren, Kind-Elemente erhalten
Das Layout von Webseiten soll einerseits semantisch sein, andererseits soll der Aufwand für das CSS möglichst gering bleiben. Dabei ummanteln immer wieder viele HTML-Elemente Inhalte, damit das CSS jedes Element erreicht.
<nav id="site-navigation" class="main-navigation" aria-label="Top Menu"> <div class="menu-topmenu-container"> <ul id="menu-topmenu" class="main-menu"> <li id="menu-item-3806" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-3806">…</li> <li id="menu-item-3804" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3804">…</li> … </ul> </div> </nav>
Um die li-Elemente »in Form zu bringen«, muss das Layout die Eigenschaften des ul-Elements unterdrücken: In diesem Beispiel die Eigenschaften des nav- und des div-Elements sowie des ul-Elements mit seinen Listenkugeln (bullet) sowie das Einrücken der Listenelemente.
Das reicht schon, um die Eigenschaften der umfassenden Elemente – der Wrapper – zu versenken:
#site-navigation, .menu-topmenu-container, #menu-topmenu { display: contents}
CSS Grid mit Zeilenraster
Das CSS kann die Eigenschaft display: contents nutzen, um einem Grid-Container ein Zeilenraster zu verleihen. So liegen zwar aufeinander folgende Elemente im Grid, aber innerhalb der einzelnen Grid-Elemente ist die Verteilung des Platzangebots »wie's grad passt«. Die Bilder sind unterschiedlich hoch.
<div class="gridblock"> <div class="gridgroup"> <img src="fraisier.webp" width="420" height="176" > <h4>1 Erdbeertörtchen …</h4> </div> <div class="gridgroup"> <img src="palmier.webp" width="420" height="327" > <h4>2 Palmier –</h4> </div> <div class="gridgroup"> <img src="sable.webp" width="420" height="280"> <h4>3 Sablé …</h4> </div> </div>
Geben wir den Grid-Elementen der Klasse gridgroup ein display: contents, verschwinden sie sozusagen – jedenfalls aus der Sicht des CSS. Die Grid-Elemente unter dem Grid-Container werden nicht mehr beachtet, stattdessen werden ihre Elemente zu Grid-Elementen, obwohl sie weiterhin als Gruppe logisch und semantisch im HTML-Markup stehen.
1 Erdbeertörtchen mit Sahne
2 Palmier oder Schweineöhrchen, wie wir sie hier nennen
3 Sablé, ein geschichtetes Sandgebäck mit Himbeermarmelade-Klecks
display:contents Aus / An
Mit gridgroup { display: contents } lösen sich die CSS-Eigenschaften der Grid-Elemente sozusagen in Luft auf – Hintergrundfarbe und border sind weg. Der Grid-Container hat weiterhin drei Spalten, aber die Spalten werden jetzt horizontal in der Reihenfolge besetzt, in der die Elemente im HTML stehen. Der Grid-Container braucht nun noch zwei zusätzliche Eigenschaften, um die Elemente in Spalten und Zeilen zu setzen:
.gridblock { display: grid; gap: 14px; grid-template-columns: 1fr 1fr 1fr; grid-template-rows: auto auto; grid-auto-flow: column; } .gridgroup { display: contents; }
Die Kinder der entmachteten gridgroup sind quasi eine Stufe im DOM nach oben gerutscht.