CSS e web

Interpolazione OKLCH nei gradienti CSS per sfumature più morbide

La maggior parte dei gradienti spenti, con il centro grigio, non è un problema di colore ma di matematica. Due parole, in oklch, cambiano dove il browser fa i calcoli.

GradientlyAccount Gradiently verificato··5 min di lettura
Copertina: Marsh of Ink · GR·1EQ7·TN

In breve

  • I gradienti CSS sfumano in sRGB per impostazione predefinita quando tutti i loro colori sono scritti in esadecimale, rgb() o hsl(), e spesso il centro della sfumatura risulta spento o grigio.
  • Aggiungere in oklch o in oklab a un gradiente dice al browser di sfumare in uno spazio colore percettivo, che mantiene uniforme la luminosità e puliti i colori.
  • in oklab prende il percorso più diretto tra due colori, mentre in oklch gira attorno al cerchio delle tonalità e mantiene alta la saturazione.
  • Parole chiave come shorter hue, longer hue, increasing hue e decreasing hue scelgono in che verso un gradiente oklch gira attorno al cerchio cromatico.
  • I browser ignorano le dichiarazioni che non riescono a interpretare, quindi scrivere prima un gradiente sRGB e dopo la versione oklch è una riserva sicura.
In questa pagina

L’interpolazione OKLCH nei gradienti CSS significa chiedere al browser di calcolare i colori intermedi di un gradiente nello spazio colore OKLCH invece che in sRGB. Aggiungi due parole dopo la direzione: linear-gradient(90deg in oklch, #2563eb, #facc15). Il risultato è una sfumatura la cui luminosità cambia in modo uniforme e il cui centro resta vivido, invece di afflosciarsi nella fascia grigia e sporca per cui sono note le sfumature sRGB semplici.

Da blu a giallo in tre modi. L’sRGB passa per il grigio; oklab resta pulito e neutro; oklch mantiene il colore pieno passando per il verde acqua e il verde.

Perché i gradienti sRGB diventano grigi

L’sRGB è stato progettato per codificare in modo efficiente i colori degli schermi, non per corrispondere a come vedono le persone. Sfumare due colori sRGB significa fare la media dei loro numeri di rosso, verde e blu, e a metà tra un blu e un giallo c’è un insieme di numeri mediocri che sembra grigio. Anche la sua luminosità cambia in modo irregolare, quindi alcune sfumature si gonfiano più chiare o più scure al centro. Il lato progettuale del problema è in gradienti sporchi.

Oklab e la sua forma cilindrica, OKLCH, sono stati progettati perché passi uguali nei loro numeri sembrino passi più o meno uguali all’occhio. Sfumare al loro interno mantiene la luminosità percepita in movimento costante, ed è per questo che i gradienti fatti così sembrano più morbidi e brillanti con gli stessi estremi.

La sintassi: in oklch e in oklab

Il metodo di interpolazione va nel primo argomento, prima o dopo la direzione. Funziona in linear-gradient(), radial-gradient(), conic-gradient() e nelle loro forme ripetute, e anche in color-mix(). I tuoi punti di colore possono restare in esadecimale; cambia solo la matematica.

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);
Cambia solo la sfumatura; i punti di colore restano come scritti.
Spazio coloreCome sfumaDa usare per
srgbFa la media di rosso, verde e bluRiprodurre esattamente vecchi design
srgb-linearFa la media della luce fisicaEffetti di miscela di luce; i punti medi sembrano luminosi
oklabLinea retta in uno spazio percettivoLa maggior parte delle sfumature, e ogni dissolvenza verso bianco, nero o grigio
oklchAttorno al cerchio delle tonalità a croma costanteSfumature vivide a più tonalità, arcobaleni, tramonti
hslAttorno al cerchio delle tonalità, non percettivoCerchi cromatici; la luminosità è irregolare
Gli spazi che userai più probabilmente. La pagina MDN sul metodo di interpolazione del colore li elenca tutti.

oklab o oklch: quale scegliere

Entrambi sono percettivi; differiscono per il percorso che prendono. Oklab traccia una linea retta tra i due colori, quindi il centro può perdere un po’ di saturazione quando gli estremi sono lontani sul cerchio cromatico, ma non vaga mai in una tonalità che non hai chiesto. OKLCH mantiene il croma, l’intensità del colore, e percorre il cerchio delle tonalità, quindi il centro resta saturo ma passa per le tonalità intermedie. Da blu a giallo in oklch passa per il verde. A volte è proprio lo scopo; a volte è una sorpresa.

