Verwendung von CSS-Benutzereigenschaften (Variablen)
Benutzereigenschaften (manchmal auch als CSS-Variablen oder kaskadierende Variablen bezeichnet) sind von CSS-Autoren definierte Entitäten, die spezifische Werte darstellen, die in einem Dokument wiederverwendet werden sollen. Sie werden mit der @property
At-Regel oder durch die Syntax für benutzerdefinierte Eigenschaften (z. B. --primary-color: blue;
) festgelegt. Benutzerdefinierte Eigenschaften werden mit der CSS var()
Funktion aufgerufen (z. B. color: var(--primary-color);
).
Komplexe Websites haben sehr große Mengen an CSS, was häufig zu vielen wiederholten CSS-Werten führt. Zum Beispiel ist es üblich, dieselbe Farbe an Hunderten von verschiedenen Stellen in Stylesheets zu sehen. Das Ändern einer Farbe, die an vielen Stellen dupliziert wurde, erfordert eine Suche und Ersetzung über alle Regeln und CSS-Dateien hinweg. Benutzerdefinierte Eigenschaften ermöglichen es, einen Wert an einer Stelle zu definieren und ihn dann an mehreren anderen Stellen zu referenzieren, sodass die Arbeit damit erleichtert wird. Ein weiterer Vorteil ist die Lesbarkeit und Semantik. Zum Beispiel ist --main-text-color
einfacher zu verstehen als die Hexadezimalfarbe #00ff00
, besonders wenn die Farbe in unterschiedlichen Kontexten verwendet wird.
Benutzereigenschaften, die mit zwei Bindestrichen (--
) definiert werden, unterliegen der Kaskade und übernehmen ihren Wert vom Elternteil. Die @property
At-Regel ermöglicht mehr Kontrolle über die benutzerdefinierte Eigenschaft und erlaubt es Ihnen zu spezifizieren, ob sie ihren Wert von einem Elternteil erbt, was der initiale Wert ist und welche Typbeschränkungen gelten sollen.
Hinweis: Variablen funktionieren nicht in Media Queries und Container Queries. Sie können die var()
Funktion in jedem Teil eines Wertes in jeder Eigenschaft eines Elements verwenden. Sie können var()
nicht für Eigenschaftsnamen, Selektoren oder irgendetwas anderes als Eigenschaftswerte verwenden, was bedeutet, dass Sie es nicht in einer Media Query oder Container Query verwenden können.
Deklaration benutzerdefinierter Eigenschaften
In CSS können Sie eine benutzerdefinierte Eigenschaft mit zwei Bindestrichen als Präfix für den Eigenschaftsnamen oder durch die Verwendung der @property
At-Regel deklarieren. Die folgenden Abschnitte beschreiben, wie Sie diese beiden Methoden verwenden.
Verwendung eines Präfixes aus zwei Bindestrichen (--
)
Eine benutzerdefinierte Eigenschaft mit dem Präfix aus zwei Bindestrichen beginnt mit --
, gefolgt vom Eigenschaftsnamen (z. B. --my-property
) und einem Eigenschaftswert, der jeden gültigen CSS-Wert darstellen kann. Wie jede andere Eigenschaft wird dies innerhalb eines Regelsets geschrieben. Das folgende Beispiel zeigt, wie eine benutzerdefinierte Eigenschaft --main-bg-color
erstellt wird und einen <named-color>
Wert von brown
verwendet:
section {
--main-bg-color: brown;
}
Der dem Regelset gegebene Selektor (z. B. <section>
Elemente im obigen Beispiel) definiert den Bereich, in dem die benutzerdefinierte Eigenschaft verwendet werden kann. Aus diesem Grund ist es üblich, benutzerdefinierte Eigenschaften auf der :root
Pseudoklasse zu definieren, sodass sie global referenziert werden können:
:root {
--main-bg-color: brown;
}
Das muss jedoch nicht immer der Fall sein: Es gibt möglicherweise gute Gründe, den Bereich Ihrer benutzerdefinierten Eigenschaften zu begrenzen.
Hinweis: Namen für benutzerdefinierte Eigenschaften sind case-sensitive — --my-color
wird als eine separate benutzerdefinierte Eigenschaft zu --My-color
behandelt.
Verwendung der @property
At-Regel
Die @property
At-Regel ermöglicht es Ihnen, die Definition einer benutzerdefinierten Eigenschaft ausdrucksstärker zu gestalten, indem sie die Möglichkeit bietet, einen Typ mit der Eigenschaft zu verknüpfen, Standardwerte festzulegen und die Vererbung zu steuern. Das folgende Beispiel erstellt eine benutzerdefinierte Eigenschaft namens --logo-color
, die einen <color>
erwartet:
@property --logo-color {
syntax: "<color>";
inherits: false;
initial-value: #c0ffee;
}
Wenn Sie benutzerdefinierte Eigenschaften in JavaScript statt direkt in CSS definieren oder bearbeiten möchten, gibt es für diesen Zweck eine entsprechende API. Wie das funktioniert, erfahren Sie auf der Seite zur CSS Properties and Values API.
Referenzierung benutzerdefinierter Eigenschaften mit var()
Unabhängig davon, welche Methode Sie zur Definition einer benutzerdefinierten Eigenschaft wählen, verwenden Sie sie durch Referenzierung der Eigenschaft in einer var()
Funktion anstelle eines standardmäßigen Eigenschaftswerts:
details {
background-color: var(--main-bg-color);
}
Erste Schritte mit benutzerdefinierten Eigenschaften
Beginnen wir mit etwas HTML, das wir mit einigen Stilen versehen möchten. Es gibt ein <div>
, das als Container dient und einige Kindelemente umfasst, von denen einige verschachtelte Elemente haben:
<div class="container">
<div class="one">
<p>One</p>
</div>
<div class="two">
<p>Two</p>
<div class="three">
<p>Three</p>
</div>
</div>
<input class="four" placeholder="Four" />
<textarea class="five">Five</textarea>
</div>
Wir verwenden das folgende CSS, um einige verschiedene Elemente basierend auf ihren Klassen zu stylen (einige Layoutregeln werden hier nicht angezeigt, damit wir uns auf die Farben konzentrieren können). Je nach ihren Klassen geben wir den Elementen teal
oder pink
Hintergrundfarben:
/* For each class, set some colors */
.one {
background-color: teal;
}
.two {
color: black;
background-color: pink;
}
.three {
color: white;
background-color: teal;
}
.four {
background-color: teal;
}
.five {
background-color: teal;
}
Dies ergibt folgendes Ergebnis:
Es gibt die Möglichkeit, benutzerdefinierte Eigenschaften zu verwenden, um sich wiederholende Werte in diesen Regeln zu ersetzen. Nachdem --main-bg-color
im Bereich der .container
definiert und dessen Wert an mehreren Stellen referenziert wird, sehen die aktualisierten Stile so aus:
/* Define --main-bg-color here */
.container {
--main-bg-color: teal;
}
/* For each class, set some colors */
.one {
background-color: var(--main-bg-color);
}
.two {
color: black;
background-color: pink;
}
.three {
color: white;
background-color: var(--main-bg-color);
}
.four {
background-color: var(--main-bg-color);
}
.five {
background-color: var(--main-bg-color);
}
Verwendung der :root Pseudoklasse
Für einige CSS-Deklarationen ist es möglich, dies höher in der Kaskade zu deklarieren und CSS-Vererbung dieses Problem lösen zu lassen. Für nicht-triviale Projekte ist dies nicht immer möglich. Durch die Deklaration einer benutzerdefinierten Eigenschaft auf der :root
Pseudoklasse und deren Verwendung dort, wo sie im Dokument benötigt wird, kann ein CSS-Autor die Notwendigkeit der Wiederholung reduzieren:
/* Define --main-bg-color here */
:root {
--main-bg-color: teal;
}
/* For each class, set some colors */
.one,
.three,
.four,
.five {
background-color: var(--main-bg-color);
}
.two {
color: black;
background-color: pink;
}
Dies führt zum gleichen Ergebnis wie das vorhergehende Beispiel, erlaubt jedoch eine kanonische Deklaration des gewünschten Eigenschaftswerts (--main-bg-color: teal;
), was sehr nützlich ist, wenn Sie den Wert später im gesamten Projekt ändern möchten.
Vererbung von benutzerdefinierten Eigenschaften
Eine benutzerdefinierte Eigenschaft, die mit zwei Bindestrichen --
anstelle von @property
definiert wird, erbt immer den Wert ihres Elternteils. Dies wird im folgenden Beispiel demonstriert:
<div class="one">
<p>One</p>
<div class="two">
<p>Two</p>
<div class="three"><p>Three</p></div>
<div class="four"><p>Four</p></div>
</div>
</div>
div {
background-color: var(--box-color);
}
.two {
--box-color: teal;
}
.three {
--box-color: pink;
}
Die Ergebnisse von var(--box-color)
in Abhängigkeit von der Vererbung sind wie folgt:
class="one"
: ungültiger Wert, was der Standardwert einer auf diese Weise definierten benutzerdefinierten Eigenschaft istclass="two"
:teal
class="three"
:pink
class="four"
:teal
(geerbt von ihrem Elternteil)
Ein Aspekt von benutzerdefinierten Eigenschaften, den die obigen Beispiele zeigen, ist, dass sie sich nicht genau wie Variablen in anderen Programmiersprachen verhalten. Der Wert wird dort berechnet, wo er benötigt wird und nicht gespeichert und an anderen Stellen eines Stylesheets wiederverwendet. Zum Beispiel können Sie nicht den Wert einer Eigenschaft setzen und erwarten, den Wert in einer Regel eines Geschwisterelements zu erhalten. Die Eigenschaft ist nur für den übereinstimmenden Selektor und seine Nachkommen gesetzt.
Verwendung von @property
, um die Vererbung zu steuern
Die @property
At-Regel lässt Sie explizit festlegen, ob die Eigenschaft vererbt wird oder nicht. Das folgende Beispiel erstellt eine benutzerdefinierte Eigenschaft mit der @property
At-Regel. Die Vererbung ist deaktiviert, ein <color>
Datentyp ist definiert und ein Anfangswert von teal
ist festgelegt.
Das Elternelement setzt --box-color
auf einen Wert von green
und verwendet --box-color
als Wert für seine Hintergrundfarbe. Das Kindelement verwendet auch background-color: var(--box-color)
, und man würde erwarten, dass es die Farbe green
hat, wenn die Vererbung aktiviert ist (oder wenn es mit der Doppelt-Bindestrich-Syntax definiert wird).
<div class="parent">
<p>Parent element</p>
<div class="child">
<p>Child element with inheritance disabled for --box-color.</p>
</div>
</div>
@property --box-color {
syntax: "<color>";
inherits: false;
initial-value: teal;
}
.parent {
--box-color: green;
background-color: var(--box-color);
}
.child {
width: 80%;
height: 40%;
background-color: var(--box-color);
}
Weil inherits: false;
in der At-Regel gesetzt ist und ein Wert für die --box-color
Eigenschaft nicht im .child
Bereich deklariert ist, wird der Anfangswert teal
verwendet statt green
, das vom Elternteil geerbt worden wäre:
Fallback-Werte für benutzerdefinierte Eigenschaften
Sie können Fallback-Werte für benutzerdefinierte Eigenschaften mit der var()
Funktion und dem initial-value
der @property
At-Regel definieren.
Hinweis: Fallback-Werte werden nicht zur Behebung von Kompatibilitätsproblemen verwendet, wenn CSS-Benutzereigenschaften nicht unterstützt werden, da der Fallback-Wert hierbei nicht helfen würde. Fallbacks decken den Fall ab, in dem der Browser CSS-Benutzereigenschaften unterstützt und in der Lage ist, einen anderen Wert zu verwenden, falls die gewünschte Variable noch nicht definiert oder ungültig ist.
Definition von Fallbacks in der var()
Funktion
Mit der var()
Funktion können Sie mehrere Fallback-Werte definieren, wenn die angegebene Variable noch nicht definiert ist; dies kann nützlich sein, wenn Sie mit Custom Elements und Shadow DOM arbeiten.
Das erste Argument der Funktion ist der Name der benutzerdefinierten Eigenschaft. Das zweite Argument der Funktion ist ein optionaler Fallback-Wert, der als Ersatzwert verwendet wird, wenn die referenzierte benutzerdefinierte Eigenschaft ungültig ist. Die Funktion akzeptiert zwei Parameter und weist alles nach dem ersten Komma dem zweiten Parameter zu. Wenn der zweite Parameter ungültig ist, schlägt der Fallback fehl. Zum Beispiel:
.one {
/* Red if --my-var is not defined */
color: var(--my-var, red);
}
.two {
/* pink if --my-var and --my-background are not defined */
color: var(--my-var, var(--my-background, pink));
}
.three {
/* Invalid: "--my-background, pink" */
color: var(--my-var, --my-background, pink);
}
Die Verwendung einer benutzerdefinierten Eigenschaft als Fallback, wie im zweiten Beispiel oben (var(--my-var, var(--my-background, pink))
), ist der richtige Weg, um mehr als einen Fallback mit var()
zu versehen. Sie sollten sich jedoch der Leistungsbelastung dieser Methode bewusst sein, da es mehr Zeit in Anspruch nimmt, die verschachtelten Variablen zu parsen.
Hinweis: Die Syntax des Fallbacks erlaubt wie die von benutzerdefinierten Eigenschaften Kommata. Zum Beispiel definiert var(--foo, red, blue)
einen Fallback von red, blue
— alles zwischen dem ersten Komma und dem Ende der Funktion wird als Fallback-Wert betrachtet.
Fallbacks mit dem @property
Anfangswert
Abgesehen von der Verwendung von var()
kann der in der @property
At-Regel definierte initial-value
als Fallback-Mechanismus verwendet werden. Tatsächlich haben wir dies bereits im Abschnitt @property
Vererbung gesehen.
Das folgende Beispiel setzt einen Anfangswert von --box-color
auf teal
mithilfe der @property
At-Regel. Im Regelset, das auf die At-Regel folgt, möchten wir --box-color
auf pink
setzen, aber es gibt einen Tippfehler im Wertnamen. Dasselbe gilt für das dritte <div>
, wo wir 2rem
für die benutzerdefinierte Eigenschaft verwendet haben, die einen gültigen <color>
Wert erwartet. Sowohl 2rem
als auch peenk
sind ungültige Farbwerte, sodass der Anfangswert teal
angewendet wird:
@property --box-color {
syntax: "<color>";
initial-value: teal;
inherits: false;
}
.one {
--box-color: pink;
background-color: var(--box-color);
}
.two {
--box-color: peenk;
background-color: var(--box-color);
}
.three {
--box-color: 2rem;
background-color: var(--box-color);
}
Ungültige benutzerdefinierte Eigenschaften
Jedem CSS-Eigenschaft kann eine definierte Menge von Werten zugewiesen werden. Wenn Sie versuchen, einer Eigenschaft einen Wert zuzuweisen, der außerhalb der gültigen Werte liegt, wird er als ungültig betrachtet.
Wenn der Browser einen ungültigen Wert für eine reguläre CSS-Eigenschaft (zum Beispiel einen Wert von 16px
für die color
Eigenschaft) erkennt, verwirft er die Deklaration und Elementen werden die Werte zugewiesen, die sie hätten, wenn die Deklaration nicht existierte. Im folgenden Beispiel sehen wir, was passiert, wenn eine reguläre CSS-Deklaration ungültig ist; color: 16px;
wird verworfen und die vorherige Regel color: blue
wird stattdessen angewendet:
<p>This paragraph is initially black.</p>
p {
font-weight: bold;
color: blue;
}
p {
/* oops, not a valid color */
color: 16px;
}
Wenn jedoch die Werte benutzerdefinierter Eigenschaften analysiert werden, weiß der Browser noch nicht, wo sie verwendet werden, sodass er fast alle Werte als gültig betrachtet. Leider können diese gültigen Werte in einem Kontext verwendet werden, in dem sie möglicherweise keinen Sinn ergeben. Eigenschaften und benutzerdefinierte Variablen können zu ungültigen CSS-Anweisungen führen, was zum Konzept dieser gültig zur Berechnungszeit führt.
Wenn der Browser eine ungültige var()
Substitution erkennt, wird der initiale oder geerbte Wert der Eigenschaft verwendet. Dieses Beispiel ist genau wie das letzte, außer dass wir eine benutzerdefinierte Eigenschaft verwenden.
Der Browser ersetzt den Wert von --text-color
durch var(--text-color)
, aber 16px
ist kein gültiger Eigenschaftswert für color
. Nach der Substitution ergibt die Eigenschaft keinen Sinn, sodass der Browser diese Situation in zwei Schritten behandelt:
- Überprüfen, ob die Eigenschaft
color
vererbbar ist. Sie ist es, aber dieses<p>
hat keinen Elternteil, bei dem diecolor
Eigenschaft gesetzt ist. Also fahren wir mit dem nächsten Schritt fort. - Setzen Sie den Wert auf den Standard-Anfangswert, der schwarz ist.
<p>This paragraph is initially black.</p>
:root {
--text-color: 16px;
}
p {
font-weight: bold;
color: blue;
}
p {
color: var(--text-color);
}
Für solche Fälle kann die @property
At-Regel unerwartete Ergebnisse verhindern, indem sie ermöglicht, den Anfangswert der Eigenschaft festzulegen:
<p>This paragraph is initially black.</p>
@property --text-color {
syntax: "<color>";
inherits: false;
initial-value: teal;
}
:root {
--text-color: 16px;
}
p {
font-weight: bold;
color: blue;
}
p {
color: var(--text-color);
}
Werte in JavaScript
Um die Werte benutzerdefinierter Eigenschaften in JavaScript zu verwenden, ist es genau wie bei standardmäßigen Eigenschaften.
// get variable from inline style
element.style.getPropertyValue("--my-var");
// get variable from wherever
getComputedStyle(element).getPropertyValue("--my-var");
// set variable on inline style
element.style.setProperty("--my-var", jsVar + 4);