EMZETT.
Login

Kurz: CSS hat sich stark weiterentwickelt. Vieles, wofür man früher Sass oder JavaScript brauchte, geht heute direkt. Prüfe die Browserunterstützung auf caniuse.com oder MDN.

Teil des Kurses HTML + CSS

Kapitel 24 von 27 im Kurs HTML + CSS. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

CSS hat sich stark weiterentwickelt. Vieles, wofür man früher Sass oder JavaScript brauchte, geht heute direkt. Prüfe die Browserunterstützung auf caniuse.com oder MDN; alle hier gezeigten Funktionen sind in aktuellen Browsern verfügbar.

CSS-Verschachtelung (Nesting)

<style>
  .karte {
    padding: 14px; border: 2px solid #cbd5e1; border-radius: 10px; background: white;
    h3 { margin: 0 0 6px; color: #1e3a8a; }
    p { margin: 0; color: #475569; }
    a { color: #2563eb;
      &:hover { text-decoration: underline wavy; }
    }
    &:hover { border-color: #6366f1; }
    &.wichtig { border-color: crimson; }
    @media (min-width: 500px) { padding: 22px; }
  }
  body { background: #f1f5f9; }
</style>
<div class="karte"><h3>Verschachtelt</h3><p>Regeln stehen im Elternselektor.</p><a href="#">Link</a></div>

& steht für den Elternselektor. So bleibt zusammengehöriges CSS beieinander.

@layer: Reihenfolge der Kaskade steuern

Mit Ebenen legst du fest, welche Regeln Vorrang haben, unabhängig von der Spezifität:

@layer reset, basis, komponenten, werkzeuge;
 
@layer reset { * { margin: 0; box-sizing: border-box; } }
@layer basis { a { color: royalblue; } }
@layer komponenten { .button { background: navy; color: white; } }

Spätere Ebenen schlagen frühere. Ungeschichtete Regeln schlagen alle Ebenen. Praktisch, um Frameworks sauber zu überschreiben.

:has() und :is()

<style>
  label:has(input:checked) { background: #dcfce7; border-color: seagreen; }
  label { display: block; border: 2px solid #cbd5e1; padding: 8px 12px; margin: 4px 0; border-radius: 8px; cursor: pointer; }
  :is(h1, h2, h3):hover { color: crimson; }
  form:has(:user-invalid) { outline: 2px solid crimson; padding: 8px; }
</style>
<label><input type="radio" name="x"> Option A</label>
<label><input type="radio" name="x"> Option B</label>
<h3>Fahre über mich</h3>
<form><input type="email" value="falsch" required></form>

:has() ist der lang ersehnte Eltern-Selektor; :user-invalid meldet Fehler erst nach der Eingabe der Nutzerin.

Container Queries und Einheiten

Neue Einheiten passen sich dynamisch an: dvh/svh/lvh (Höhe des sichtbaren Fensters auf Handys, wenn Adressleisten ein-/ausfahren), cqw (Breite des Containers), lh (Zeilenhöhe), rlh.

.vollbild { min-height: 100dvh; }                 /* statt 100vh auf Handys */
.titel { font-size: clamp(1.2rem, 6cqw, 3rem); }  /* relativ zum Container */

aspect-ratio, gap, inset

<style>
  .video { aspect-ratio: 16 / 9; background: #0f172a; border-radius: 8px; display: grid; place-items: center; color: white; }
  .quadrat { aspect-ratio: 1; width: 80px; background: #f59e0b; border-radius: 50%; }
  .ueberlagerung { position: relative; height: 70px; background: #e2e8f0; }
  .ueberlagerung span { position: absolute; inset: 10px; background: #38bdf8; display: grid; place-items: center; }  /* top/right/bottom/left in einem */
</style>
<div class="video">16 / 9</div><div class="quadrat"></div>
<div class="ueberlagerung"><span>inset: 10px</span></div>

Logische Eigenschaften

Statt left/right/top/bottom gibt es logische Entsprechungen, die bei Sprachen mit anderer Schreibrichtung (Arabisch, Hebräisch) richtig mitwandern:

PhysischLogisch
margin-left / margin-rightmargin-inline-start / margin-inline-end
margin-top / margin-bottommargin-block-start / margin-block-end
width / heightinline-size / block-size
text-align: lefttext-align: start

Scrollen und Snapping

<style>
  html { scroll-behavior: smooth; }
  .karussell { display: flex; gap: 10px; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: thin; padding-bottom: 6px; }
  .karussell > div { flex: 0 0 70%; height: 90px; scroll-snap-align: center; background: #a78bfa; border-radius: 10px; display: grid; place-items: center; color: white; font-weight: bold; }
  .ziel { scroll-margin-top: 60px; }
</style>
<div class="karussell"><div>1</div><div>2</div><div>3</div><div>4</div></div>

Weitere Neuerungen im Überblick

FunktionZweck
accent-colorFarbe von Formularelementen
color-mix(), oklch(), light-dark()Farben mischen und Hell/Dunkel-Paare
text-wrap: balance / prettyschönerer Zeilenumbruch
field-sizing: contentTextfelder wachsen mit dem Inhalt
@starting-styleStartzustand für Übergänge beim Einblenden
transition-behavior: allow-discretedisplay-Wechsel animierbar
Popover API (popover-Attribut)Menüs und Hinweise ohne JavaScript
anchor-positioningElemente an andere Elemente binden
@scopeRegeln auf einen Teilbaum begrenzen
View Transitionsanimierte Seitenwechsel
<button popovertarget="info">Info öffnen</button>
<div id="info" popover style="padding:14px;border-radius:10px;border:2px solid #6366f1">
  Dieses Popover öffnet sich ohne JavaScript, schließt mit <kbd>Esc</kbd> und beim Klick daneben.
</div>

Ohne Präprozessor und Bibliothek auskommen?

  • Sass/SCSS ergänzt Schleifen, Mixins und Funktionen; Variablen und Verschachtelung gibt es inzwischen auch in nativem CSS
  • Tailwind CSS liefert viele kleine Hilfsklassen (p-4 text-lg); beliebt, aber nicht nötig
  • Frameworks wie Bootstrap bieten Fertigkomponenten

Lerne zuerst natives CSS. Es ist die Grundlage aller dieser Werkzeuge.

Merke

  • Verschachtelung mit &, Ebenen mit @layer
  • :has() wählt Eltern, :is()/:where() gruppieren, :user-invalid meldet Eingabefehler
  • Einheiten dvh, cqw, lh; aspect-ratio, inset, gap vereinfachen Layouts
  • Logische Eigenschaften (margin-inline) funktionieren in jeder Schreibrichtung
  • Popover, scroll-snap, text-wrap: balance ersetzen viel JavaScript
  • Unterstützung vorher auf caniuse.com prüfen

Übungsaufgabe

Baue eine Karte mit verschachteltem CSS, einem :has()-Zustand (Checkbox hebt die Karte hervor) und einem Popover für zusätzliche Infos.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Übergänge, Transformationen und Animationen

Weiter: CSS sauber organisieren

Alle Kapitel: HTML + CSS im Überblick