Contraste de cores explicado: razões WCAG, texto legível e formatos de cor
Um texto é fácil de ler quando se destaca do fundo, e as Diretrizes de Acessibilidade para Conteúdo Web (WCAG) transformam isso num número: a razão de contraste. A WCAG 2.2, a versão atual, é Recomendação do W3C desde 12 de dezembro de 2024. Este guia explica como a razão é calculada, os mínimos para texto e para controles, e como as formas comuns de escrever uma cor se relacionam com ela.
Como a razão de contraste é calculada
Cada cor é convertida numa luminância relativa, de 0 para o preto a 1 para o branco. Primeiro, os valores de vermelho, verde e azul voltam a ser intensidade de luz, porque os valores sRGB não são proporcionais à luz: um valor até 0,04045 (numa escala de 0 a 1) é dividido por 12,92, e os maiores seguem uma curva de potência 2,4. Depois, são ponderados pelo brilho que o olho percebe: 0,2126 para o vermelho, 0,7152 para o verde e 0,0722 para o azul. Antes de maio de 2021 o limite era escrito 0,03928; o W3C observa que a mudança não tem efeito prático.
A razão é (L1 + 0,05) ÷ (L2 + 0,05), sendo L1 a cor mais clara. Vai de 1:1 para duas cores iguais a 21:1 para preto sobre branco. Ela nunca é arredondada: a explicação oficial da WCAG diz que 4,499:1 não atinge 4,5:1, e é por isso que verificadores que arredondam para uma casa decimal podem mostrar como aprovado o que não está.
Os mínimos
A WCAG tem três níveis, A, AA e AAA; o AA é o nível buscado pela maioria das políticas e auditorias de acessibilidade. Três critérios de sucesso definem mínimos de contraste:
| Critério | Vale para | Mínimo | Nível |
|---|---|---|---|
| 1.4.3 Contraste (mínimo) | Texto normal | 4,5:1 | AA |
| 1.4.3 Contraste (mínimo) | Texto grande | 3:1 | AA |
| 1.4.6 Contraste (melhorado) | Texto normal | 7:1 | AAA |
| 1.4.6 Contraste (melhorado) | Texto grande | 4,5:1 | AAA |
| 1.4.11 Contraste não textual | Controles, indicadores de foco, ícones e partes de gráficos | 3:1 | AA |
Texto grande quer dizer pelo menos 18 pontos, ou 14 pontos em negrito, que o W3C situa em cerca de 24 e 18,5 pixels CSS. Texto de logotipo, texto puramente decorativo e o texto de controles desativados não têm exigência de contraste. O contraste não textual cobre o que é preciso ver para usar uma página: a borda de um campo de texto, uma caixa de seleção, o indicador de foco, um ícone sem rótulo, as linhas de um gráfico.
Quais cores passam sobre o branco
Razões sobre o branco, cortadas em duas casas decimais como o verificador mostra:
| Texto / fundo | Contraste | Em que passa |
|---|---|---|
| #000000 / #ffffff | 21:1 | O máximo: passa em tudo |
| #0000ff / #ffffff | 8,59:1 | Passa em AAA para todo texto |
| #595959 / #ffffff | 7:1 | AAA exato para texto normal |
| #767676 / #ffffff | 4,54:1 | Passa em AA para texto normal |
| #777777 / #ffffff | 4,47:1 | Não passa em AA para texto normal; só texto grande e gráficos |
| #ff0000 / #ffffff | 3,99:1 | Só texto grande e gráficos |
| #949494 / #ffffff | 3,03:1 | Só texto grande e gráficos |
| #959595 / #ffffff | 2,99:1 | Não passa em nada, nem bordas nem ícones |
| #ffff00 / #ffffff | 1,07:1 | Quase invisível |
#777777 e #767676 parecem iguais, mas uma reprova e a outra passa: a fronteira é fina assim. O vermelho puro, comum em mensagens de erro, chega só a 3,99:1 sobre o branco, o bastante para um ícone ou texto grande, mas não para uma mensagem de erro em texto normal; um vermelho um pouco mais escuro, como #ee0000, chega a 4,53:1.
Por que 4,5:1
O W3C explica que 4,5:1 compensa a perda de sensibilidade ao contraste que costuma acompanhar uma visão de cerca de 20/40, comum com a idade, e 7:1, a de uma visão de cerca de 20/80. Um bom contraste também ajuda todo mundo: um celular no sol, uma tela barata, um projetor numa sala clara.
Formatos de cor e o que dizem sobre o contraste
#1a73e8, rgb(26 115 232), hsl(214 82% 51%) e oklch(57.4% 0.195 257.9) são o mesmo azul escrito de quatro formas. HEX e RGB dão diretamente as quantidades de vermelho, verde e azul; o HEX pode ganhar um quarto par para a transparência, como #1a73e880 para 50%. O HSL descreve matiz, saturação e luminosidade, mas essa luminosidade não é a que o olho vê: amarelo e azul com 50% de luminosidade HSL têm 96,8% e 45,2% de luminosidade OKLCH, e é por isso que o texto azul passa sobre o branco e o amarelo não.
O OKLCH, da CSS Color nível 4, foi feito para que passos iguais de luminosidade pareçam iguais, o que o torna o formato mais útil para montar uma paleta com contraste previsível. Os navegadores o suportam desde o Chrome e o Edge 111, o Firefox 113 e o Safari 15.4, e ele é Baseline amplamente disponível desde novembro de 2025. O contraste continua sendo calculado com a cor sRGB que é de fato exibida, então confira o par final num verificador de contraste.
Como corrigir uma cor que não passa
- Mantenha o matiz e mude a luminosidade: escureça o texto ou clareie o fundo até a razão passar. O verificador sugere a cor mais próxima que passa, no mesmo matiz.
- Confira todos os estados: hover, links visitados, textos de exemplo em que você confia, botões desativados que precisam ser notados e o modo escuro, que tem as mesmas exigências.
- Meça um texto sobre imagem ou degradê contra a área mais clara atrás dele, ou coloque o texto sobre um painel de cor sólida.
- Não dependa só da cor: o critério 1.4.1 da WCAG 2.2 pede outro sinal, como o sublinhado dos links ou um ícone e uma palavra nos erros.
Além da WCAG 2
Os rascunhos da WCAG 3 testaram outro método de contraste, muitas vezes chamado de APCA, que leva em conta o tamanho e o peso da fonte e trata de outra forma o texto claro sobre fundo escuro. É um rascunho, não uma norma, então auditorias e leis continuam usando a razão da WCAG 2. Na União Europeia, o Ato Europeu de Acessibilidade (Diretiva 2019/882) se aplica desde 28 de junho de 2025 a muitos produtos e serviços, entre eles o comércio eletrônico.
Perguntas frequentes
4,47:1 é quase 4,5:1?
Não. A razão não é arredondada, então 4,47:1 não atinge o mínimo de 4,5:1 para texto normal. Ela atende 3:1 para texto grande e gráficos.
O que conta como texto grande?
Pelo menos 18 pontos, cerca de 24 pixels CSS, ou 14 pontos em negrito, cerca de 18,5 pixels CSS.
Bordas e ícones precisam de contraste?
Sim, quando são necessários para entender ou usar a página: 3:1 em relação às cores ao lado. A borda de um campo de texto, uma caixa de seleção e o indicador de foco são exemplos.
O modo escuro muda as regras?
Não. As mesmas razões valem para qualquer esquema de cores, então confira também a paleta escura.
Mais contraste sempre lê melhor?
Até certo ponto. Um contraste muito alto, como branco puro sobre preto puro, pode incomodar alguns leitores; a partir de 7:1 a leitura é confortável para a maioria dos textos.
Referências
- W3C — Web Content Accessibility Guidelines (WCAG) 2.2, W3C Recommendation, 12 December 2024
- W3C WAI — Understanding Success Criterion 1.4.3: Contrast (Minimum)
- W3C WAI — Understanding Success Criterion 1.4.11: Non-text Contrast
- W3C — CSS Color Module Level 4
- Web platform features explorer — oklab() and oklch()
- Directive (EU) 2019/882 on the accessibility requirements for products and services (European Accessibility Act)
Guias relacionados
- Endereços IP explicados: IPv4, IPv6 e as faixas reservadas
- Sub-redes e CIDR explicados: prefixos, máscaras e hosts utilizáveis
- Registros DNS explicados: A, AAAA, CNAME, MX, TXT e NS
- Um site está fora do ar ou é só com você? Como verificar, passo a passo
- Códigos de status HTTP e erros da Cloudflare: o que significam 403, 404, 429, 500, 503 e 521
- Timestamps Unix e fusos horários explicados
- Contagem de datas: dias entre datas, anos bissextos e semanas ISO
- Fusos horários e horário de verão: reuniões entre cidades
- Formatos de imagem explicados: JPEG, PNG, WebP, AVIF e HEIC
- O tamanho de uma imagem explicado: pixels, DPI, peso e qualidade
- Fotos de celular explicadas: HEIC, metadados EXIF e sua privacidade
- Força de senhas explicada: comprimento, entropia e frases-senha
- Funções de hash explicadas: SHA-256, checksums e hash de senhas
- JSON Web Tokens explicados: claims, assinaturas e validação segura
- Chaves de API explicadas: tamanho, formato, armazenamento e rotação
- UUIDs explicados: v4, v7 e como escolher a versão certa
- QR codes explicados: capacidade, correção de erros e tamanho de impressão
- Porcentagens e IVA explicados: somar, tirar e acumular
- Erros comuns em JSON e como corrigi-los
- Arquivos CSV explicados: separadores, aspas, codificação e Excel
- Codificações de texto explicadas: UTF-8, Base64 e codificação de URL
- Expressões regulares: classes, quantificadores e grupos
- MB ou MiB, Mbps ou MB/s: tamanho de arquivos e velocidade
- Expressões cron explicadas: campos, passos e fusos horários
- Parâmetros UTM explicados: marcar links para a análise de tráfego
- Ponto de equilíbrio, margem e ROAS: os números de um pequeno negócio
- Preço de freelancer explicado: valor da hora, diária e horas faturáveis
- Edição de PDFs no navegador: o que se mantém ao juntar, dividir e converter