Neue CSS-Features

Diese Liste zeigt moderne CSS-Features, die in aktuellen Projekten häufig verwendet werden. Der Fokus liegt auf Praxis, Verständlichkeit und realem Nutzen.

Wichtig: Viele Features sind inzwischen breit unterstützt – trotzdem lohnt sich bei Projekten ein kurzer Check mit @supports, wenn du auf Nummer sicher gehen willst.


Layout & Struktur

:has() – Parent Selector

Mit :has() kann ein Element abhängig von seinem Inhalt gestylt werden. Zum ersten Mal ist es möglich, „nach unten“ zu selektieren.

.card:has(img) {
  border: 2px solid green;
}

Container Queries – @container

Container Queries reagieren auf die Grösse eines Elternelements statt auf den Viewport. Sie eignen sich besonders für wiederverwendbare Komponenten.

@container (min-width: 400px) {
  .item {
    flex-direction: row;
  }
}

subgrid

Mit subgrid kann ein Kind-Grid die Spalten oder Zeilen des Parent-Grids übernehmen. Das vereinfacht komplexe Grid-Layouts deutlich.

.child {
  display: grid;
  grid-template-columns: subgrid;
}

gap in Flexbox

Die Eigenschaft gap funktioniert nicht nur in Grid-, sondern auch in Flexbox-Layouts. Abstände lassen sich damit sauber und ohne Margin-Hacks definieren.

.row {
  display: flex;
  gap: 1rem;
}

Selektoren & Accessibility

:is()

:is() fasst mehrere Selektoren zusammen und reduziert die Code-Menge. Die Spezifität bleibt dabei gering.

:is(h1, h2, h3) {
  line-height: 1.2;
}

:where()

:where() funktioniert ähnlich wie :is(), hat aber immer eine Spezifität von 0. Ideal für Basis- und Reset-Styles.

:where(nav a) {
  color: inherit;
}

:not()

Mit :not() lassen sich Elemente gezielt ausschliessen. Seit neueren CSS-Versionen können mehrere Selektoren kombiniert werden.

button:not(.primary, .danger) {
  opacity: 0.7;
}

:focus-visible

Mit :focus-visible wird ein Fokus-Stil nur angezeigt, wenn ein Element per Tastatur fokussiert wird.

button:focus-visible {
  outline: 3px solid blue;
}

Grössen & Responsive Design

Neue Viewport Units (svh, lvh, dvh)

Diese Units lösen Probleme mit mobilen Browsern und dynamischen Adressleisten. Besonders dvh ist für Fullscreen-Layouts nützlich.

.hero {
  min-height: 100dvh;
}

min(), max() und clamp()

Mit diesen Funktionen lassen sich responsive Grössen ohne Media Queries umsetzen. Häufige Einsatzbereiche sind Schriftgrössen und Abstände.

h1 {
  font-size: clamp(1.4rem, 3vw, 2.2rem);
}

aspect-ratio

aspect-ratio definiert feste Seitenverhältnisse für Elemente, z. B. für Videos oder Bilder.

.video {
  aspect-ratio: 16 / 9;
}

UI & Komponenten

<dialog> und ::backdrop

Das <dialog>-Element ermöglicht native Modals. Der Hintergrund kann mit ::backdrop direkt gestylt werden.
Dialog Beispiel testen.

dialog::backdrop {
  background: rgba(0, 0, 0, 0.5);
}

accent-color

Mit accent-color lassen sich native Form-Elemente einfärben, ohne sie komplett neu zu bauen.

input[type="checkbox"] {
  accent-color: hotpink;
}

CSS Nesting

CSS unterstützt jetzt natives Nesting. Selektoren können wie bei Preprozessoren verschachtelt werden.
CSS Nesting Beispiel testen.

.card {
  padding: 1rem;

  & h2 {
    margin: 0;
  }
}

@layer – Cascade Layers

Mit Cascade Layers lässt sich die Reihenfolge von Styles kontrollieren, ohne auf !important zurückzugreifen.

@layer reset, base, components, utilities;

@scope

@scope begrenzt CSS-Regeln auf einen bestimmten Bereich. So bleiben Styles lokal und verursachen weniger Nebenwirkungen.

@scope (.card) {
  h2 {
    color: red;
  }
}

Animation & Effekte

Scroll-driven Animations

Mit scroll-timeline lassen sich Animationen direkt an den Scroll-Fortschritt koppeln. Dadurch sind Scroll-Effekte ohne JavaScript möglich.

.progress {
  animation: grow linear both;
  animation-timeline: scroll();
}

view-timeline

view-timeline startet Animationen, wenn ein Element in den Viewport eintritt oder ihn verlässt.

.card {
  animation: fade-in 1s both;
  animation-timeline: view();
}

prefers-reduced-motion

Diese Media Query berücksichtigt Nutzer:innen, die reduzierte Animationen bevorzugen.

@media (prefers-reduced-motion: reduce) {
  * {
    animation: none;
    transition: none;
  }
}

„next level“ CSS-Features

color-mix()

Mit color-mix() können Farben direkt in CSS gemischt werden. Das ist nützlich für Hover-Zustände oder Design-Systeme.

background-color: color-mix(
  in srgb,
  red 70%,
  white
);

color-contrast()

color-contrast() wählt automatisch die bestmögliche Kontrastfarbe aus einer Liste aus (Accessibility).

color: color-contrast(
  white vs black, navy
);

@supports selector(:has(*))

Mit @supports lassen sich neue Features gezielt absichern. So kann modernes CSS nur dort aktiviert werden, wo es unterstützt wird.

@supports selector(:has(*)) {
  .card:has(img) {
    border: 2px solid green;
  }
}

env(safe-area-inset-*)

Diese Variablen berücksichtigen Safe Areas auf mobilen Geräten (z. B. iPhone mit Notch).

.app {
  padding-bottom: env(safe-area-inset-bottom);
}

Logical Properties

Logical Properties ersetzen richtungsabhängige Eigenschaften und funktionieren sowohl für LTR- als auch RTL-Sprachen.

.box {
  margin-inline: 1rem;
  padding-block: 0.75rem;
}

inset statt top / right / bottom / left

inset ist die Kurzschreibweise für alle vier Positionierungswerte.

.modal {
  position: absolute;
  inset: 0;
}

Kurz gesagt

Wenn du modernes CSS lernst, sind das die wichtigsten Features, die du zuerst beherrschen solltest.

  • :has()
  • Container Queries
  • clamp()
  • CSS Nesting
  • @layer
  • @scope