color()
Baseline 2023Newly available
Since May 2023, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
Die color()
-Funktionsnotation ermöglicht es, eine Farbe in einem bestimmten, festgelegten Farbraum anzugeben, anstatt im impliziten sRGB-Farbraum, in dem die meisten anderen Farbfunktionen arbeiten.
Die Unterstützung für einen bestimmten Farbraum kann mit der CSS-Medienfunktion color-gamut
erkannt werden.
Syntax
/* Absolute values */
color(display-p3 1 0.5 0);
color(display-p3 1 0.5 0 / .5);
/* Relative values */
color(from green srgb r g b / 0.5)
color(from #0000FF xyz calc(x + 0.75) y calc(z - 0.35))
Werte
Unten sind die Beschreibungen der erlaubten Werte für sowohl absolute als auch relative Farben aufgelistet.
Absolute Wertsyntax
color(colorspace c1 c2 c3[ / A])
Die Parameter sind wie folgt:
colorspace
-
Ein
<ident>
, das einen der vordefinierten Farbräume bezeichnet:srgb
,srgb-linear
,display-p3
,a98-rgb
,prophoto-rgb
,rec2020
,xyz
,xyz-d50
oderxyz-d65
. c1
,c2
,c3
-
Jeder Wert kann als
<number>
, als<percentage>
oder als das Schlüsselwortnone
(entspricht in diesem Fall0
) geschrieben werden. Diese Werte repräsentieren die Komponentenwerte für den Farbraum. Bei Verwendung eines<number>
-Wertes repräsentiert im Allgemeinen0
bis1
die Grenzen des Farbraums. Werte außerhalb dieses Bereichs sind erlaubt, liegen jedoch außerhalb des Gamut für den gegebenen Farbraum. Bei Verwendung eines Prozentwertes repräsentiert100%
1
und0%
entspricht0
. A
Optional-
Ein
<alpha-value>
, das den Alphakanalwert der Farbe darstellt, wobei die Zahl0
0%
(vollständig transparent) und1
100%
(vollständig undurchsichtig) entspricht. Zusätzlich kann das Schlüsselwortnone
verwendet werden, um explizit keinen Alphakanal anzugeben. Ist derA
-Kanalwert nicht explizit angegeben, wird er standardmäßig auf 100% gesetzt. Wenn er eingeschlossen ist, wird der Wert mit einem Schrägstrich (/
) vorangestellt.
Hinweis:
Weitere Informationen zum Effekt von none
finden Sie unter Fehlende Farbkomponenten.
Relative Wertsyntax
color(from <color> colorspace c1 c2 c3[ / A])
Die Parameter sind wie folgt:
from <color>
-
Das Schlüsselwort
from
wird immer eingeschlossen, wenn eine relative Farbe definiert wird, gefolgt von einem<color>
-Wert, der die Ursprungsfarbe darstellt. Dies ist die ursprüngliche Farbe, auf der die relative Farbe basiert. Die Ursprungsfarbe kann eine beliebige gültige<color>
-Syntax sein, einschließlich einer anderen relativen Farbe. colorspace
-
Ein
<ident>
, das den Farbraum der Ausgabefarbe bezeichnet, in der Regel einer der vordefinierten Farbräume:srgb
,srgb-linear
,display-p3
,a98-rgb
,prophoto-rgb
,rec2020
,xyz
,xyz-d50
oderxyz-d65
. c1
,c2
,c3
-
Jeder Wert kann als
<number>
, als<percentage>
oder als das Schlüsselwortnone
(entspricht in diesem Fall0
) geschrieben werden. Diese Werte repräsentieren die Komponentenwerte für die Ausgabefarbe. Bei Verwendung eines<number>
-Wertes repräsentiert im Allgemeinen0
bis1
die Grenzen des Farbraums. Werte außerhalb dieses Bereichs sind erlaubt, liegen jedoch außerhalb des Gamut für den gegebenen Farbraum. Im Allgemeinen entspricht bei Verwendung eines Prozentwertes100%
1
und0%
0
. A
Optional-
Ein
<alpha-value>
, das den Alphakanalwert der Ausgabefarbe darstellt, wobei die Zahl0
0%
(vollständig transparent) und1
100%
(vollständig undurchsichtig) entspricht. Zusätzlich kann das Schlüsselwortnone
verwendet werden, um explizit keinen Alphakanal anzugeben. Wenn derA
-Kanalwert nicht explizit angegeben ist, wird er auf den Alphakanalwert der Ursprungsfarbe standardisiert. Wenn er eingeschlossen ist, wird der Wert mit einem Schrägstrich (/
) vorangestellt.
Definition der Komponentenkanäle der relativen Farbausgabe
Bei Verwendung der relativen Farbsyntax innerhalb einer color()
-Funktion konvertiert der Browser die Ursprungsfarbe in eine äquivalente Farbe im angegebenen Farbraum (falls sie nicht bereits als solche angegeben ist). Die Farbe wird als drei verschiedene Farbkanaalwerte plus einem Alphakannalwert (alpha
) definiert. Diese Kanalwerte sind innerhalb der Funktion verfügbar, um bei der Definition der Ausgabefarbkanaalwerte verwendet zu werden:
-
Die drei Farbkanaalwerte der Ursprungsfarbe werden auf eine
<number>
-Wertkurve aufgelöst. Für vordefinierte Farbräume, je nachdem welcher spezifiziert ist, sind diese Werte eines der folgenden:-
r
,g
, undb
: Farbkanaalwerte für die auf RGB basierenden Farbräumesrgb
,srgb-linear
,display-p3
,a98-rgb
,prophoto-rgb
undrec2020
. -
x
,y
, undz
: Farbkanaalwerte für die auf CIE XYZ basierenden Farbräumexyz
,xyz-d50
undxyz-d65
.Hinweis: Jeder dieser Werte liegt normalerweise zwischen
0
und1
, kann aber, wie oben erläutert, außerhalb dieser Grenzen liegen.Hinweis: Das Referenzieren von
r
,g
undb
Werten innerhalb einercolor()
-Funktion mit einem XYZ-basierten Farbraum,x
,y
undz
Werten innerhalb einercolor()
-Funktion mit einem RGB-basierten Farbraum oder anderen Zeichen ist ungültig. Die verfügbaren Ursprungsfarbkanalwerte innerhalb der Funktion müssen mit dem spezifizierten Farbraumtyp übereinstimmen.
-
-
alpha
: Der Transparenzwert der Farbe, aufgelöst in einen<number>
zwischen0
und1
, einschließlich.
Bei der Definition einer relativen Farbe können die verschiedenen Kanäle der Ausgabefarbe auf verschiedene Arten ausgedrückt werden. Im Folgenden untersuchen wir einige Beispiele, um diese zu veranschaulichen.
In den ersten beiden Beispielen unten verwenden wir die relative Farbsyntax. Das erste gibt jedoch die gleiche Farbe wie die Ursprungsfarbe aus und das zweite gibt eine Farbe aus, die überhaupt nicht auf der Ursprungsfarbe basiert. Diese erzeugen nicht wirklich relative Farben! Sie würden solche wahrscheinlich niemals in einem echten Codebestand verwenden und stattdessen einfach einen absoluten Farbwert verwenden. Wir haben diese Beispiele als Ausgangspunkt für das Lernen der relativen color()
-Syntax aufgenommen.
Beginnen wir mit einer Ursprungsfarbe von hsl(0 100% 50%)
(äquivalent zu rot
). Obwohl Sie die folgenden Funktionen wahrscheinlich niemals schreiben würden, da sie die gleiche Farbe wie die Ursprungsfarbe ausgeben, demonstrieren sie, wie die Ursprungsfarbkanalwerte als Ausgabefarbkanalwerte verwendet werden:
color(from hsl(0 100% 50%) srgb r g b)
color(from hsl(0 100% 50%) xyz x y z)
Die Ausgabefarben dieser Funktionen sind color(srgb 1 0 0)
und color(xyz-d65 0.412426 0.212648 0.0193173)
, jeweils.
Die nächsten Funktionen verwenden absolute Werte für die Ausgabefarbkanalwerte und geben völlig unterschiedliche Farben aus, die nicht auf der Ursprungsfarbe basieren:
color(from hsl(0 100% 50%) srgb 0.749938 0 0.609579)
/* Computed output color: color(srgb 0.749938 0 0.609579) */
color(from hsl(0 100% 50%) xyz 0.75 0.6554 0.1)
/* Computed output color: color(xyz-d65 0.75 0.6554 0.1 */
Die folgenden Funktionen verwenden zwei der Ursprungsfarbkanalwerte für die Ausgabefarbkanalwerte (r
und b
, und x
und y
, jeweils), aber verwenden einen neuen Wert für den anderen Ausgabefarbkanalwert (g
und z
, jeweils), und erzeugen eine relative Farbe, basierend auf der Ursprungsfarbe in jedem Fall:
color(from hsl(0 100% 50%) srgb r 1 b)
/* Computed output color: color(srgb 1 1 0) */
color(from hsl(0 100% 50%) xyz x y 0.5)
/* Computed output color: color(xyz-d65 0.412426 0.212648 0.5) */
Hinweis:
Wie oben erwähnt, wird die Ursprungsfarbe im Hintergrund in das gleiche Modell wie die Ausgabefarbe konvertiert, wenn das Ausgabefarbmodell von dem der Ursprungsfarbe abweicht, um in einer kompatiblen Weise (d.h. mit den gleichen Kanälen) dargestellt werden zu können. Zum Beispiel wird die hsl()
-Farbe hsl(0 100% 50%)
im ersten Fall oben in color(srgb 1 0 0)
und im zweiten Fall in color(xyz 0.412426 0.212648 0.5)
konvertiert.
In den bisher in diesem Abschnitt gesehenen Beispielen wurden die Alphakanäle weder für die Ursprungs- noch für die Ausgabefarben explizit angegeben. Wenn der Alphakanal der Ausgabefarbe nicht angegeben wird, entspricht er standardmäßig dem Alphawert der Ursprungsfarbe. Wenn der Alphakanal der Ursprungsfarbe nicht angegeben wird (und es sich nicht um eine relative Farbe handelt), beträgt er standardmäßig 1
. Daher sind die Ursprungs- und Ausgabealphakanalwerte für die obigen Beispiele 1
.
Schauen wir uns einige Beispiele an, die die Ursprungs- und Ausgabefarb-Alphakanalwerte angeben. Das erste Beispiel spezifiziert den Ausgabefarb-Alphakanalwert als gleich dem Ursprungs-Alphakanalwert, während das zweite einen anderen Ausgabefarb-Alphakanalwert angibt, der nicht mit dem Ursprungs-Alphakanalwert zusammenhängt.
color(from hsl(0 100% 50% / 0.8) srgb r g b / alpha)
/* Computed output color: color(srgb 1 0 0 / 0.8) */
color(from hsl(0 100% 50% / 0.8) xyz x y z / 0.5)
/* Computed output color: color(xyz-d65 0.412426 0.212648 0.0193173 / 0.5) */
Die folgenden Beispiele verwenden calc()
-Funktionen, um neue Kanalwerte für die Ausgabefarben zu berechnen, die relativ zu den Ursprungsfarbkanalwerten sind:
color(from hsl(0 100% 50%) srgb calc(r - 0.4) calc(g + 0.1) calc(b + 0.6) / calc(alpha - 0.1))
/* Computed output color: color(srgb 0.6 0.1 0.6 / 0.9) */
color(from hsl(0 100% 50%) xyz calc(x - 0.3) calc(y + 0.3) calc(z + 0.3) / calc(alpha - 0.1))
/* Computed output color: color(xyz-d65 0.112426 0.512648 0.319317 / 0.9) */
Hinweis:
Da die Ursprungsfarbkanalwerte auf <number>
-Werte aufgelöst werden, müssen Sie Zahlen hinzufügen, wenn Sie sie in Berechnungen verwenden, selbst in Fällen, in denen ein Kanal normalerweise <percentage>
, <angle>
oder andere Werttypen akzeptieren würde. Das Hinzufügen eines <percentage>
zu einem <number>
funktioniert beispielsweise nicht.
Formale Syntax
Beispiele
Verwendung vordefinierter Farbräume mit color()
Das folgende Beispiel zeigt die Wirkung der Variation der Helligkeit, der a-Achse und der b-Achse Werte der color()
-Funktion.
HTML
<div data-color="red-a98-rgb"></div>
<div data-color="red-prophoto-rgb"></div>
<div data-color="green-srgb-linear"></div>
<div data-color="green-display-p3"></div>
<div data-color="blue-rec2020"></div>
<div data-color="blue-srgb"></div>
CSS
[data-color="red-a98-rgb"] {
background-color: color(a98-rgb 1 0 0);
}
[data-color="red-prophoto-rgb"] {
background-color: color(prophoto-rgb 1 0 0);
}
[data-color="green-srgb-linear"] {
background-color: color(srgb-linear 0 1 0);
}
[data-color="green-display-p3"] {
background-color: color(display-p3 0 1 0);
}
[data-color="blue-rec2020"] {
background-color: color(rec2020 0 0 1);
}
[data-color="blue-srgb"] {
background-color: color(srgb 0 0 1);
}
Ergebnis
Verwendung des xyz-Farbraums mit color()
Das folgende Beispiel zeigt, wie der xyz
-Farbraum verwendet wird, um eine Farbe anzugeben.
HTML
<div data-color="red"></div>
<div data-color="green"></div>
<div data-color="blue"></div>
CSS
[data-color="red"] {
background-color: color(xyz 45 20 0);
}
[data-color="green"] {
background-color: color(xyz-d50 0.3 80 0.3);
}
[data-color="blue"] {
background-color: color(xyz-d65 5 0 50);
}
Ergebnis
Verwendung von color-gamut-Medienabfragen mit color()
Dieses Beispiel zeigt, wie die color-gamut
-Medienabfrage verwendet wird, um die Unterstützung für einen bestimmten Farbraum zu erkennen und diesen Farbraum zur Angabe einer Farbe zu verwenden.
HTML
<div></div>
<div></div>
<div></div>
CSS
@media (color-gamut: p3) {
div {
background-color: color(display-p3 1 0 0);
}
}
@media (color-gamut: srgb) {
div:nth-child(2) {
background-color: color(srgb 1 0 0);
}
}
@media (color-gamut: rec2020) {
div:nth-child(3) {
background-color: color(rec2020 1 0 0);
}
}
Ergebnis
Verwendung relativer Farben mit color()
Dieses Beispiel stylt drei <div>
-Elemente mit verschiedenen Hintergrundfarben. Dem mittleren Element wird die unveränderte --base-color
zugewiesen, während die linken und rechten Elemente aufgehellte und abgedunkelte Varianten dieser --base-color
erhalten.
Diese Varianten werden unter Verwendung relativer Farben definiert — die --base-color
benutzerdefinierte Eigenschaft wird in eine color()
-Funktion übergeben, und die Ausgabefarben haben ihre g
- und b
-Kanäle geändert, um den gewünschten Effekt über calc()
-Funktionen zu erzielen. Die aufgehellte Farbe hat 15% zu diesen Kanälen hinzugefügt, und die abgedunkelte Farbe hat 15% von diesen Kanälen abgezogen.
CSS
:root {
--base-color: orange;
}
#one {
background-color: color(
from var(--base-color) display-p3 r calc(g + 0.15) calc(b + 0.15)
);
}
#two {
background-color: var(--base-color);
}
#three {
background-color: color(
from var(--base-color) display-p3 r calc(g - 0.15) calc(b - 0.15)
);
}
/* Use @supports to add in support old syntax that requires r g b values
to be specified as percentages (with units) in calculations.
This is required for Safari 16.4+ */
@supports (color: color(from red display-p3 r g calc(b + 30%))) {
#one {
background-color: color(
from var(--base-color) display-p3 r calc(g + 15%) calc(b + 15%)
);
}
#three {
background-color: color(
from var(--base-color) display-p3 r calc(g - 15%) calc(b - 15%)
);
}
}
Ergebnis
Die Ausgabe ist wie folgt:
Spezifikationen
Specification |
---|
CSS Color Module Level 5 # color-function |
CSS Color Module Level 5 # relative-color-function |
CSS Color Module Level 4 # color-function |
Browser-Kompatibilität
Siehe auch
- Der
<color>
Datentyp für eine Liste aller Farbkodierungen - Verwendung relativer Farben
- sRGB-Farbauswahl und -Konvertierungstool
- CSS-Farben Modul
color-gamut
Medieneigenschaft- Breites Gamut in CSS mit Display-p3