web design uiNovember 5, 20267 min read

Colores de degradado CSS: por qué los degradados se vuelven grises en el medio y 3 formas de arreglarlo

Mezcla azul con amarillo y el medio se vuelve gris, porque los colores hex se mezclan en RGB. Añade una parada intermedia, mezcla en OKLCH o elige colores vecinos en la rueda. Incluye cinco degradados listos.

By Boone
XLinkedIn
CSS Gradient Colors: Why Gradients Turn Gray in the Middle and 3 Ways to Fix It

Un degradado se vuelve gris en el medio porque el navegador mezcla los colores hex en RGB, y dos colores opuestos entre sí se cancelan a mitad de camino. El arreglo es darle al medio un color a propósito, o cambiar cómo se calcula la mezcla. Aquí van tres arreglos y cinco degradados que puedes pegar.

Por qué el medio se vuelve gris

Mira un degradado que se ve turbio e ignora los extremos. Los extremos están bien. Los elegiste tú. El medio es la parte que nadie eligió.

Un degradado es una mezcla, y una mezcla necesita matemáticas. Los colores hex son valores RGB, así que por defecto el navegador los mezcla canal por canal.

A mitad de camino entre azul y amarillo, el rojo está entre 0 y 255, el verde está entre 0 y 255, y el azul está entre 255 y 0. Cada canal cae cerca de 128. Rojo, verde y azul iguales es la definición de gris.

#0000FF a #FFFF00

Un degradado de azul a amarillo que se vuelve un gris plano en el medio

Con una parada intermedia #0EBAAE

El mismo degradado de azul a amarillo con un medio turquesa que se mantiene colorido de lado a lado
Mismos dos extremos. A la izquierda la mezcla pasa directo por #808080. A la derecha el medio es un turquesa, así que el degradado sigue vivo de principio a fin.

No es tu monitor ni un problema de compresión. Es aritmética, y aparece siempre que los dos colores están lejos en la rueda de color. El azul y el amarillo son casi opuestos exactos, que es el peor caso.

Arreglo 1: añade una parada intermedia

El arreglo más directo es dejar de dejar el medio al azar. Añade una tercera parada de color al 50% que sea un color elegido por ti.

