Was sind OKLCH-Farben?
(jakub.kr)- OKLCH ist ein modernes Farbmodell, das auf die menschliche visuelle Wahrnehmung abgestimmt ist und die Eigenschaft besitzt, dass Änderungen bei Helligkeit, Sättigung und Farbton zwischen Farben gleichmäßig wahrgenommen werden; es ist also ein wahrnehmungsuniformes Farbmodell
- Es besteht aus Lightness (Helligkeit), Chroma (Sättigung) und Hue (Farbton) und ermöglicht im Vergleich zu älteren Modellen die Erstellung konsistenter Farbpaletten
- Wenn bei gleicher Helligkeit und Sättigung nur der Hue-Wert geändert wird, lassen sich gleichmäßige Farbpaletten erzeugen, was für UI-Design vorteilhaft ist
- Gegenüber sRGB/HSL bietet es vorhersehbare Helligkeitsänderungen und gleichmäßige Verläufe, in manchen Fällen können jedoch unbeabsichtigte Farben entstehen
- Auf modernen Displays wie Display-P3 ist eine noch breitere Farbdarstellung möglich; unterstützt wird es in modernen Browsern über CSS Color 4, inklusive sRGB-Fallback, und es etabliert sich zunehmend als Webstandard
Einführung in das OKLCH-Farbmodell
- OKLCH ist ein modernes Farbmodell, das mit dem Ziel der wahrnehmungsbezogenen Uniformität (perceptually uniform) entwickelt wurde
- Das Modell arbeitet näher an der tatsächlichen menschlichen Farbwahrnehmung, wodurch der Umgang mit Farben in digitalem Design und der Frontend-Entwicklung deutlich einfacher wird
Grundkonzepte von Farbmodellen
- Ein Farbmodell ist ein System, mit dem Farben mathematisch definiert und dargestellt werden
- Häufig verwendete Modelle sind zum Beispiel: RGB, HSL, LCH, OKLCH, LAB, XYZ
- Jedes Modell bestimmt, wie einfach sich Farben darstellen und bearbeiten lassen
Beispiele für Farbangaben
- oklch(0.55 0.18 260)
- hsl(220 100% 50%)
- rgb(0, 128, 255)
- lch(60% 60 260)
- lab(50 -10 -50)
- color(xyz 0.18 0.19 0.6)
- #1E90FF
Gamut (Farbraumumfang)
- Gamut bezeichnet den gesamten Farbbereich, den ein Farbmodell darstellen kann
- Typische Gamuts sind: sRGB (Webstandard), Display-P3 (Unterstützung auf modernen Geräten)
- Ein Farbraum besitzt neben dem Gamut-Bereich auch weitere Eigenschaften wie White Point und Transfer Function
Aufbau von OKLCH
OKLCH und LCH bestehen beide aus drei Werten: Lightness, Chroma, Hue
OKLCH basiert auf dem Farbraum OKLab
- Lightness (Helligkeit): angegeben als 0–1 oder 0 %–100 %, garantiert eine gleichmäßige Veränderung der Helligkeit
- Chroma (Sättigung): die Intensität der Farbe, ähnlich der Saturation (Sättigung) in HSL
- Hue (Farbton): Darstellung des Farbtons als Winkel von 0 bis 360 Grad
Vorteile und Einsatz von OKLCH
-
Konsistente Helligkeit
- Wenn in OKLCH Farben mit gleicher Helligkeit und gleichem Chroma, aber unterschiedlichem Hue definiert werden, wirken alle Farben ähnlich hell
- Bei herkömmlichem sRGB oder HSL können Helligkeit und Sättigung je nach Farbe inkonsistent erscheinen
- Deshalb eignet sich OKLCH besonders gut für die Erstellung wahrnehmungsuniformer Farbpaletten
-
Vorhersehbare Helligkeitsstufen
- In OKLCH lassen sich durch Änderung der Helligkeit verschiedene Farbstufen erzeugen, ohne dass sich Hue (Farbton) oder Chroma (Sättigung) verändern
- Bei HSL und ähnlichen Modellen tritt beim Ändern der Helligkeit häufig ein Drift des Farbtons auf
- Mit OKLCH lassen sich daher allein über die Helligkeitsanpassung konsistente Helligkeitsabstufungen erzeugen
-
Umgang mit Verläufen (Gradients)
- In sRGB werden Rot-, Grün- und Blauwerte interpoliert, wodurch Zwischenstufen matt wirken oder starke Helligkeitssprünge entstehen können
- OKLCH interpoliert entlang der Achsen Lightness, Chroma und Hue, wodurch natürlichere Verläufe möglich sind
- Da der Hue-Wert eine kreisförmige Struktur hat, können dabei jedoch unerwartete Farbverschiebungen auftreten
- Um das zu vermeiden, kann mit linearer Interpolation in OKLab ein besser vorhersagbares Ergebnis erzielt werden
Unterstützung von Farbräumen
- sRGB deckt einen Teil des breiten Farbraums moderner Displays nicht ab
- Mit OKLCH lassen sich auf Geräten mit breiten Farbräumen wie Display-P3 lebendigere Farben darstellen
- Auf Geräten, die nur sRGB unterstützen, werden die Farben auf möglichst ähnliche Farben abgebildet
Maximaler Chroma-Wert
- Mit OKLCH lassen sich mathematisch auch Farben definieren, die außerhalb des tatsächlich darstellbaren Bereichs eines Bildschirms liegen
- Ein zu großer Chroma-Wert wie etwa
oklch(0.7 0.4 40)kann zum Beispiel nicht real angezeigt werden und wird daher auf eine nahe liegende Farbe geclippt - Es ist wichtig, das Konzept des maximalen Chroma-Werts zu verstehen und je nach Farbton, Helligkeit und gewähltem Farbraum (sRGB, Display-P3) passende Werte zu setzen
Browser-Unterstützung und Fallback
- OKLCH-Farben wurden mit dem CSS Color Module Level 4 eingeführt und werden von den meisten modernen Browsern unterstützt
- In älteren Browsern werden sie eventuell nicht unterstützt; mit der CSS-Direktive @supports lassen sich Fallback-Werte definieren
@layer base { :root { /* sRGB hex */ --color-gray-100: #fcfcfc; --color-gray-200: #fafafa; --color-gray-300: #f4f4f4; @supports (color: oklch(0 0 0)) { /* OKLCH */ --color-gray-100: oklch(0.991 0 0); --color-gray-200: oklch(0.982 0 0); --color-gray-300: oklch(0.955 0 0); } } } - In unterstützten Browsern wird OKLCH verwendet, in nicht unterstützten Browsern sRGB-Farbe (hex)
Das Tool oklch.fyi
- oklch.fyi ist ein Web-Tool, das Funktionen rund um OKLCH wie das Erzeugen von OKLCH-Farbpaletten oder die Umwandlung in CSS-Variablen bereitstellt
- Es erleichtert den Einsatz von OKLCH-Farben in Design-Systemen, Themes und ähnlichen Projekten
1 Kommentare
Hacker-News-Kommentare
Ich bin skeptisch, was die Funktion „Better Gradients“ angeht. OKLCH ist ein Polarkoordinatenraum, und der Hue-Wert fungiert darin als Winkel. Wenn man Farben zwischen zwei verschiedenen Punkten interpoliert, bewegt man sich daher entlang des Kreisrandes. Verwendet man zum Beispiel den Code
linear-gradient(in oklch, #f0f, #0f0), gerät der Verlauf von Grün zu Violett deutlich außerhalb des darstellbaren Farbbereichs. Dreht man den Kreis in die andere Richtung, läuft man wie beilinear-gradient(in oklch longer hue, #f0f, #0f0)über Cyan oder Aqua. Solche Pfade zeigen, wie unpraktisch ein wahrnehmungsbasierter Farbraum sein kann, wenn er mit den Grenzen von sRGB oder des für Menschen wahrnehmbaren Farbbereichs, also dem Gamut, umgehen muss. Tatsächlich reichen schon minimale Wertänderungen, damit Farben aus dem Bereich herausfallen. Es gibt zwar verschiedene Algorithmen, um das zu lösen, aber dabei leidet die perzeptuelle Gleichmäßigkeit. So wird etwa das Rot im Verlauf auffallend dunkel. Wenn man bessere Gradients will und perzeptuelle Gleichmäßigkeit wichtig ist, sollte eigentlich Oklab-Interpolation der Standard sein. Oklab interpoliert auf einem geraden Pfad quer durch den Kreis und geht bei Bedarf auch durch Grau (linear-gradient(in oklab, #f0f, #0f0)). Damit verschwindet auch das oft sichtbare Abdunkeln bei sRGB-Interpolation, und es entsteht ein natürlicher Gradient von Magenta zu Lime. Übrigens hat Tailwind v4 in der Beta erst Oklch statt sRGB verwendet, sich im finalen Release aber für Oklab als sichereren Default entschiedenIch halte die Art, wie Browser Farben in sRGB interpolieren, eigentlich für einen Bug. sRGB ist eine logarithmisch skalierte Kodierung, daher sollte man laut Spezifikation Farbinterpolation nicht direkt in sRGB durchführen, sondern erst in lineares RGB umwandeln und dann interpolieren
Der Artikel wurde inzwischen überarbeitet, also kann man meinen Kommentar ignorieren. Ich stimme aber weiterhin zu, dass Oklab-Interpolation der Default sein sollte. Im Artikel steht zu „besseren Gradients“ auch, dass der Hue-Wert in OKLCH kreisförmig ist und daher unerwartete Pfade entstehen können. Um solche Probleme zu vermeiden, verwenden viele Tools OKLAB, und Oklab liefert mit seinem geraden Pfad konsistente Ergebnisse
Eigentlich erfüllt CIE LAB dieselbe Rolle und existiert bereits als Standard (CIE-LAB-Wikipedia)
W3C-Prüfunterlagen
Danke für die sehr hilfreiche Erklärung. Ich bin der Autor dieses Artikels. Ich werde den Text überarbeiten, damit er klarer wird
Ein Gradient aus zwei Farben auf gegenüberliegenden Seiten des Spektrums ist ein ziemlich extremer Fall. Es gibt keine eindeutige richtige Darstellung, und ich glaube auch nicht, dass man in echtem Design oft solche Gradients braucht. Normalerweise wählt man bei einem Design ohnehin die Zwischenfarben direkt aus
Im Zusammenhang mit OKLCH hat mir oklch.com geholfen, ein Gefühl dafür zu bekommen. Man sollte aber beachten, dass sich der Hue-Wert von dem in HSL unterscheidet und dass das Chroma-Maximum je nach Hue und Lightness variiert. Das ist kein Bug, sondern spiegelt die Eigenschaften des menschlichen Sehens und von Displays wider. Anders als bei OKLCH ist das Maximum bei HSL immer konstant, dafür ist die Farbbedeutung nicht konsistent. Gut an CSS-OKLCH ist, dass man es in Formeln manipulieren kann. Zum Beispiel so:
oklch(from var(--accent) calc(l + .1) c h). Um solche Formeln in der Praxis gut zu nutzen, braucht man aber Farbtheorie oder man muss testen. Ich dachte etwa, für Schatten müsse man nur die Lightness ändern, in der Praxis muss sich aber auch der Hue-Wert verschieben. Das bedeutet nicht, dass OKLCH-Gradients immer die beste Wahl sind. Bei ähnlichen Hue-Werten wirken Farben zwar gleichmäßiger, aber wenn man sich auch dafür interessiert, wie sich Licht physikalisch beim Mischen verändert, braucht man den XYZ-Farbraum. In dem Zusammenhang ist die MDN-Dokumentation zu color-mix nützlich. Übrigens kommt „ok“ tatsächlich einfach vom Wort OK. Der Name entstand daraus, dass das ältere LCH semantisch Probleme hatte, also eben nicht OK warEs wurde gesagt, dass Formeln in CSS-OKLCH praktisch sind, aber relative Farbmanipulationen lassen sich eigentlich in allen CSS-Farbräumen verwenden. Zum Beispiel:
background-color: rgb(from var(--base-color) calc(r - 76.5) g calc(b + 76.5));Dank OKLCH und relativen Farben konnte ich die Zahl der im Stylesheet hartcodierten Farben stark reduzieren
Beispiel für CSS-Variablen
Einige Kritikpunkte wurden schon genannt, aber als Einführung in OKLCH und seine Verwendung in CSS finde ich den Artikel ziemlich gut. Eine ergänzende Frage betrifft den Trend, in neueren Blogposts kein Datum mehr anzugeben. Gerade die Aussage „OKLCH ist ein neues Farbmodell“ wird meiner Meinung nach schnell veralten. Auf der Hauptseite steht nur „August 2025“, wodurch es fast so wirkt, als würde das Datum absichtlich weggelassen
Zugehörige Website
Ich kann es nicht exakt begründen, aber ich halte undatierte Texte für ein ernstes Problem. Ob das gerade wirklich ein Trend ist, weiß ich nicht, aber ohne Datum kann man alte Beiträge leicht für aktuell halten. Manchmal schätze ich das Jahr eines Artikels anhand von Zeitstempeln in den Kommentaren, aber viele Blogs haben gar keine Kommentare mehr, und dann verliere ich die Lust, die Seite erneut zu besuchen. (Auf der Startseite des OP steht, er sei „nicht von Details besessen“, was ironisch wirkt, wenn man sich nur auf Designästhetik konzentriert und die Nutzbarkeit vergisst)
Wenn ein Artikel kein Datum hat, schaue ich beim Abruf des HTML-Dokuments per HTTP auf den
Last-Modified-Header. Aber oft kümmern sich Autoren auch darum nicht. Sie scheinen nicht zu verstehen, dass schon das Wort Blog ursprünglich von [web]-log kommt und Zeitstempel ein Kernelement sind. Zur Einordnung:Last-Modifiedgibt den Zeitpunkt der letzten Änderung an dieser Ressource, also des HTML, an. Wenn der Server kein korrektes Caching konfiguriert und das Backend die Seite bei jedem Request neu rendert, wird das Datum ständig aktualisiertBeispiel für dieses Problem
Das dient vor allem SEO-Zwecken, damit alte Inhalte in Suchmaschinen nicht schlechter eingestuft werden. Ein wirklich lästiger Trick
Wegen Google und SEO
Es hieß, OKLCH liefere im Vergleich zu HSL konsistentere Blautöne, aber tatsächlich verschiebt sich die Helligkeitsänderung in OKLCH stark in Richtung Grün. Eine konstante perzeptuelle Intensität ist sicher ein Vorteil, aber ich finde den behaupteten Effekt hier übertrieben
Wenn man sich das Hue-Diagramm dieser Farbe ansieht, versteht man den Grund
OKLCH-Farbdiagramm
Hebt man die Helligkeit an, überschreitet man das Limit des Hue-Bands dieser Farbe, und wegen der Grenze für auf Displays darstellbares helles Blau verschiebt sich die Farbe Richtung Cyan. OKLCH hält beim Anpassen der Helligkeit in Gradients nicht den Hue-Wert konstant, sondern die Sättigung. Ob dieser Effekt gut aussieht, ist eine Frage des ästhetischen Geschmacks, aber nachdem im Web lange Farben mit konstantem Hue und entsättigteren Abstufungen üblich waren, ist es erfrischend, nun wählen zu können, welchen Kompromiss man bevorzugt
Zugehörige Hacker-News-Diskussion
In der Wissenschaft wurden kürzlich sogar noch tiefere blaue LEDs erfunden; vielleicht werden in 10 bis 20 Jahren Technologien Display P3 ablösen, mit denen sich genauere blaue Gradients ohne diesen Cyan-Shift darstellen lassen. Bis dahin gilt im Design wohl einfach: Was gut aussieht, ist richtig.
Ich frage mich außerdem, ob man bei zukünftigen Farbraum-Designs nicht zwingend zwischen konstantem Hue und konstanter Sättigung binär wählen müsste, sondern bis an die Display-Grenzen konstante Sättigung beibehalten und am Grenzpunkt allmählich zu konstantem Hue übergehen könnte. Wegen der Beschränkungen von Farbprofilen (IDCv4) ist das aber sehr schwierig. Als experimentelles DisplayCAL-Target wäre es dennoch spannend
Auf meinem Display sehe ich in dem Beispiel überhaupt keinen Grün-Shift. Vielleicht ist dein Bildschirm nicht richtig kalibriert?
Stimme zu. Die Farbe kippt komplett von Blau zu Cyan. Wenn OKLCH korrekt implementiert ist, würde ich es nie verwenden wollen. In der Hue-Berechnung scheint etwas grundlegend schiefzulaufen. HSL/HSV haben zwar Probleme mit perzeptueller Lightness, aber der Hue-Wert selbst bleibt immer konstant und muss nicht korrigiert werden
Ich kenne mich mit Farbwissenschaft nicht besonders gut aus und das ist vielleicht nur subjektiv, aber das rechte Ende der OKLCH-Farben wirkt auf mich im schlimmsten Fall blaugrün oder einfach hellblau. Dagegen sehen die beiden hellsten HSL-Farben für mich nicht mehr blau aus; die zweithellste eher hellviolett und die ganz rechte fast grau. In der Bildunterschrift hieß es, die dunkle Seite von HSL sei gräulich, aber tatsächlich wirken bei OKLCH und HSL beide ganz linken Farben blau. Wenn man mit dem macOS Digital Color Meter misst, haben das rechte OKLCH und das rechte HSL fast denselben Grünwert (226 bzw. 227, in sRGB 228 bzw. 227)
Ich empfehle zu diesem Thema einen besseren Artikel
OKLCH in CSS: Why quit RGB, HSL von Evil Martians
OKLCH-Konvertierungstool zum Ausprobieren
Frühere Hacker-News-Diskussion (vor 6 Monaten, 30 Kommentare)
OKLCH basiert auf OKLab, einem perzeptuell gleichmäßigen Farbraum, und ist ein Modell zur Steuerung von Lightness, Chroma und Hue. Das „OK“ im Namen stammt daher, dass der Erfinder sagte, es funktioniere „ganz okay“
Ich finde, bei Arbeit mit Farben sowie mit Text und Logos sollte man auch Kontrast und Lesbarkeit unbedingt berücksichtigen
APCA Contrast
Kontrastprüfung (WCAG 2)
Es gibt außerdem viele weitere Tools
In meinem Kopf wurde der Name OKLCH ganz natürlich als „Oklachroma“ gelesen
Es gibt einen ursprünglichen Blogpost, der den OKLab-Farbraum eingeführt hat; aus historischer Sicht ist er interessant
OKLab-Originalbeitrag
Ich frage mich, warum die Formel zur Umrechnung in den OKLCH-Farbraum nirgends dokumentiert ist. Wenn man googelt, findet man nur ein Gist[0] und zur Oklab-Farbe einen Wikipedia-Eintrag[1]
Beispiel für Umrechnungsformeln in einem Gist
Oklab auf Wikipedia
Der Kern der Umrechnung steckt in der Matrix zwischen Oklab und sRGB. Die Umrechnung zwischen OKLab und OKLCH selbst ist nur eine Koordinatentransformation und steht auch bei Wikipedia
OKLCH und OKLab sind derselbe Farbraum. Nur die Darstellung ist unterschiedlich: kartesische Koordinaten (OKLab) versus Polarkoordinaten (OKLCH)