Oklab resta sul percorso diretto; oklch spazia tra le tonalità intermedie: da rosa a verde acqua passa per viola e blu, da viola ad arancione per magenta e rosso.

Scegliere la direzione della tonalità

Tra due tonalità ci sono due modi di girare attorno al cerchio cromatico. Per impostazione predefinita oklch prende lo shorter hue. Puoi chiedere longer hue, oppure forzare un verso con increasing hue o decreasing hue. La parola chiave va subito dopo lo spazio colore.

La via breve dal rosso al blu passa per magenta e viola. La via lunga passa per arancione, giallo, verde e ciano.

longer hue è il modo più ordinato di disegnare uno spettro: due punti invece di sette. È anche il modo di creare un gradiente arcobaleno completo i cui colori sembrano tutti ugualmente luminosi, cosa che un arcobaleno sRGB non riesce mai del tutto.

Scrivere i colori in oklch()

Puoi scrivere in OKLCH anche i punti stessi: oklch(L C H), dove L è la luminosità da 0% a 100%, C è il croma da 0 fino a circa 0,37 e H è l’angolo della tonalità. Mantenere la stessa L su tutti i punti dà un gradiente di luminosità uguale, difficile da ottenere a occhio in esadecimale. oklch.com è un buon selettore per trovare i valori.

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)
  );
}
Da viola a corallo ad ambra con una sola luminosità: nessun punto risalta come più luminoso degli altri.
Luminosità uguale: viola, corallo, ambralinear-gradient(90deg in oklch, oklch(68% 0.17 300), oklch(68% 0.17 20), oklch(68% 0.17 70))
Il codice qui sopra, disegnato. I colori fuori dalla gamma di uno schermo vengono portati al colore più vicino che può mostrare.

Supporto dei browser e alternative di riserva

I metodi di interpolazione e i colori oklch() sono supportati in Chrome, Edge, Safari e Firefox attuali. I browser saltano qualsiasi dichiarazione che non riescono a interpretare, quindi la riserva consiste semplicemente nello scrivere prima la versione semplice. Dove la riga migliorata viene ignorata, resta il gradiente sRGB.

css
.hero {
  background-color: #7c3aed;
  background-image: linear-gradient(135deg, #7c3aed, #f97316);
  background-image: linear-gradient(135deg in oklch, #7c3aed, #f97316);
}
Colore piatto, poi sRGB, poi oklch. Ogni browser tiene l’ultima riga che capisce.

Se vuoi spingerti oltre, le sfumature percettive si abbinano bene alla grana per evitare il banding nei gradienti, e alle tecniche di punti e indicazioni nella guida al gradiente lineare in CSS.

Le domande più frequenti

Cosa fa in oklch in un gradiente CSS?

Fa calcolare al browser i colori intermedi nello spazio colore OKLCH, che mantiene uniforme la luminosità e saturi i colori invece di sfumare attraverso il grigio.

Devo usare oklab o oklch per i gradienti?

Usa oklch per sfumature vivide tra tonalità diverse, e oklab per dissolvenze verso bianco, nero o grigio, o quando non vuoi che la sfumatura passi per tonalità in più.

Perché il mio gradiente oklch passa per il verde?

OKLCH percorre il cerchio delle tonalità e tra blu e giallo la via più breve passa per il verde. Usa in oklab per un percorso diretto, oppure aggiungi un punto intermedio.

Devo scrivere i colori in oklch() per usare l’interpolazione oklch?

No. I colori esadecimali funzionano benissimo con in oklch; cambia solo la sfumatura. Scrivere i punti in oklch() è utile quando vuoi controllare con precisione la luminosità.

Cosa succede nei browser che non supportano in oklch?

Ignorano l’intera dichiarazione. Metti un normale gradiente sRGB sulla riga prima e quei browser tengono quello.

Condividi questa guida

Scritto da GradientlyAccount Gradiently verificato

Il team dietro Gradiently, uno strumento di design costruito attorno ai Mark: gradienti vivi che fanno sembrare tuo tutto ciò che progetti.

Vedi il nostro profilo
Tutte le guide su CSS e web