css
background: linear-gradient(90deg, #0000FF, #0EBAAE, #FFFF00);

#0EBAAE es un turquesa que se sitúa entre el azul y el amarillo en color percibido. La mezcla ahora va de azul a turquesa, y luego de turquesa a amarillo, y ninguna mitad cruza el gris.

Funciona en todos los navegadores y no necesita sintaxis nueva, así que es la opción segura para un diseño que debe verse igual en todas partes. Elige el color del medio a ojo y luego compáralo junto a los dos extremos. El costo es que ahora tienes tres colores en vez de dos.

Arreglo 2: mezcla en OKLCH

El otro arreglo cambia las matemáticas en lugar de añadir un color. CSS te deja elegir el espacio de color en el que ocurre la mezcla, y OKLCH describe el color como luminosidad, croma y tono. El croma es qué tan colorido es un color, así que una mezcla que conserva el croma sigue siendo colorida.

css
background: linear-gradient(in oklch, #0000FF, #FFFF00);

Con in oklch el navegador recorre la rueda de color, pasando por verdes y turquesas, en lugar de ir directo por el centro gris. Conservas dos colores y el código sigue corto. MDN lo documenta como el método de interpolación de color dentro de la función de degradado, y los colores hex heredados solo usan RGB cuando no eliges uno, para mantener la compatibilidad con páginas antiguas.

Dos cosas que debes saber. Algunos colores de ese viaje pueden quedar fuera de lo que una pantalla puede mostrar, así que los navegadores los recortan al valor más cercano que sí se puede mostrar. Y la ruta que toma es el camino corto alrededor de la rueda, así que revisa que el camino elegido te guste. Nuestra guía de color OKLCH en CSS moderno cubre el espacio con más profundidad.

Arreglo 3: elige vecinos

El tercer arreglo no toca el código. Elige colores que no pueden cancelarse entre sí.

#0066FF a #FF8800

Un degradado de azul a naranja que se vuelve un gris parduzco apagado en el medio

#6440E0 a #E040A0

Un degradado de violeta a rosa que se mantiene brillante de lado a lado
El azul y el naranja son opuestos, así que se encuentran en un apagado #807780. El violeta y el rosa son vecinos, así que se encuentran en un rico #A240C0.

Los colores opuestos se mezclan en gris. Los vecinos se mezclan en algo intermedio que sigue siendo un color. Si una marca une dos opuestos, igual puedes usarlos en un degradado: pon una parada intermedia entre ellos, o mezcla en OKLCH.

Azul a naranja, mezcla por defecto

El degradado de azul a naranja con un medio gris parduzco

Azul a naranja, en oklch

El mismo degradado de azul a naranja mezclado en OKLCH, pasando por violeta y rosa en lugar de gris
Los mismos dos extremos de antes, con solo la mezcla cambiada. El gris desapareció y el medio es un rosa brillante.

Cómo revisar tu propio degradado

  1. Mira el medio, no los extremos.
  2. Ponle nombre al color que ves ahí. Si el nombre es gris, marrón o barro, como con #808080 o #807780, ese es el problema.
  3. Elige uno de los arreglos de arriba y compara las dos versiones lado a lado.

Un degradado es tan bueno como su peor punto, y su peor punto casi siempre es el medio.

Cinco degradados para robar

Cada uno fue revisado para que su medio siga siendo colorido. El primero tiene una parada intermedia incorporada. Los otros cuatro usan tonos vecinos. Toca un código para copiarlo.

Un degradado de azul a amarillo pasando por turquesa
Azul, turquesa, amarillo. Toca un color para copiar su código.
Un degradado de violeta a rosa
Violeta a rosa. Toca un color para copiar su código.
Un degradado de azul a turquesa
Azul a turquesa. Toca un color para copiar su código.
Un degradado de naranja a rosa intenso
Naranja a rosa intenso. Toca un color para copiar su código.
Un degradado de verde a lima
Verde a lima. Toca un color para copiar su código.
DegradadoInicioMedioFinalPor qué funciona
Azul, turquesa, amarillo#0000FF#0EBAAE#FFFF00Extremos opuestos, rescatados por una parada intermedia real
Violeta a rosa#6440E0ninguno#E040A0Vecinos en la rueda
Azul a turquesa#2F5BEAninguno#14B8A6Vecinos en la rueda
Naranja a rosa intenso#FF7A00ninguno#FF2E93Vecinos en la rueda
Verde a lima#00A86Bninguno#C6F432Vecinos en la rueda

Pásale esto a tu desarrollador

css
.gradient-sunrise { background: linear-gradient(90deg, #0000FF, #0EBAAE, #FFFF00); } .gradient-violet { background: linear-gradient(90deg, #6440E0, #E040A0); } .gradient-ocean { background: linear-gradient(90deg, #2F5BEA, #14B8A6); } .gradient-sunset { background: linear-gradient(90deg, #FF7A00, #FF2E93); } .gradient-meadow { background: linear-gradient(90deg, #00A86B, #C6F432); } /* Two opposite colors, no middle stop: choose the blend space instead. */ .gradient-opposites { background: linear-gradient(in oklch, #0066FF, #FF8800); }

Si un navegador no entiende in oklch, ignora toda la declaración. Escribe primero una línea linear-gradient(...) normal como respaldo, y después la línea con OKLCH.

FAQ

¿Por qué mi degradado se vuelve gris en el medio?

Los colores hex se mezclan en RGB, y dos colores muy alejados en la rueda de color se promedian en gris. El azul #0000FF y el amarillo #FFFF00 se encuentran en #808080.

¿Cómo evito que un degradado CSS se vea turbio?

Añade una parada de color intermedia con color real, mezcla en OKLCH con linear-gradient(in oklch, ...), o elige dos colores que estén uno junto al otro en la rueda.

¿Qué hace "in oklch" en un degradado CSS?

Le dice al navegador que mezcle los colores en el espacio de color OKLCH en lugar de RGB, así el medio conserva su color en vez de caer al gris.

¿Qué colores de degradado se ven bien juntos?

Vecinos en la rueda de color, como violeta #6440E0 a rosa #E040A0 o verde #00A86B a lima #C6F432. Su mezcla se mantiene brillante de lado a lado.

¿Todos los navegadores admiten degradados en OKLCH?

Los navegadores modernos sí, pero uno que no lo haga descartará la declaración. Añade antes una línea de degradado normal como respaldo.

¿Por qué de azul a amarillo sale gris y no verde?

Porque la mezcla toma el camino recto por RGB, donde el promedio de los dos es gris. Un medio verde solo aparece si lo añades como parada o mezclas en OKLCH.

Fuentes

  • CSS Color Module Level 4, interpolation: los colores sRGB heredados, como el hex, se interpolan en sRGB por defecto, y otros espacios se eligen con el método de interpolación de color.
  • MDN, linear-gradient(): la sintaxis <color-interpolation-method>, in oklch.
  • MDN, OKLCH color: luminosidad, croma y tono.
  • El punto medio de (0, 0, 255) y (255, 255, 0) es (127.5, 127.5, 127.5), que es #808080 con croma OKLCH 0. Los puntos medios de #0066FF a #FF8800 (#807780) y de #6440E0 a #E040A0 (#A240C0) los calculamos nosotros en sRGB. Las barras de esta página se generaron a partir de esos cálculos, y la barra OKLCH recorta los colores fuera del rango de pantalla, como hacen los navegadores.
  • Publicado por primera vez como carrusel en UX Brainy.

Want gradients, color and every other detail designed as one system? Our team designs and builds product UI that holds up on every screen.

Get Started

More from Brainy Papers

Keep reading