</> HTML5Advent
ENFRESDEITPT

// css · Web Platform Advent #21

CSS contrast-color(): texto negro o blanco automático, y su límite real

contrast-color() elige texto negro o blanco según el color de fondo. La sintaxis, el caso de theming que resuelve, el problema de los tonos medios que advierte MDN y el soporte de navegadores.

Un abanico de muestrarios de pintura desplegado, cada tira impresa con un código de color

contrast-color() es una función CSS que toma un color y devuelve el color de texto que mejor se lee sobre él. Llegó a los cuatro motores principales y pasó a ser Baseline Newly available en abril de 2026. Resuelve un problema pequeno y molesto con el que tropiezan constantemente las interfaces tematizables, y tiene un limite fácil de pasar por alto.

Qué devuelve en realidad

Solo dos valores: white o black. Nada más. La función compara el contraste de ambos con el color que le pasas y devuelve el mayor. Si los dos son exactamente iguales, devuelve white.

Esa estrechez es justamente el punto. No es una función general de derivación de color: no producira un gris matizado ni un tono cercano a tu marca. Responde a una sola pregunta: sobre este fondo, ¿se lee mejor el texto oscuro o el claro?

La sintaxis

Le pasas cualquier valor <color> valido, incluida una propiedad personalizada:

button {
  background-color: var(--button-color);
  color: contrast-color(var(--button-color));
}

Esa única línea es el caso para el que se creo. Un componente tematizable recibe su fondo desde una variable y el color del texto lo sigue automáticamente: ni una segúnda variable que mantener sincronizada, ni JavaScript leyendo el estilo calculado.

Filas de tableros de muestras de color con marco de madera, colocados de pie
Tableros de muestras en un showroom: cada tono necesita una etiqueta que siga siendo legible encima, justo el problema que contrast-color() automatiza en CSS.

Donde se gana su sitio

El modo claro y oscuro es el caso más claro. Define el fondo una vez por esquema y deja que el texto siga:

:root {
  --background-color: navy;
}

@media (prefers-color-scheme: light) {
  :root {
    --background-color: wheat;
  }
}

body,
a {
  background-color: var(--background-color);
  color: contrast-color(var(--background-color));
}

El mismo patrón sirve para un color de acento elegido por el usuario, etiquetas coloreadas por categoría y cualquier librería de componentes donde quien la consume pasa un fondo que no puedes prever. Antes de esta función, la respuesta habitual era un mapa fondo-texto mantenido a mano o un calculo en tiempo de build.

El limite que conviene conocer

MDN publica una advertencia explicita sobre esto y merece repetirse: el contraste WCAG AA (4,5:1) no es alcanzable en todos los fondos. Los tonos medios suelen fallar tanto contra el negro como contra el blanco. El ejemplo documentado es un azul rey, #2277d3: contrast-color() devuelve negro, y ese negro sobre ese azul no es legible en tamaños de texto pequeños.

La función te dice, pues, cual de las dos opciones es mejor, no que el resultado sea suficiente. Sobre un fondo de tono medio ninguna lo es. La regla practica es la que da MDN: úsala con colores claramente claros o claramente oscuros, y mantén una comprobación real de contraste en tu proceso para todo lo que quede en medio.

Si dudas de si un fondo cae en esa trampa de los tonos medios, pásalo por nuestro verificador de contraste WCAG antes de publicar.

Soporte de navegadores

Baseline Newly available desde abril de 2026, es decir, funcióna en las versiónes estables actuales de Chrome, Edge, Firefox y Safari, en escritorio y móvil. La diferencia entre «Newly» y «Widely» importa: los dispositivos antiguos y los navegadores sin actualizar no la tienen. Como la declaración sencillamente no se analiza donde no hay soporte, una declaración color puesta antes en la misma regla actua de reserva natural.

Referencia rapida

PreguntaRespuesta
Valores de retorno posiblessolo white o black
Empate entre ambosdevuelve white
Acepta una propiedad personalizadasi: contrast-color(var(--c))
Garantiza WCAG AAno: los tonos medios fallan por ambos lados
Estado BaselineNewly available, abril de 2026
Reservadeclarar color antes en la misma regla

Úsala donde el fondo sea de verdad imprevisible y claramente claro u oscuro. No la conviertas en sustituto de elegir colores legibles desde el principio: escoge la mejor de dos opciones, que no es lo mismo que producir una buena.