Razão de contraste de cores e WCAG explicados

O WCAG exige uma razão de contraste de pelo menos 4,5:1 entre o texto normal e o fundo, e de 3:1 para texto grande e para partes da interface como ícones, bordas de campos e indicadores de foco (nível AA); o nível mais rigoroso, AAA, pede 7:1 e 4,5:1. A razão vai de 1:1 (mesma cor) a 21:1 (preto no branco) e é calculada a partir da luminância relativa das duas cores. Você pode testar qualquer par com o verificador de contraste desta página.

6 min de leitura

Os números que você precisa

As Diretrizes de Acessibilidade para Conteúdo Web (WCAG 2.1 e 2.2 usam as mesmas regras de contraste) definem três critérios de sucesso para contraste. A maioria das leis e regras de compras públicas aponta para o nível AA, então esse é o alvo prático para sites e aplicativos.

Para testar um par, digite a cor do texto na ferramenta abaixo (qualquer cor CSS funciona: código hex, rgb(), hsl() ou um nome), informe a cor de Fundo e leia o resultado de cada linha. Inverter troca as duas, o que ajuda no modo escuro.

O que você está verificandoNível AANível AAA
Texto normal (corpo do texto, rótulos, links)4,5:17:1
Texto grande (24 px normal ou cerca de 19 px em negrito para cima)3:14,5:1
Ícones, bordas de campos, indicadores de foco, linhas de gráficos3:1Sem nível AAA separado
Logos, imagens decorativas, controles desativadosSem exigênciaSem exigência

Experimente aqui: Verificador de contraste de cores

Abrir a página completa da ferramenta

Como a razão de contraste é calculada

A razão compara a luminância relativa, que é o quanto uma cor parece clara numa tela sRGB padrão, de 0 para o preto a 1 para o branco. Cada canal vermelho, verde e azul é primeiro convertido da escala de 0 a 255 para 0 a 1 e linearizado (os valores são elevados mais ou menos à potência 2,4, porque os valores de tela têm codificação gama). Depois os canais recebem pesos: a luminância é igual a 0,2126 vezes o vermelho mais 0,7152 vezes o verde mais 0,0722 vezes o azul.

Os pesos explicam muitas surpresas. O verde é o que mais contribui para o brilho percebido e o azul muito pouco, então texto azul puro sobre preto vai muito mal, enquanto amarelo sobre branco fica quase invisível (cerca de 1,07:1). A razão em si é (luminância mais clara mais 0,05) dividida por (luminância mais escura mais 0,05). O 0,05 representa o reflexo da tela e impede que a fórmula divida por zero.

O matiz não aparece em nenhum lugar da fórmula. Duas cores podem parecer bem diferentes, como vermelho e verde, e ainda assim ter quase a mesma luminância, que é justamente a combinação que pessoas com daltonismo vermelho verde não conseguem distinguir.

Pares de cores reais e suas razões

Texto cinza é onde a maioria dos layouts falha. O limite fica em torno de #767676 sobre branco: um passo mais claro e o texto normal já não passa no AA.

Cor do texto sobre branco #FFFFFFRazãoResultado
#000000 preto21:1Passa no AA e no AAA
#333333 cinza escuro12,63:1Passa no AA e no AAA
#595959 cinza7,0:1Passa no AAA para texto normal
#767676 cinza4,54:1Passa no AA, o cinza mais claro que passa
#777777 cinza4,48:1Não passa no AA para texto normal
#999999 cinza claro2,85:1Não passa no AA nem para texto grande
#007BFF azul vivo3,98:1Só para texto grande
#0066CC azul5,57:1Passa no AA
#FF0000 vermelho4,0:1Só para texto grande

Qual elemento precisa de qual razão

  • Corpo do texto, rótulos de formulário, texto de links, placeholder que traz informação, mensagens de erro: 4,5:1.
  • Títulos e outros textos a partir de 24 px, ou texto em negrito a partir de cerca de 19 px (18,66 px, que equivale a 14 pt): 3:1.
  • Texto sobre imagens ou degradês: verifique o pior ponto atrás das letras, não a média. Acrescente uma camada sólida ou semitransparente se precisar.
  • Bordas de campos, contornos de checkbox, estados de chaves liga e desliga, ícones sem texto, indicadores de foco e linhas de gráficos: 3:1 em relação à cor vizinha (critério 1.4.11, Contraste não textual).
  • Botões desativados, controles inativos, logos e elementos puramente decorativos estão isentos. Isento não quer dizer invisível: as pessoas ainda precisam ver que o botão desativado existe.
  • Links dentro do texto identificados só pela cor também precisam de 3:1 em relação ao texto ao redor, ou de um sublinhado.

