oklab()
Baseline 2023
Newly 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 oklab()
Funktionsnotation drückt eine gegebene Farbe im Oklab-Farbraum aus, der versucht, die Wahrnehmung der Farbe durch das menschliche Auge zu imitieren.
Oklab ist ein perceptualer Farbraum und ist nützlich für:
- Transformieren eines Bildes in Graustufen, ohne dessen Helligkeit zu verändern.
- Modifizieren der Sättigung von Farben, wobei die Wahrnehmung von Farbton und Helligkeit durch den Benutzer erhalten bleibt.
- Erstellen von sanften und gleichmäßigen Farbverläufen (wenn sie manuell interpoliert werden, zum Beispiel in einem
<canvas>
-Element).
oklab()
arbeitet mit einem kartesischen Koordinatensystem im Oklab-Farbraum — a- und b-Achsen. Es kann ein breiteres Farbspektrum als RGB darstellen, einschließlich Wide-Gamut- und P3-Farben. Wenn Sie ein polares Farbsystem möchten, chroma und hue, verwenden Sie oklch()
.
Syntax
/* Absolute values */
oklab(40.1% 0.1143 0.045);
oklab(59.69% 0.1007 0.1191);
oklab(59.69% 0.1007 0.1191 / 0.5);
/* Relative values */
oklab(from green l a b / 0.5)
oklab(from #0000FF calc(l + 0.1) a b / calc(alpha * 0.9))
oklab(from hsl(180 100% 50%) calc(l - 0.1) a b)
Werte
Nachfolgend finden Sie Beschreibungen der zulässigen Werte sowohl für absolute als auch für relative Farben.
Absolute Wertsyntax
oklab(L a b[ / A])
Die Parameter sind wie folgt:
L
-
Eine
<number>
zwischen0
und1
, ein<percentage>
zwischen0%
und100%
, oder das Schlüsselwortnone
(entspricht in diesem Fall0%
). Dieser Wert gibt die wahrgenommene Helligkeit der Farbe an. Die Zahl0
entspricht0%
(schwarz) und die Zahl1
entspricht100%
(weiß). a
-
Eine
<number>
zwischen-0.4
und0.4
, ein<percentage>
zwischen-100%
und100%
, oder das Schlüsselwortnone
(entspricht in diesem Fall0%
). Dieser Wert gibt die Entfernung der Farbe entlang dera
-Achse im Oklab-Farbraum an, die definiert, wie grün (in Richtung-0.4
) oder rot (in Richtung+0.4
) die Farbe ist. Beachten Sie, dass diese Werte Vorzeichen haben (sowohl positive als auch negative Werte sind möglich) und theoretisch unbegrenzt sind, was bedeutet, dass Sie Werte außerhalb der±0.4
(±100%
) Grenzen festlegen können. In der Praxis können die Werte±0.5
nicht überschreiten. b
-
Eine
<number>
zwischen-0.4
und0.4
, ein<percentage>
zwischen-100%
und100%
, oder das Schlüsselwortnone
(entspricht in diesem Fall0%
). Dieser Wert gibt die Entfernung der Farbe entlang derb
-Achse im Oklab-Farbraum an, die definiert, wie blau (in Richtung-0.4
) oder gelb (in Richtung+0.4
) die Farbe ist. Beachten Sie, dass diese Werte Vorzeichen haben (sowohl positive als auch negative Werte sind möglich) und theoretisch unbegrenzt sind, was bedeutet, dass Sie Werte außerhalb der±0.4
(±100%
) Grenzen festlegen können. In der Praxis können die Werte±0.5
nicht überschreiten. A
Optional-
Ein
<alpha-value>
repräsentiert den Alphakanalwert der Farbe, wobei die Zahl0
0%
(vollständig transparent) entspricht 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 wird, beträgt er standardmäßig 100%. Wenn er enthalten ist, wird der Wert durch einen Schrägstrich (/
) vorangestellt.
Hinweis:
Siehe Fehlende Farbkomponenten für weitere Informationen über die Wirkung von none
.
Relative Wertsyntax
oklab(from <color> L a b[ / A])
Die Parameter sind wie folgt:
from <color>
-
Das Schlüsselwort
from
wird immer beim Definieren einer relativen Farbe gefolgt von einem<color>
-Wert verwendet, der die Ursprungsfarbe darstellt. Dies ist die ursprüngliche Farbe, auf der die relative Farbe basiert. Die Ursprungsfarbe kann jede gültige<color>
-Syntax sein, einschließlich einer weiteren relativen Farbe. L
-
Eine
<number>
zwischen0
und1
, ein<percentage>
zwischen0%
und100%
, oder das Schlüsselwortnone
(entspricht in diesem Fall0%
). Dieser Wert repräsentiert die Helligkeit der Ausgabefarbe. Die Zahl0
entspricht0%
(schwarz) und die Zahl1
entspricht100%
(weiß). a
-
Eine
<number>
zwischen-0.4
und0.4
, ein<percentage>
zwischen-100%
und100%
, oder das Schlüsselwortnone
(entspricht in diesem Fall0%
). Dieser Wert repräsentiert die Entfernung der Ausgabefarbe entlang dera
-Achse im Oklab-Farbraum, die definiert, wie grün (in Richtung-0.4
) oder rot (in Richtung+0.4
) die Farbe ist. Beachten Sie, dass diese Werte Vorzeichen haben (sowohl positive als auch negative Werte sind möglich) und theoretisch unbegrenzt sind, was bedeutet, dass Sie Werte außerhalb der±0.4
(±100%
) Grenzen festlegen können. In der Praxis können die Werte±0.5
nicht überschreiten. b
-
Eine
<number>
zwischen-0.4
und0.4
, ein<percentage>
zwischen-100%
und100%
, oder das Schlüsselwortnone
(entspricht in diesem Fall0%
). Dieser Wert repräsentiert die Entfernung der Ausgabefarbe entlang derb
-Achse im Oklab-Farbraum, die definiert, wie blau (in Richtung-0.4
) oder gelb (in Richtung+0.4
) die Farbe ist. Beachten Sie, dass diese Werte Vorzeichen haben (sowohl positive als auch negative Werte sind möglich) und theoretisch unbegrenzt sind, was bedeutet, dass Sie Werte außerhalb der±0.4
(±100%
) Grenzen festlegen können. In der Praxis können die Werte±0.5
nicht überschreiten. A
Optional-
Ein
<alpha-value>
repräsentiert den Alphakanalwert der Ausgabefarbe, wobei die Zahl0
0%
(vollständig transparent) entspricht 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 wird, ist er standardmäßig der Alphakanalwert der Ursprungsfarbe. Wenn er enthalten ist, wird der Wert durch einen Schrägstrich (/
) vorangestellt.
Definieren relativer Farb-Ausgabekanal-Komponenten
Wenn Sie relative Farbsyntax innerhalb einer oklab()
-Funktion verwenden, konvertiert der Browser die Ursprungsfarbe in eine äquivalente Oklab-Farbe (falls sie nicht bereits so angegeben ist). Die Farbe wird als drei verschiedene Farbkanalwerte definiert — l
(Helligkeit), a
(grün/rot-Achse) und b
(blau/gelb-Achse) — sowie einem Alphakanalwert (alpha
). Diese Kanalwerte stehen innerhalb der Funktion zur Verfügung, um bei der Definition der Ausgabefarbkanalwerte verwendet zu werden:
- Der
l
-Kanalwert wird auf einen<number>
zwischen0
und1
aufgelöst, inklusive. - Die
a
- undb
-Kanäle werden jeweils auf einen<number>
zwischen-0.4
und0.4
aufgelöst, inklusive. - Der
alpha
-Kanal wird auf einen<number>
zwischen0
und1
aufgelöst, inklusive.
Beim Definieren einer relativen Farbe können die verschiedenen Kanäle der Ausgabefarbe auf mehrere verschiedene Arten ausgedrückt werden. Im Folgenden werden wir einige Beispiele untersuchen, um diese zu veranschaulichen.
In den ersten beiden Beispielen unten verwenden wir relative Farbsyntax. Das erste gibt jedoch dieselbe Farbe wie die Ursprungsfarbe aus, und das zweite gibt eine Farbe aus, die überhaupt nicht auf der Ursprungsfarbe basiert. Sie erstellen eigentlich keine relativen Farben! Sie würden diese wahrscheinlich nie in einem echten Code verwenden und stattdessen nur einen absoluten Farbwert verwenden. Wir haben diese Beispiele als Ausgangspunkt zum Lernen über die relative oklab()
-Syntax aufgenommen.
Beginnen wir mit einer Ursprungsfarbe von hsl(0 100% 50%)
(entspricht red
). Die folgende Funktion gibt dieselbe Farbe wie die Ursprungsfarbe aus — sie verwendet die l
-, a
- und b
-Kanalwerte (0.627966
, 0.22488
und 0.125859
) der Ursprungsfarbe als Ausgabekanalwerte:
oklab(from hsl(0 100% 50%) l a b)
Diese Funktion gibt die Farbe oklab(0.627966 0.22488 0.125859)
aus.
Die nächste Funktion verwendet absolute Werte für die Ausgabefarbkanalwerte, und gibt damit eine völlig andere Farbe aus, die nicht auf der Ursprungsfarbe basiert:
oklab(from hsl(0 100% 50%) 42.1% 0.165 -0.101)
Im obigen Fall ist die Ausgabefarbe oklab(0.421 0.165 -0.101)
.
Die folgende Funktion erstellt eine relative Farbe basierend auf der Ursprungsfarbe:
oklab(from hsl(0 100% 50%) l -0.3 b)
Dieses Beispiel:
- Konvertiert die
hsl()
-Ursprungsfarbe in eine äquivalenteoklab()
-Farbe —oklab(0.627966 0.22488 0.125859)
. - Setzt die
L
- undb
-Kanalwerte der Ausgabefarbe auf dieL
- undb
-Kanalwerte desoklab()
-Äquivalents der Ursprungsfarbe — diese Werte sind0.627966
und0.125859
. - Setzt den
a
-Kanalwert der Ausgabefarbe auf einen neuen Wert, der nicht auf der Ursprungsfarbe basiert:-0.3
.
Die endgültige Ausgabefarbe ist oklab(0.627966 -0.3 0.125859)
.
Hinweis: Wie oben erwähnt, wird die Ursprungsfarbe, wenn das Ausgabefarbmodell ein anderes ist als das der Ursprungsfarbe, im Hintergrund in dasselbe Modell wie die Ausgabefarbe konvertiert, um so dargestellt zu werden, dass sie kompatibel ist (d.h. unter Verwendung derselben Kanäle).
In den Beispielen, die wir bisher in diesem Abschnitt gesehen haben, wurden die Alphakanäle weder für die Ursprungsfarben noch für die Ausgabefarben explizit angegeben. Wenn der Alphakanal der Ausgabefarbe nicht angegeben wird, ist er standardmäßig derselbe Wert wie der Alphakanal 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 beträgt der Alphakanalwert sowohl der Ursprungs- als auch der Ausgabefarbe 1
für die obigen Beispiele.
Schauen wir uns einige Beispiele an, die die Ursprungs- und Ausgabefarb-Alphakanalwerte angeben. Das erste Beispiel gibt den Ausgabefarb-Alphakanalwert an, der dem der Ursprungsfarbe entspricht, während das zweite Beispiel einen anderen Ausgabefarb-Alphakanalwert angibt, der nicht mit dem der Ursprungsfarbe zusammenhängt.
oklab(from hsl(0 100% 50% / 0.8) l a b / alpha)
/* Computed output color: oklab(0.627966 0.22488 0.125859 / 0.8) */
oklab(from hsl(0 100% 50% / 0.8) l a b / 0.5)
/* Computed output color: oklab(0.627966 0.22488 0.125859 / 0.5) */
Im folgenden Beispiel wird die hsl()
-Ursprungsfarbe wieder in das oklab()
-Äquivalent konvertiert — oklab(0.627966 0.22488 0.125859)
. calc()
-Berechnungen werden auf die L
-, a
-, b
- und A
-Werte angewendet, was zu einer Ausgabefarbe von oklab(0.827966 0.14488 -0.0741406 / 0.9)
führt:
oklab(from hsl(0 100% 50%) calc(l + 0.2) calc(a - 0.08) calc(b - 0.2) / calc(alpha - 0.1))
Hinweis:
Da die Ursprungsfarbkanalwerte auf <number>
-Werte aufgelöst werden, müssen Sie Zahlen zu ihnen hinzufügen, wenn Sie sie in Berechnungen verwenden, selbst in Fällen, in denen ein Kanal normalerweise <percentage>
, <angle>
oder andere Wertetypen akzeptieren würde. Das Hinzufügen eines <percentage>
zu einem <number>
funktioniert beispielsweise nicht.
Formale Syntax
Beispiele
Einstellen der Helligkeit
Das folgende Beispiel zeigt die Auswirkung des Variierens der Helligkeit, der a-Achse und der b-Achse-Werte der oklab()
-Funktion.
HTML
<div data-color="red-dark"></div>
<div data-color="red"></div>
<div data-color="red-light"></div>
<div data-color="green-dark"></div>
<div data-color="green"></div>
<div data-color="green-light"></div>
<div data-color="blue-dark"></div>
<div data-color="blue"></div>
<div data-color="blue-light"></div>
CSS
[data-color="red-dark"] {
background-color: oklab(0.05 0.4 0.4);
}
[data-color="red"] {
background-color: oklab(0.5 0.4 0.4);
}
[data-color="red-light"] {
background-color: oklab(0.95 0.4 0.4);
}
[data-color="green-dark"] {
background-color: oklab(5% -100% 0.4);
}
[data-color="green"] {
background-color: oklab(50% -100% 0.4);
}
[data-color="green-light"] {
background-color: oklab(95% -100% 0.4);
}
[data-color="blue-dark"] {
background-color: oklab(0.05 -0.3 -0.4);
}
[data-color="blue"] {
background-color: oklab(0.5 -0.3 -0.4);
}
[data-color="blue-light"] {
background-color: oklab(0.95 -0.3 -0.4);
}
Ergebnis
Einstellen der Deckkraft
Das folgende Beispiel zeigt die Auswirkung des Variierens des A
(Alpha)-Wertes der oklab()
-Funktion. Die Elemente red
und red-alpha
überlagern das Element #background-div
, um den Effekt der Deckkraft zu demonstrieren. Das Element red-alpha
mit einer Deckkraft von 0.4
erscheint transparenter als das Element red
.
HTML
<div id="background-div">
<div data-color="red"></div>
<div data-color="red-alpha"></div>
</div>
CSS
[data-color="red"] {
background-color: oklab(0.628 0.225 0.126);
}
[data-color="red-alpha"] {
background-color: oklab(0.628 0.225 0.126 / 0.4);
}
Ergebnis
Einstellen der Farbachsen
Dieses Beispiel zeigt die Auswirkungen der Einstellung der a
- und b
-Werte der oklab()
-Funktion zu den Enden und Mittelpunkten der a-Achse und b-Achse. Die a-Achse reicht von grün (-0.4
) bis rot (0.4
) und die b-Achse reicht von gelb (-0.4
) bis blau (0.4
).
HTML
<div data-color="red-yellow"></div>
<div data-color="red-zero"></div>
<div data-color="red-blue"></div>
<div data-color="zero-yellow"></div>
<div data-color="zero-zero"></div>
<div data-color="zero-blue"></div>
<div data-color="green-yellow"></div>
<div data-color="green-zero"></div>
<div data-color="green-blue"></div>
CSS
Unter Verwendung der CSS-Eigenschaft background-color
variieren wir die a
- und b
-Werte der oklab()
-Farbfunktions entlang der a-Achse und b-Achse und zeigen die Auswirkungen von maximalen, mittleren und minimalen Werten in jedem Fall.
/* a-axis max, variable b-axis */
[data-color="red-yellow"] {
background-color: oklab(0.5 0.4 0.4);
}
[data-color="red-zero"] {
background-color: oklab(0.5 0.4 0);
}
[data-color="red-blue"] {
background-color: oklab(0.5 0.4 -0.4);
}
/* a-axis center, variable b-axis */
[data-color="zero-yellow"] {
background-color: oklab(0.5 0 0.4);
}
[data-color="zero-zero"] {
background-color: oklab(0.5 0 0);
}
[data-color="zero-blue"] {
background-color: oklab(0.5 0 -0.4);
}
/* a-axis min, variable b-axis */
[data-color="green-yellow"] {
background-color: oklab(0.5 -0.4 0.4);
}
[data-color="green-zero"] {
background-color: oklab(0.5 -0.4 0);
}
[data-color="green-blue"] {
background-color: oklab(0.5 -0.4 -0.4);
}
Ergebnis
Die linke Spalte steht am gelben Ende (-0.4
) der b-Achse und die rechte Spalte am blauen Ende (0.4
). Die obere Reihe zeigt Farben am roten Ende der a-Achse (-0.4
) und die untere Reihe steht am grünen Ende (0.4
). Die mittlere Spalte und Reihe befinden sich an den Mittelpunkten jeder Achse, wobei die mittlere Zelle grau ist; sie enthält kein Rot, Grün, Gelb oder Blau, mit einem 0
Wert für beide Achsen.
Lineare Farbübergänge entlang der a- und b-Achse
Dieses Beispiel enthält lineare Farbübergänge, um die Entwicklung der Werte der oklab()
-Funktion entlang der a-Achse (von rot nach grün) und entlang der b-Achse (von gelb nach blau) zu demonstrieren. In jedem Farbverlauf bleibt eine Achse statisch, während die andere Achse von niedrigen zu hohen Werten übergeht.
CSS
/* a-axis gradients */
[data-color="red-to-green-yellow"] {
background-image: linear-gradient(to right, oklab(50% 0.4 0.4), oklab(50% -0.4 0.4));
}
[data-color="red-to-green-zero"] {
background-image: linear-gradient(to right, oklab(50% 0.4 0), oklab(50% -0.4 0));
}
[data-color="red-to-green-blue"] {
background-image: linear-gradient(to right, oklab(50% 0.4 -0.4), oklab(50% -0.4 -0.4));
}
/* b-axis gradients */
[data-color="yellow-to-blue-red"] {
background-image: linear-gradient(to right, oklab(50% 0.4 0.4), oklab(50% 0.4 -0.4));
}
[data-color="yellow-to-blue-zero"] {
background-image: linear-gradient(to right, oklab(50% 0 0.4), oklab(50% 0 -0.4));
}
[data-color="yellow-to-blue-green"] {
background-image: linear-gradient(to right, oklab(50% -0.4 0.4),oklab(50% -0.4 -0.4));
}
Ergebnis
Verwendung von relativen Farben mit oklab()
Dieses Beispiel gestaltet drei <div>
Elemente mit unterschiedlichen Hintergrundfarben. Dem mittleren Element wird die unveränderte --base-color
gegeben, während den linken und rechten Elementen aufgehellte bzw. verdunkelte Varianten dieser --base-color
zugewiesen werden.
Diese Varianten werden unter Verwendung relativer Farben definiert — die --base-color
benutzerdefinierte Eigenschaft wird in eine oklab()
-Funktion übergeben, und die Ausgabefarben haben ihren Helligkeitskanal modifiziert, um den gewünschten Effekt über eine calc()
-Funktion zu erreichen. Der aufgehellten Farbe wird 0.15
(15%) zum Helligkeitskanal hinzugefügt, und der abgedunkelten Farbe wird 0.15
(15%) vom Helligkeitskanal abgezogen.
CSS
:root {
--base-color: orange;
}
#one {
background-color: oklab(from var(--base-color) calc(l + 0.15) a b);
}
#two {
background-color: var(--base-color);
}
#three {
background-color: oklab(from var(--base-color) calc(l - 0.15) a b);
}
Ergebnis
Die Ausgabe ist wie folgt:
Spezifikationen
Specification |
---|
CSS Color Module Level 5 # relative-Oklab |
CSS Color Module Level 4 # ok-lab |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
- Der
<color>
Datentyp für eine Liste aller Farbnomenklaturen lab()
undoklch()
Farb-Funktionen- Verwendung von relativen Farben
- CSS Farben Modul
- Ein perceptualer Farbraum für Bildverarbeitung auf bottosson.github.io (2023)
- OKLAB Farbkreis auf observablehq.com