</> HTML5Advent
ENFRESDEITPT

// css · Web Platform Advent #21

CSS contrast-color(): texto preto ou branco automático, e o seu limite real

contrast-color() escolhe texto preto ou branco consoante a cor de fundo. A sintaxe, o caso de theming que resolve, o problema dos tons médios que a MDN assinala e o suporte dos navegadores.

Um leque de mostruarios de tinta aberto, cada tira impressa com um código de cor

contrast-color() é uma função CSS que recebe uma cor e devolve a cor de texto que melhor se lê sobre ela. Chegou aos quatro motores principais e passou a Baseline Newly available em abril de 2026. Resolve um problema pequeno e irritante com que as interfaces tematizáveis tropecam constantemente, e tem um limite fácil de passar ao lado.

O que devolve na realidade

Apenas dois valores: white ou black. Mais nada. A função compara o contraste de ambos com a cor que lhe passas e devolve o maior. Se os dois forem exatamente iguais, devolve white.

Essa estreiteza é precisamente o ponto. Não é uma função geral de derivação de cor: não produzirá um cinzento matizado nem um tom próximo da tua marca. Responde a uma única pergunta: sobre este fundo, lê-se melhor texto escuro ou claro?

A sintaxe

Passas qualquer valor <color> valido, incluindo uma propriedade personalizada:

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

Essa única linha e o caso para que foi feita. Um componente tematizavel recebe o fundo de uma variavel e a cor do texto segue automaticamente: nem uma segunda variavel para manter sincronizada, nem JavaScript a ler o estilo calculado.

Filas de paineis de amostras de cor com moldura de madeira, colocados de pe
Paineis de amostras num showroom: cada tom precisa de uma etiqueta que continue legível por cima, exatamente o problema que contrast-color() automatiza em CSS.

Onde vale a pena

O modo claro e escuro é o caso mais nítido. Define o fundo uma vez por esquema e deixa o texto seguir:

: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));
}

O mesmo padrão serve para uma cor de destaque escolhida pelo útilizador, etiquetas coloridas por categoria e qualquer biblioteca de componentes em que quem a usa passa um fundo que não consegues prever. Antes desta função, a resposta habitual era um mapa fundo-para-texto mantido a mao, ou um calculo em tempo de build.

O limite que convem conhecer

A MDN publica um aviso explicito sobre isto e vale a pena repeti-lo: o contraste WCAG AA (4,5:1) não é atingível em todos os fundos. Os tons médios costumam falhar tanto contra o preto como contra o branco. O exemplo documentado é um azul-rei, #2277d3: contrast-color() devolve preto, e esse preto sobre esse azul não é legível em corpos pequenos.

A função diz-te, portanto, qual das duas opções é melhor, não que o resultado seja suficiente. Num fundo de tom medio nenhuma o é. A regra prática é a que a MDN dá: usa-a com cores claramente claras ou claramente escuras, e mantém uma verificação real de contraste no teu processo para tudo o que fique pelo meio.

Se tiveres dúvidas de que um fundo caia nessa armadilha dos tons médios, passa-o por o nosso verificador de contraste WCAG antes de publicares.

Suporte dos navegadores

Baseline Newly available desde abril de 2026, ou seja, funciona nas versões estaveis atuais do Chrome, Edge, Firefox e Safari, em computador e telemóvel. A diferenca entre «Newly» e «Widely» conta: os aparelhos antigos e os navegadores desatualizados não a tem. Como a declaração simplesmente não é interpretada onde não há suporte, uma declaração color colocada antes na mesma regra funciona como recurso natural.

Referencia rapida

PerguntaResposta
Valores de retorno possiveisapenas white ou black
Empate entre os doisdevolve white
Aceita uma propriedade personalizadasim: contrast-color(var(--c))
Garante WCAG AAnão: os tons médios falham dos dois lados
Estado BaselineNewly available, abril de 2026
Recursodeclarar color antes na mesma regra

Usa-a onde o fundo seja mesmo imprevisível e claramente claro ou escuro. Não faças dela um substituto de escolher cores legíveis à partida: escolhe a melhor de duas opções, o que não é o mesmo que produzir uma boa.