CSS y web

Degradado CSS con OKLCH: interpolación para mezclas más suaves

La mayoría de los degradados apagados y grises en el medio no tienen un problema de color, sino de matemáticas. Dos palabras, in oklch, cambian dónde hace las cuentas el navegador.

GradientlyCuenta verificada de Gradiently··6 min de lectura
Portada: Marsh of Ink · GR·1EQ7·TN

La versión corta

  • Los degradados CSS se mezclan en sRGB por defecto cuando todos sus colores están escritos en hex, rgb() o hsl(), lo que a menudo vuelve apagado o gris el medio de la mezcla.
  • Añadir in oklch o in oklab a un degradado le dice al navegador que mezcle en un espacio de color perceptual, que mantiene pareja la luminosidad y limpios los colores.
  • in oklab toma el camino más recto entre dos colores, mientras que in oklch recorre el círculo de tonos y mantiene alta la saturación.
  • Las palabras clave de tono, como shorter hue, longer hue, increasing hue y decreasing hue, eligen por qué lado de la rueda de color viaja un degradado oklch.
  • Los navegadores ignoran las declaraciones que no pueden interpretar, así que escribir primero un degradado sRGB y después la versión oklch es una alternativa segura.
En esta página

La interpolación OKLCH en degradados CSS significa pedir al navegador que calcule los colores intermedios de un degradado en el espacio de color OKLCH y no en sRGB. Añades dos palabras tras la dirección: linear-gradient(90deg in oklch, #2563eb, #facc15). El resultado es una mezcla cuya luminosidad cambia de forma pareja y cuyo medio se mantiene vivo, en lugar de hundirse en la banda gris y turbia por la que son conocidas las mezclas sRGB simples.

De azul a amarillo de tres formas. sRGB pasa por el gris; oklab se mantiene limpio y neutro; oklch conserva el color pleno al viajar por el verde azulado y el verde.

Por qué los degradados sRGB se vuelven grises

sRGB se diseñó para codificar con eficiencia los colores de pantalla, no para coincidir con cómo ve la gente. Mezclar dos colores sRGB significa promediar sus números de rojo, verde y azul, y a medio camino entre un azul y un amarillo hay un conjunto de números intermedios que se ve gris. Además, su luminosidad cambia de forma desigual, así que algunas mezclas se abomban más claras o más oscuras en el medio. La parte de diseño de este problema está en los degradados turbios.

Oklab y su forma cilíndrica, OKLCH, se diseñaron para que pasos iguales en sus números se vean como pasos más o menos iguales para el ojo. Mezclar en ellos mantiene la luminosidad percibida avanzando de forma constante, y por eso los degradados hechos así se ven más suaves y luminosos con los mismos extremos.

La sintaxis: in oklch e in oklab

El método de interpolación va en el primer argumento, antes o después de la dirección. Funciona en linear-gradient(), radial-gradient(), conic-gradient() y sus formas repetidas, y también en color-mix(). Tus puntos de color pueden seguir en hex; solo cambian las matemáticas.

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);
Solo cambia la mezcla; los puntos de color siguen tal como están escritos.
Espacio de colorCómo mezclaÚsalo para
srgbPromedia rojo, verde y azulIgualar con exactitud diseños antiguos
srgb-linearPromedia la luz físicaEfectos de mezcla de luz; los puntos medios se ven brillantes
oklabLínea recta por un espacio perceptualLa mayoría de las mezclas y cualquier fundido a blanco, negro o gris
oklchAlrededor del círculo de tonos con croma constanteMezclas vivas de varios tonos, arcoíris, atardeceres
hslAlrededor del círculo de tonos, no perceptualRuedas de color; la luminosidad es desigual
Los espacios que más probablemente usarás. La página de color-interpolation-method de MDN los enumera todos.

oklab u oklch: cuál elegir

Ambos son perceptuales; difieren en el camino que toman. Oklab traza una línea recta entre los dos colores, así que el medio puede perder algo de saturación cuando los extremos están lejos en la rueda de color, pero nunca pasa por un tono que no pediste. OKLCH conserva el croma, la intensidad del color, y recorre el círculo de tonos, así que el medio se mantiene saturado pero pasa por los tonos intermedios. De azul a amarillo en oklch se pasa por el verde. A veces es justo lo que buscas; a veces es una sorpresa.

