CSS und Web

CSS-Farbverlauf in OKLCH: weichere Übergänge

Die meisten stumpfen Verläufe mit grauer Mitte sind kein Farbproblem, sondern ein Rechenproblem. Zwei Wörter, in oklch, ändern, wo der Browser rechnet.

GradientlyVerifiziertes Gradiently-Konto··5 Min. Lesezeit
Cover: Marsh of Ink · GR·1EQ7·TN

Die Kurzfassung

  • CSS-Farbverläufe mischen standardmäßig in sRGB, wenn alle ihre Farben als Hex, rgb() oder hsl() geschrieben sind, was die Mitte einer Mischung oft stumpf oder grau macht.
  • Fügst du einem Farbverlauf in oklch oder in oklab hinzu, mischt der Browser in einem wahrnehmungsbasierten Farbraum, der die Helligkeit gleichmäßig und die Farben sauber hält.
  • in oklab nimmt den geradesten Weg zwischen zwei Farben, während in oklch um den Farbtonkreis läuft und die Sättigung hoch hält.
  • Farbton-Schlüsselwörter wie shorter hue, longer hue, increasing hue und decreasing hue bestimmen, in welche Richtung ein oklch-Verlauf um den Farbkreis läuft.
  • Browser ignorieren Deklarationen, die sie nicht verstehen, daher ist es ein sicherer Fallback, zuerst einen sRGB-Verlauf und danach die oklch-Version zu schreiben.
Auf dieser Seite