Como corrigir cores que não passam

Mudar o matiz raramente ajuda; mudar a luminosidade sim. Mantenha o matiz da marca e deixe o texto mais escuro (em fundos claros) ou mais claro (em fundos escuros) até passar. A linha Tons abaixo do verificador mostra nove versões mais claras e mais escuras da sua cor, geradas em OKLCH para que os passos pareçam uniformes; escolha a primeira que passa e cole no seu layout.

Se a cor da marca precisa ficar exatamente como está, use-a em títulos grandes, bordas ou fundos de botões com texto branco ou preto, e use uma variante mais escura para texto pequeno. Muitos design systems mantêm duas versões de cada cor da marca por esse motivo: uma para preenchimentos e outra para texto.

Texto semitransparente, como branco com 60 por cento de opacidade, é primeiro misturado com o fundo. O verificador faz essa mistura, então a razão mostrada corresponde ao que as pessoas realmente veem. Uma surpresa comum: texto cinza com opacidade reduzida sobre um card cinza não passa, mesmo que as duas cores passem separadamente contra o branco.

Modo escuro, APCA e a lei

Temas escuros precisam de verificação própria. Branco puro sobre preto puro (21:1) é tecnicamente perfeito, mas pode causar efeito de halo para alguns leitores; texto quase branco como #E6E6E6 sobre um fundo cinza escuro costuma ser mais confortável e ainda passa no AAA. Não suponha que uma paleta que funciona no modo claro passa no modo escuro: cores de destaque suaves muitas vezes caem abaixo de 3:1 em superfícies escuras.

Talvez você leia sobre o APCA, um modelo de contraste mais novo proposto para um futuro WCAG 3. Ele considera o peso da fonte e a polaridade, mas ainda é um rascunho. A conformidade hoje é medida com a razão do WCAG 2, que é o que este verificador calcula.

O WCAG 2.1 nível AA é a referência de leis e normas de acessibilidade em muitos lugares, incluindo a norma europeia EN 301 549, usada para o Ato Europeu de Acessibilidade e para as regras do setor público, e costuma servir de parâmetro em processos ligados à ADA nos Estados Unidos. No Brasil, a Lei Brasileira de Inclusão exige acessibilidade em sites, e o modelo eMAG do governo federal segue as recomendações do WCAG. Se você vende para o público pela internet, o contraste é um dos requisitos mais fáceis de cumprir e uma das falhas mais apontadas em auditorias automáticas.

Passo a passo

  1. Informe a cor do textoDigite ou cole a cor do texto no primeiro campo, ou use Escolher uma cor. Qualquer formato de cor CSS funciona.
  2. Defina o fundoInforme a cor de fundo no campo Fundo. Use Inverter para testar a combinação contrária.
  3. Leia os resultadosA razão de contraste aparece com Passa ou Não passa para texto normal e grande nos níveis AA e AAA e para elementos da interface, com uma prévia do texto ao vivo.
  4. Ajuste e copieSe não passar, escolha um tom mais escuro ou mais claro em Tons e copie o valor no formato que você precisa.

Perguntas frequentes

Qual é a razão de contraste mínima no WCAG AA?

4,5:1 para texto normal e 3:1 para texto grande, ícones e outras partes da interface. O nível AAA eleva as exigências de texto para 7:1 e 4,5:1.

O que conta como texto grande?

Pelo menos 18 pt (24 px) com peso normal, ou 14 pt (cerca de 18,7 px) em negrito. Texto grande só precisa de 3:1 no nível AA.

O texto de placeholder precisa cumprir as regras de contraste?

Se ele traz uma informação de que a pessoa precisa, sim, 4,5:1. Esse é um dos motivos para placeholders não substituírem rótulos: placeholder em cinza claro geralmente não passa.

4,48:1 é perto o suficiente para passar?

Não. Os limites do WCAG são exatos e auditorias automáticas não arredondam para cima. #777777 sobre branco (4,48:1) não passa, #767676 (4,54:1) passa.

Minhas cores são enviadas para algum lugar quando uso o verificador?

Não. O cálculo roda no seu navegador, e a ferramenta é grátis e sem cadastro. Ela também funciona offline depois que a página carrega uma vez.

Logos e marcas precisam cumprir as razões de contraste?

Não. Texto que faz parte de um logo ou nome de marca está isento, assim como elementos puramente decorativos e controles desativados.