Oklab sigue el camino directo; oklch barre los tonos entre sus extremos: de rosa a verde azulado pasa por el violeta y el azul, de violeta a naranja por el magenta y el rojo.

Elegir la dirección del tono

Entre dos tonos cualesquiera hay dos formas de recorrer la rueda de color. Por defecto oklch toma el shorter hue. Puedes pedir longer hue o forzar una dirección con increasing hue o decreasing hue. La palabra clave va justo después del espacio de color.

El camino corto de rojo a azul pasa por el magenta y el violeta. El camino largo pasa por el naranja, el amarillo, el verde y el cian.

longer hue es la forma más limpia de dibujar un espectro: dos puntos en lugar de siete. También es como se hace un degradado arcoíris completo cuyos colores se sienten igual de brillantes, algo que un arcoíris sRGB nunca acaba de lograr.

Escribir colores en oklch()

También puedes escribir los propios puntos en OKLCH: oklch(L C H), donde L es la luminosidad de 0% a 100%, C es el croma de 0 hasta unos 0,37 y H es el ángulo del tono. Mantener L igual en todos los puntos da un degradado de luminosidad uniforme, algo difícil de hacer a ojo en hex. oklch.com es un buen selector para encontrar valores.

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)
  );
}
De violeta a ámbar pasando por coral con una misma luminosidad: ningún punto destaca como más brillante que los demás.
Luminosidad igual: violeta, coral, ámbarlinear-gradient(90deg in oklch, oklch(68% 0.17 300), oklch(68% 0.17 20), oklch(68% 0.17 70))
El código de arriba, renderizado. Los colores fuera del rango de una pantalla se asignan al color más cercano que esta puede mostrar.

Compatibilidad con navegadores y alternativas

Los métodos de interpolación y los colores oklch() son compatibles con las versiones actuales de Chrome, Edge, Safari y Firefox. Los navegadores omiten cualquier declaración que no puedan interpretar, así que la alternativa es simplemente escribir antes la versión simple. Donde se ignora la línea mejorada, se queda el degradado sRGB.

css
.hero {
  background-color: #7c3aed;
  background-image: linear-gradient(135deg, #7c3aed, #f97316);
  background-image: linear-gradient(135deg in oklch, #7c3aed, #f97316);
}
Color plano, luego sRGB, luego oklch. Cada navegador se queda con la última línea que entiende.

Si quieres ir más allá, las mezclas perceptuales combinan bien con el grano para evitar el banding en degradados, y con las técnicas de puntos y pistas de la guía del degradado lineal CSS.

Preguntas frecuentes

¿Qué hace in oklch en un degradado CSS?

Hace que el navegador calcule los colores intermedios en el espacio de color OKLCH, lo que mantiene pareja la luminosidad y saturados los colores en lugar de mezclar pasando por el gris.

¿Debo usar oklab u oklch para los degradados?

Usa oklch para mezclas vivas entre tonos distintos y oklab para fundidos hacia blanco, negro o gris, o cuando no quieras que la mezcla pase por tonos adicionales.

¿Por qué mi degradado oklch pasa por el verde?

OKLCH recorre el círculo de tonos, y entre azul y amarillo el camino más corto pasa por el verde. Usa in oklab para un camino directo o añade un punto intermedio.

¿Necesito escribir los colores en oklch() para usar la interpolación oklch?

No. Los colores hex funcionan bien con in oklch; solo cambia la mezcla. Escribir los puntos en oklch() es útil cuando quieres controlar con precisión la luminosidad.

¿Qué pasa en los navegadores que no admiten in oklch?

Ignoran toda la declaración. Pon un degradado sRGB normal en la línea anterior y esos navegadores se quedan con él.

Compartir esta guía

Escrito por GradientlyCuenta verificada de Gradiently

El equipo detrás de Gradiently, una herramienta de diseño creada en torno a los Marks: degradados vivos que hacen que todo lo que diseñas parezca tuyo.

Ver nuestro perfil