CSS 2024: Nesting und @container

Die @container-Regel macht das Layout eines Elements abhängig von der Breite eines umfassenden Containers. Mit Nesting rückt natives CSS näher an Präprozessoren wie SASS und LESS. Nesting ist der nächste große Wurf nach display: grid und verschachtelt CSS-Regeln hierarchisch. So spiegelt das CSS die Struktur des Markups wieder. Aber auch kleinere Schritte vereinfachen das CSS.

CSS Nesting – verschachteln

Container-Queries – @container

Media Queries ändern die Stile von Elementen anhand der Größe des Viewports oder Browserfensters. @container-Queries hingegen ändern Stile anhand der Größe eines umfassenden Containers. Sie werden in zwei Schritten eingesetzt:

Schritt 1

section {
  container-type: inline-size;
  container-name: section;
}

oder als Kurzschrift

                 ┌─ Name des Containers
section {        ▼
	container: demo / inline-size;
                          ▲
             Ausrichtung ─┘
}

container-type macht ein Element zu einem Container. Die zwei möglichen Werte sind:

inline-size
bezieht sich auf die Breite des Containers bei Schreibrichtung links : rechts
block-size
bezieht sich auf die Höhe des Containers bei Schreibrichtung top : down
belichtung
Mit einer Bildunterschrift entweder unter dem Bild oder neben dem Bild – je nach Breite des umfassenden Containers.

Wenn der Viewport so breit wird, dass das section-Element auf einen Teil der Breite beschränkt wird – z.B. durch CSS flex oder grid

Schritt 2

@container section (inline-size > 920px) {
	figure {
		display: flex;
		justify-content: space-between;
		align-items: end;
		max-width: 100%;
	}
	
	figure img {
		width: 66%;
	}
	
	figcaption {
		width: 30%
	}
}

Auf kleinen und mittelgroßen Monitoren bleibt das Bild max. 500px breit, die Unterschrift sitzt unter dem Bild. Wird das Container-Element section sehr breit, wird die Bildunterschrift neben das Bild gesetzt.

Die Browser unterstützen @container seit Ende 2022 / Anfang 2023.

Container-Query für srcset / sizes und source

Was aber noch nicht möglich ist: srcset und sizes werden noch vor dem CSS aufgelöst, so dass es gar nicht möglich ist, srcset, sizes und auch sources im picture-Element anhand einer Container-Query aufzulösen.

 
<figure>
<img srcset="img/bild_420x286.jpg 420w,
             img/bild_920x627.jpg 920w"
     sizes="container(max-width: 600px) 420px,
            920px"
     src="img/bild_920x627.jpg"
     alt="Bildgröße anhand einer Container-Query statt einer Media-Query bestimmen">
</figure>
Bildgröße anhand einer Container-Query statt einer Media-Query bestimmen

420w und 920w sind die Breitenangaben, die sich auf die Breite des Browserfensters beziehen. Es gibt noch keine Bezugsgröße für die Breite eines Containers: cw und ch vielleicht …?

CSS nesting – verschachteln

Bis Ende 2023 gab es Nesting – das Verschachteln von CSS-Regeln – nur mit Preprozessoren wie SASS und LESS, aber im letzten Quartal haben alle Mainstreambrowser CSS Nesting umgesetzt.

elternRegel {
	/* Regeln für den Selektor elternRegel  */
	& KindRegel {
		/* Regeln für untergeordnete Selektoren */
	}
}

Statt einen Selektor wiederholt mit verschiedenen Kind-Elementen oder Pseudo-Selektoren zu notieren, setzt das native CSS Nesting eine Regel in eine andere Regel. Dabei entsteht eine übersichtliche Hierarchie, die besser lesbar und einfacher zu ändern ist.

<nav class="demo-menu">
	<div class="logo"><img src="logo.png" width="120" height="120" alt=""></div>
	<ul>
		<li>item1</li>
		<li>item1</li>
		<li>item1</li>
	</ul>
</nav>
.demo-menu {
	background: black;
	padding: 4px 1rem;
	display: flex;
	gap: 18px;
}

.logo { 
	width: 60px;
	height: 60px;
	background: ivory;
}

.demo-menu ul {
	list-style-type: none;
	display: flex;
	gap: 18px;
}

.demo-menu li {
	color: white;
}
.demo-menu {
	background: black;
	padding: 4px 1rem;
	display: flex;
	gap: 18px;

	.logo {
		width: 60px;
		height: 60px;
		background: ivory;
	}

	ul {
		list-style-type: none;
		display: flex;
		gap: 18px;

		li { color: white; }
	}
}

Die Seite CSS Nesting beantwortet Fragen wie »Wie werden Breakpoints bzw. Media Queries in Nesting umgesetzt?» und »Wie reagiert Nesting auf Spezifität?«

dvw und dvh – Dynamische Breite und Höhe des Viewports

dvw und dvh sind Weiterentwicklungen von vw und vh, die eine Anpassung vornehmen, wenn sich das Browserfenster auf dem mobilen Geräte ändert.

color-mix

color-mix mischt zwei Farben zu einer neuen Farbe und braucht dafür einen Farbraum sowie die Angaben zu den beiden Farben.

background-color: color-mix( in: color-space, color %, color %)

Als Farbraum können srgb und hsl eingesetzt werden.

background-color: color-mix(in srgb, red 50%, blue 50%);

color-mix-Werte lassen sich als Color-Stops in Verläufen einsetzen, z.B. um besonders zarte Verläufe in Pastelltönen zu setzen.

background-image: 
linear-gradient(to right,
				color-mix(in srgb, yellow 30%, white 70%) 0%, 
				color-mix(in srgb, orange 30%, white 70%) 50%);

Neben srgb als Standard-Farbraum könnte auch display-p3 (ein etwas größerer Farbraum der jüngeren Monitore) verwendet werden. Da bleibt Mac OS Safari allerdings außen vor.

Zwar unterstützt auch Safari Monitore mit dem größeren Gamut display-p3, aber nutzt eine andere Notation (Wide Gamut Color in CSS with Display-P3).

background: linear-gradient(
	to right, 
	color(display-p3 1 0.9 0.9), /* Rot */
	color(display-p3 0.9 0.9 1)  /* Blau */
)

rotate(), scale() und translate() ohne transform

In CSS Transform Level 2 sind die rotate()-, scale()- und translate()-Funktionen, die zuvor die transform-Eigenschaft nutzen, zu unabhängigen CSS-Eigenschaften geworden. Allesamt sind sie experimentelle Eigenschaften der Mainstream-Browser, die man sich heute bereits ansehen kann.

<div style="height:200px">
	<div class="turnme">Als es klingelte, nachts es war kurz vor halb 10</div>
</div>
Als es klingelte, nachts es war kurz vor halb 10
.turnme {
	width: 200px;
	height: 70px;
	scale: 0.9;          // anstelle von transform: scale(…)
	rotate: 90deg;       // anstelle von transform: rotate(…)
	translate: 50% -50%; // anstelle von transform: translate(…)
	transform-origin: left;
}

Media Queries und Breakpoint mit »Bereich zwischen« festlegen

Neben min-width und max-width kann die Media Query in den modernen Browsern auch mit einem range – Bereich «zwischen» eingesetzt werden.

/** Bei einer Breite des Viewports zwischen 320px und 980px **
@media (min-width: 320px) and (max-width: 980px) {
	.elem {
		…
	}
}

Die Schreibweise mit einem Range / Bereich als Boolescher Operator den Programmierern entgegen und ist kürzer:

@media (320px <= width <= 980px) {
	.elem {
		…
	}
}
Suchen auf mediaevent.de