Acessibilidade

Rácios de Contraste WCAG Explicados: Um Guia Prático para Designers

Pela Equipa do colorPaletteFinder10 min de leitura

Aqui está um número ao qual volto sempre: no relatório WebAIM Million de 2025, o texto de baixo contraste foi a falha de acessibilidade mais comum da web, presente em 79,1% das principais um milhão de páginas iniciais. Não foi texto alternativo em falta. Não foram botões sem etiqueta. Foi o contraste. O problema de acessibilidade mais detetado no mundo são duas cores demasiado parecidas, e quase todas as equipas que o lançam não fazem ideia de que o fizeram.

Eu próprio já lancei esse bug. Há anos construí um dashboard "premium" com um elegante texto cinzento #9CA3AF sobre branco, aprovado por toda a gente na sala porque parecia requintado num ecrã Retina novinho em folha, numa sala de reuniões às escuras. Uma semana depois chegou um ticket de suporte de um utilizador num comboio cheio de sol que literalmente não conseguia ler as etiquetas. O texto estava em cerca de 2,6:1. As WCAG pedem 4,5:1. Essa diferença é o assunto inteiro deste artigo.

O que é, de facto, um rácio de contraste WCAG

Um rácio de contraste WCAG é um único número que descreve quão diferentes são duas cores em luminosidade, expresso como um rácio de 1:1 a 21:1. Branco sobre branco é 1:1 (invisível). Preto puro sobre branco puro é 21:1 (o máximo). Tudo o que desenha vive algures no meio, e as WCAG definem o piso abaixo do qual não pode descer.

