Menu

CSS Variablen: Custom Properties, :root und var()

CSS Variablen (Custom Properties) speichern einen Wert einmal und verwenden ihn mit var() wieder. Hier lernst du, wie du sie in :root deklarierst, ihren Geltungsbereich nutzt und sie überschreibst, Fallbacks angibst, Themes mit JavaScript umschaltest und die Falle mit ungültigen Werten vermeidest.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Eine CSS-Variable deklarieren und verwenden

Eine CSS-Variable, offiziell eine Custom Property, ist eine Eigenschaft, deren Name mit -- beginnt. Du deklarierst sie einmal, meist in :root, damit die ganze Seite sie erbt, und liest sie überall mit var().

Ändere --brand in #16a34a, und der Rahmen der Karte und der Button ändern sich gemeinsam. Genau darum geht es: ein Wert, eine Stelle zum Ändern. Variablen lassen sich auch mit calc() kombinieren, wie das seitliche Padding des Buttons zeigt.

Syntax

:root {
  --name: value;         /* declare */
}

.element {
  color: var(--name);                 /* use */
  color: var(--name, #111827);        /* use, with a fallback */
  padding: calc(var(--space) * 2);    /* compute with it */
}
RegelDetail
NameBeginnt mit --, dann Buchstaben, Ziffern, - oder _. Groß- und Kleinschreibung zählt: --Brand ist nicht --brand.
WertFast alles: eine Farbe, eine Länge, eine Liste, ein String. Er wird erst geprüft, wenn er verwendet wird.
Wo deklarierenIn jeder Regel. :root für globale Werte, der Selektor einer Komponente für lokale.
VererbungCustom Properties werden vererbt, ein Kind sieht also die Werte seiner Vorfahren.
Wo var() funktioniertNur in Eigenschaftswerten, nicht in Selektoren, Eigenschaftsnamen oder @media-Bedingungen.

:root trifft das <html>-Element. Man nimmt es statt html, weil es die Spezifität einer Klasse hat und nach Konvention „globale Einstellungen“ signalisiert.

Geltungsbereich: eine Variable pro Komponente überschreiben

Weil Variablen vererbt werden, ändert eine erneute Deklaration an einem Element den Wert für dieses Element und alles darin. Die Regel, die die Variable verwendet, bleibt gleich.

Die Varianten setzen nur eine Variable, nie den Rahmen selbst. Eine vierte Variante ist eine einzige Zeile.

Fallback-Werte

var(--name, fallback) verwendet den Fallback, wenn die Variable weder am Element noch an einem Vorfahren definiert ist. Alles nach dem ersten Komma ist der Fallback, er darf also selbst Kommas enthalten (var(--font, Georgia, serif)) und auch ein weiteres var() sein.

Variablen mit JavaScript ändern: ein Theme-Umschalter

JavaScript kann mit style.setProperty() an jedem Element eine Variable setzen. Setz sie an document.documentElement (das <html>-Element), und die ganze Seite folgt. Das häufigere Muster schaltet eine Klasse um, die die Variablen neu definiert:

Einen Wert liest du mit getComputedStyle(element).getPropertyValue('--text') zurück. Beachte, dass setProperty einen Inline-Style an <html> schreibt, der die Klasse .dark schlägt. Nach dem Klick auf den zweiten Button bleibt die Textfarbe deshalb in beiden Themes gleich, bis du den Inline-Wert mit root.style.removeProperty('--text') entfernst.

Werte aus dem HTML übergeben

Eine Variable in einem style-Attribut ist der sauberste Weg, Daten pro Element an ein Stylesheet zu übergeben. Das Design bleibt im CSS; das HTML liefert nur eine Zahl.

calc(var(--value) * 1%) macht aus der reinen Zahl einen Prozentwert. Variablen können sich auch innerhalb einer Media Query ändern: @media (min-width: 900px) { :root { --space: 20px; } } lässt jeden Abstand, der --space liest, auf breiten Bildschirmen wachsen.

Die Falle mit ungültigen Werten

Der Browser kann vorher nicht wissen, ob eine Variable einen gültigen Wert für die Eigenschaft enthält, die sie verwendet. Ist er ungültig, fällt die Eigenschaft nicht auf die vorherige Deklaration in der Regel zurück. Sie wird zum Berechnungszeitpunkt ungültig (invalid at computed-value time) und verhält sich, als wäre sie auf unset gesetzt: Vererbte Eigenschaften übernehmen den Wert des Elternelements, alle anderen ihren Anfangswert.

Der Text erbt 16px von <body>, und border-width fällt auf seinen Anfangswert medium zurück, den Browser als 3px zeichnen. Ohne Variablen wird eine ungültige Deklaration verworfen und die davor bleibt bestehen; mit Variablen ist es dafür zu spät. Ein Fallback hilft nicht, wenn die Variable definiert, aber falsch ist: Der Fallback gilt nur für eine undefinierte Variable.

CSS-Variablen vs. Sass-Variablen

CSS-VariablenSass-Variablen
Syntax--brand: #2563eb; und var(--brand)$brand: #2563eb;
Wann aufgelöstIm Browser, liveBeim Build, im Ergebnis nicht mehr vorhanden
Pro Element ändernJa, durch VererbungNein
Mit Klasse oder Media Query ändernJaNein
Aus JavaScript ändernJaNein
In Selektoren oder Media-BedingungenNeinJa

Beide arbeiten gut zusammen: Viele Projekte nutzen Sass für Logik beim Build und geben CSS-Variablen für alles aus, was sich anpassen lassen soll.

Häufige Fehler

  • Die zwei Bindestriche vergessen. var(brand) und ein als -brand deklariertes --brand funktionieren nicht.
  • Eine Variable in einer Media Query verwenden. @media (min-width: var(--bp)) ist ungültig. Media-Bedingungen brauchen feste Werte.
  • Erwarten, dass die frühere Deklaration eine ungültige Variable überlebt. Tut sie nicht; siehe die Falle oben.
  • Einheiten falsch kombinieren. --gap: 10; und dann margin: var(--gap)px ergibt nicht 10px. Nimm calc(var(--gap) * 1px) oder speichere 10px.
  • Am falschen Element deklarieren. Eine an .card deklarierte Variable sehen weder Geschwister noch Elternelement; gemeinsame Werte deklarierst du in :root.

Häufig gestellte Fragen

Wie deklariert man eine CSS-Variable?

Schreib in einer Regel eine Eigenschaft, deren Name mit zwei Bindestrichen beginnt, für einen globalen Wert meist in :root: :root { --brand: #2563eb; }. Lesen kannst du sie überall mit var(--brand), zum Beispiel color: var(--brand);.

Was ist :root in CSS?

:root ist eine Pseudoklasse, die das Wurzelelement des Dokuments trifft, in einer HTML-Seite also <html>. Dort deklarierte Variablen erbt jedes Element. Sie hat die Spezifität einer Klasse und schlägt damit einen einfachen html-Selektor.

Wie setzt man einen Standardwert für eine CSS-Variable?

Gib var() ein zweites Argument: color: var(--accent, #2563eb);. Der Fallback greift, wenn --accent weder am Element noch an seinen Vorfahren definiert ist. Er greift nicht, wenn die Variable mit einem Wert definiert ist, der für die Eigenschaft ungültig ist.

Wie ändert man eine CSS-Variable mit JavaScript?

Ruf setProperty am Style eines Elements auf: document.documentElement.style.setProperty('--brand', '#16a34a'). Jede Regel, die var(--brand) verwendet, aktualisiert sich sofort. Den aktuellen Wert liest du mit getComputedStyle(el).getPropertyValue('--brand').

Was ist der Unterschied zwischen CSS-Variablen und Sass-Variablen?

Sass-Variablen werden beim Kompilieren des Stylesheets durch ihre Werte ersetzt und können sich im Browser nicht ändern. CSS-Variablen leben im Browser: Sie werden vererbt, können sich pro Element unterscheiden, reagieren auf Media Queries und Klassen und lassen sich aus JavaScript ändern.

Unterscheiden CSS-Variablen Groß- und Kleinschreibung?

Ja. --Brand und --brand sind zwei verschiedene Variablen, anders als normale Eigenschaftsnamen wie color, bei denen die Schreibweise egal ist.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S