CSS-Gradient-OKLCH-Interpolation heißt, den Browser zu bitten, die Zwischenfarben eines Farbverlaufs im OKLCH-Farbraum statt in sRGB zu berechnen. Du fügst zwei Wörter hinter der Richtung hinzu: linear-gradient(90deg in oklch, #2563eb, #facc15). Das Ergebnis ist eine Mischung, deren Helligkeit sich gleichmäßig ändert und deren Mitte lebhaft bleibt, statt in das graue, trübe Band abzusacken, für das reine sRGB-Mischungen bekannt sind.

Blau zu Gelb auf drei Arten. sRGB läuft durch Grau; oklab bleibt sauber und neutral; oklch behält volle Farbe, indem es durch Türkis und Grün läuft.

Warum sRGB-Farbverläufe grau werden

sRGB wurde entworfen, um Bildschirmfarben effizient zu kodieren, nicht um abzubilden, wie Menschen sehen. Zwei sRGB-Farben zu mischen heißt, ihre Rot-, Grün- und Blauzahlen zu mitteln, und die Mitte zwischen einem Blau und einem Gelb ist eine Menge mittlerer Zahlen, die grau aussieht. Auch ihre Helligkeit ändert sich ungleichmäßig, sodass manche Mischungen in der Mitte heller oder dunkler ausbeulen. Die Designseite dieses Problems steht in trübe Farbverläufe.

Oklab und seine zylindrische Form OKLCH wurden so entworfen, dass gleiche Schritte in ihren Zahlen für das Auge etwa gleichen Schritten entsprechen. Das Mischen darin lässt die wahrgenommene Helligkeit gleichmäßig wandern, weshalb so gemachte Verläufe bei denselben Endpunkten weicher und leuchtender aussehen.

Die Syntax: in oklch und in oklab

Die Interpolationsmethode steht im ersten Argument, vor oder nach der Richtung. Sie funktioniert in linear-gradient(), radial-gradient(), conic-gradient() und ihren sich wiederholenden Formen und auch in color-mix(). Deine Farbstopps können in Hex bleiben; nur die Mathematik ändert sich.

css
/* direction first or interpolation first: both are valid */
background: linear-gradient(135deg in oklch, #7c3aed, #f97316);
background: linear-gradient(in oklch 135deg, #7c3aed, #f97316);

/* works in the other gradient functions too */
background: radial-gradient(in oklab circle at 30% 30%, #22d3ee, #1e1b4b);
background: conic-gradient(in oklch from 90deg, #ef4444, #3b82f6, #ef4444);
Nur die Mischung ändert sich; die Farbstopps bleiben wie geschrieben.
FarbraumSo wird gemischtNutze ihn für
srgbMittelt Rot, Grün und BlauAlte Designs exakt nachbilden
srgb-linearMittelt physikalisches LichtEffekte durch Lichtmischung; Mitten wirken hell
oklabGerade Linie durch einen wahrnehmungsbasierten RaumDie meisten Mischungen und jedes Ausblenden zu Weiß, Schwarz oder Grau
oklchUm den Farbtonkreis bei gleichbleibender BuntheitLebhafte Mischungen über mehrere Farbtöne, Regenbogen, Sonnenuntergänge
hslUm den Farbtonkreis, nicht wahrnehmungsbasiertFarbkreise; die Helligkeit ist ungleichmäßig
Die Räume, die du am ehesten nutzt. Die MDN-Seite zu color-interpolation-method listet alle auf.

oklab oder oklch: was du wählst

Beide sind wahrnehmungsbasiert; sie unterscheiden sich im Weg, den sie nehmen. Oklab zieht eine gerade Linie zwischen den zwei Farben, sodass die Mitte etwas Sättigung verlieren kann, wenn die Enden auf dem Farbkreis weit auseinanderliegen, aber es wandert nie durch einen Farbton, den du nicht verlangt hast. OKLCH behält die Buntheit (Chroma), die Intensität der Farbe, und läuft um den Farbtonkreis, sodass die Mitte gesättigt bleibt, aber durch die Farbtöne dazwischen führt. Blau zu Gelb in oklch geht durch Grün. Manchmal ist das der Sinn; manchmal eine Überraschung.

Oklab bleibt auf dem direkten Weg; oklch streicht durch die Farbtöne zwischen seinen Enden: Pink zu Petrol führt durch Violett und Blau, Violett zu Orange durch Magenta und Rot.

Die Farbtonrichtung wählen

Zwischen zwei Farbtönen gibt es zwei Wege um den Farbkreis. Standardmäßig nimmt oklch den shorter hue. Du kannst longer hue verlangen oder mit increasing hue oder decreasing hue eine Richtung erzwingen. Das Schlüsselwort steht direkt hinter dem Farbraum.

Der kurze Weg von Rot zu Blau führt durch Magenta und Violett. Der lange führt durch Orange, Gelb, Grün und Cyan.

longer hue ist der übersichtlichste Weg, ein Spektrum zu zeichnen: zwei Stopps statt sieben. So machst du auch einen vollen Regenbogenverlauf, dessen Farben alle gleich hell wirken, was einem sRGB-Regenbogen nie ganz gelingt.

Farben in oklch() schreiben

Du kannst auch die Stopps selbst in OKLCH schreiben: oklch(L C H), wobei L die Helligkeit von 0 % bis 100 % ist, C die Buntheit von 0 bis etwa 0,37 und H der Farbtonwinkel. Bleibt L über die Stopps gleich, ergibt das einen Verlauf gleicher Helligkeit, was sich in Hex nach Augenmaß schwer machen lässt. oklch.com ist eine gute Farbauswahl, um Werte zu finden.

css
.band {
  /* same lightness and chroma, only the hue changes */
  background: linear-gradient(
    90deg in oklch,
    oklch(68% 0.17 300),
    oklch(68% 0.17 20),
    oklch(68% 0.17 70)
  );
}
Violett über Koralle zu Bernstein bei einer Helligkeit: Kein Stopp sticht als heller hervor als die anderen.
Gleiche Helligkeit: Violett, Koralle, Bernsteinlinear-gradient(90deg in oklch, oklch(68% 0.17 300), oklch(68% 0.17 20), oklch(68% 0.17 70))
Der Code von oben, gerendert. Farben außerhalb des Bildschirmumfangs werden auf die nächste darstellbare Farbe abgebildet.

Browserunterstützung und Fallbacks

Interpolationsmethoden und oklch()-Farben werden in aktuellen Versionen von Chrome, Edge, Safari und Firefox unterstützt. Browser überspringen jede Deklaration, die sie nicht verstehen, der Fallback besteht also einfach darin, zuerst die schlichte Version zu schreiben. Wo die erweiterte Zeile ignoriert wird, bleibt der sRGB-Verlauf.

css
.hero {
  background-color: #7c3aed;
  background-image: linear-gradient(135deg, #7c3aed, #f97316);
  background-image: linear-gradient(135deg in oklch, #7c3aed, #f97316);
}
Erst einfarbig, dann sRGB, dann oklch. Jeder Browser behält die letzte Zeile, die er versteht.

Willst du weitergehen: Wahrnehmungsbasierte Mischungen passen gut zu Körnung, um Banding im Farbverlauf zu verhindern, und zu den Techniken für Stopps und Hints im Leitfaden zu CSS linear-gradient.

Häufige Fragen

Was bewirkt in oklch in einem CSS-Farbverlauf?

Es lässt den Browser die Zwischenfarben im OKLCH-Farbraum berechnen, was die Helligkeit gleichmäßig und die Farben gesättigt hält, statt durch Grau zu mischen.

Sollte ich für Farbverläufe oklab oder oklch nutzen?

Nimm oklch für lebhafte Mischungen zwischen verschiedenen Farbtönen und oklab für Übergänge zu Weiß, Schwarz oder Grau oder wenn die Mischung nicht durch zusätzliche Farbtöne führen soll.

Warum läuft mein oklch-Verlauf durch Grün?

OKLCH läuft um den Farbtonkreis, und zwischen Blau und Gelb führt der kürzere Weg durch Grün. Nutze in oklab für einen direkten Weg oder füge einen mittleren Stopp hinzu.

Muss ich Farben in oklch() schreiben, um die oklch-Interpolation zu nutzen?

Nein. Hex-Farben funktionieren mit in oklch problemlos; nur die Mischung ändert sich. Stopps in oklch() zu schreiben lohnt sich, wenn du die Helligkeit genau steuern willst.

Was passiert in Browsern, die in oklch nicht unterstützen?

Sie ignorieren die ganze Deklaration. Setze einen normalen sRGB-Verlauf in die Zeile davor, und diese Browser behalten ihn.

Diesen Artikel teilen

Geschrieben von GradientlyVerifiziertes Gradiently-Konto

Das Team hinter Gradiently, einem Designtool rund um Marks: lebendige Farbverläufe, durch die alles, was du gestaltest, nach dir aussieht.

Unser Profil ansehen