O crucial a interiorizar cedo: o contraste é sobre luminância, não sobre se as cores "parecem diferentes". O vermelho e o verde parecem extremamente diferentes para a maioria das pessoas, mas um vermelho saturado (#FF0000) sobre um verde saturado (#008000) situa-se em apenas cerca de 1,3:1 porque carregam quase a mesma luminosidade. Para uma pessoa com daltonismo vermelho-verde, ou para qualquer um que dê uma vista de olhos num ecrã de baixa qualidade, esse par é uma papa. O seu olho é enganado pelo tom; a fórmula de contraste não é.

A fórmula, em termos simples

O rácio é calculado como (L1 + 0.05) / (L2 + 0.05), onde L1 é a luminância relativa da cor mais clara e L2 é a luminância da mais escura. Quase nunca vai calcular isto à mão, mas compreender as duas fases diz-lhe por que razão os seus instintos o enganam.

Primeiro, a luminância relativa de cada cor obtém-se pegando nos seus canais de vermelho, verde e azul, "linearizando-os" (desfazendo a curva gama que os ecrãs aplicam, usando a regra de que os canais iguais ou inferiores a 0.03928 são divididos por 12.92, e os mais altos passam por ((c + 0.055) / 1.055) ^ 2.4), e depois ponderando-os: 0,2126 para o vermelho, 0,7152 para o verde e 0,0722 para o azul. Esses pesos não são arbitrários. Os olhos humanos são extraordinariamente sensíveis ao verde e quase cegos ao azul em comparação.

Esta é a conclusão mais útil de toda a matemática: o verde carrega cerca de dez vezes o brilho percebido do azul. É por isso que o texto azul puro sobre preto é doloroso e mal passa, enquanto a mesma "escuridão" de verde se lê bem. É por isso que as suas ligações azuis sobre um fundo escuro parecem fracas por mais saturadas que as torne. Se só se lembrar de uma coisa sobre a fórmula, lembre-se dos pesos.

O + 0.05 no rácio é uma constante que modela a luz ambiente a refletir-se no ecrã, de modo que mesmo pretos teoricamente perfeitos nunca produzem um rácio infinito. É a razão pela qual os rácios de contraste param em 21:1.

Os três limiares que tem de saber

As WCAG (as Diretrizes de Acessibilidade para Conteúdo Web, mantidas pelo W3C) definem um pequeno conjunto de números. Memorize estes e cobriu a grande maioria do trabalho real.

Repare no padrão: cada nível é mais ou menos o seguinte a subir. O grande-AA e o não textual partilham 3:1; o normal-AA e o grande-AAA partilham 4,5:1. É menos para decorar do que parece.

AA vs AAA: qual deve realmente?

O AA é a norma do mundo real. É o que o Ato Europeu de Acessibilidade, os acordos motivados pela ADA nos EUA, a Secção 508 e essencialmente todos os contratos de adjudicação referenciam. Quando um advogado ou auditor diz "em conformidade com as WCAG", refere-se ao AA. O AAA é o nível de ouro, e as próprias diretrizes dizem explicitamente que a conformidade AAA não é exigida como política geral para sites inteiros, em parte porque há conteúdo que simplesmente não consegue chegar a 7:1 sem parecer partido.

A minha opinião honesta após anos disto: desenhe o texto de corpo para ultrapassar o AA com conforto, e depois trate o AAA como um alvo que atinge para o conteúdo que mais importa — a coluna principal de leitura de um artigo, mensagens de erro, qualquer coisa que um utilizador stressado ou com baixa visão tenha de processar sob pressão. Perseguir os 7:1 em cada legenda e etiqueta desativada é uma batalha perdida que achata toda a sua paleta em preto-sobre-branco.

Texto normal vs texto grande — e a armadilha lá dentro

As WCAG aliviam o texto grande (3:1 em vez de 4,5:1) porque letras maiores e mais pesadas são legíveis com menos contraste. Mas a definição de "grande" é específica e as pessoas erram-na constantemente.

A conversão que tramou toda a gente é 1pt = 1,333px, razão pela qual 18pt se torna 24px e 14pt se torna ~18,5px. Por isso um cabeçalho regular de 19px não é texto grande pela definição das WCAG — continua a dever os 4,5:1 completos. Uma etiqueta negrito de 16px também não é grande. Já vi designs "passarem" na cabeça de alguém porque o cabeçalho "parecia grande", quando em píxeis se situava mesmo abaixo do limiar e precisava do rácio mais exigente. Na dúvida, mantenha o corpo e os subtítulos em 4,5:1 e só reclame o alívio de 3:1 para tipografia de exibição genuinamente grande.

Contraste não textual: o critério que toda a gente esquece (1.4.11)

É aqui que a maioria das equipas, de resto cuidadosas, falha. As WCAG 2.1 acrescentaram o Critério de Sucesso 1.4.11, Contraste Não Textual, exigindo 3:1 para duas categorias que nada têm a ver com leitura:

A violação clássica: um campo de pesquisa que é apenas uma caixa #FFFFFF com um contorno de 1px cinzento-claro #E5E7EB numa página branca. Esse contorno está em cerca de 1,2:1. Utilizadores com visão mas baixa acuidade literalmente não conseguem encontrar onde clicar. O texto de placeholder pálido e os contornos de botões fantasma falham da mesma forma. A decoração pura está isenta, tal como o texto dentro do componente (esse vive sob o 1.4.3 em vez deste) — mas a coisa que sinaliza "isto é interativo" tem de chegar a 3:1 contra o que quer que esteja ao seu lado.

Como medi-lo — e como corrigi-lo

Não se avalia o contraste a olho. Mede-se. O meu fluxo de trabalho do dia a dia:

Quando algo falha, resista à tentação de mexer no tom. Mudar a saturação quase não move o contraste; mudar a luminosidade move-o muito. Em concreto:

Os erros que vejo em equipas reais

Uma palavra sobre o futuro: as WCAG 3 estão a explorar um modelo percetual chamado APCA que julga o contraste mais como o olho humano, tendo em conta o tamanho e o peso do texto em conjunto em vez de um rácio fixo. É promissor e vale a pena seguir, mas, à data de hoje, os rácios deste artigo — apoiados pelo Understanding 1.4.3 do W3C — são o que o torna conforme do ponto de vista legal e prático. Construa para eles, deixe-se uma margem, e meça em vez de adivinhar. Os 79,1% de sites que falham falharam, na sua maioria, porque ninguém verificou. Verificar é o trabalho inteiro.

Perguntas Frequentes

Qual é o rácio de contraste WCAG mínimo para texto normal?

O texto de corpo normal precisa de um rácio de contraste de pelo menos 4,5:1 contra o seu fundo para cumprir o Nível AA das WCAG, que é a norma que a maioria das leis e contratos referencia. O texto grande (18pt/24px regular, ou 14pt/~18,5px a negrito) só precisa de 3:1. O nível mais exigente, o AAA, eleva o texto normal para 7:1 e o texto grande para 4,5:1.

Qual é a diferença entre contraste WCAG AA e AAA?

O AA é a norma prática e legalmente referenciada: 4,5:1 para texto normal e 3:1 para texto grande. O AAA é o nível reforçado para utilizadores com baixa visão: 7:1 para texto normal e 4,5:1 para texto grande. O W3C não exige AAA num site inteiro, por isso a maioria das equipas constrói o texto de corpo em AA com folga e reserva o AAA para o conteúdo de leitura mais crítico.

O que conta como texto grande segundo as WCAG?

Texto grande é 18pt e maior (24px) com peso normal, ou 14pt e maior (cerca de 18,5px) se for negrito. A conversão é 1pt = 1,333px. Um erro comum é assumir que um cabeçalho que apenas parece grande qualifica — um cabeçalho regular de 19px ou 20px continua abaixo dos 24px e tem de cumprir os 4,5:1 completos do texto normal.

As WCAG exigem contraste para botões e ícones, e não só para texto?

Sim. O Critério de Sucesso 1.4.11 (Contraste Não Textual), acrescentado nas WCAG 2.1, exige um rácio de 3:1 para os limites de componentes de UI que indicam estado — contornos de campos, anéis de foco, contornos de checkboxes — e para objetos gráficos como formas de ícones e elementos de gráficos necessários para os compreender. A decoração pura está isenta.

Como corrijo texto que falha na verificação de contraste?

Ajuste a luminosidade, não o tom nem a saturação — esses quase não movem o rácio. Escureça o primeiro plano ou clareie o fundo até ultrapassar o limiar; para texto claro num botão colorido, normalmente é mais rápido aprofundar a cor de fundo. Meça o resultado com um verificador de contraste em vez de o avaliar a olho, já que as diferenças de tom enganam o olho mas não a fórmula de luminância.

Quer experimentar com cores?

Experimente o nosso gerador de paletas de cores gratuito para encontrar a harmonia perfeita — com um verificador de contraste WCAG integrado.

Abrir o Gerador