Resumindo
- Contraste de cores é a diferença de brilho entre o texto e o fundo, medida como uma razão de 1:1 (nenhuma diferença) a 21:1 (preto sobre branco).
- O nível AA do WCAG 2 pede pelo menos 4,5:1 para texto normal e 3:1 para texto grande, que é cerca de 24 px regular ou 18,66 px em negrito.
- Ícones, bordas de campos e outras partes de uma interface que as pessoas precisam ver também precisam de pelo menos 3:1 em relação ao que as cerca.
- Sobre branco,
#767676é o cinza simples mais claro que passa em 4,5:1 para texto comum, e#777777falha por pouco. - Em um gradiente, o contraste muda de ponto a ponto, então você deve testar o pior ponto atrás das palavras, não a cor média.
Nesta página
O contraste de cores é a diferença de brilho entre o texto e a cor atrás dele, e decide se as pessoas conseguem ler suas palavras. As Diretrizes de Acessibilidade para Conteúdo Web (WCAG) o medem como uma razão de 1:1, quando as duas cores são idênticas, a 21:1, preto sobre branco. Para o nível AA, o texto normal precisa de pelo menos 4,5:1 e o texto grande de pelo menos 3:1. Todo o resto deste guia é sobre atingir esses números sem deixar seu design tímido.
O contraste importa para todo mundo, não só para quem tem baixa visão. Celulares sob o sol, projetores fracos, monitores baratos e olhos cansados diminuem a diferença entre as cores. Designs com contraste suficiente simplesmente são mais lidos.
As razões de contraste do WCAG em palavras simples
Três regras do WCAG 2 cobrem quase toda decisão de design. Elas vêm dos critérios de sucesso do W3C e são as que a maioria das auditorias de acessibilidade e das normas cita.
| O quê | Nível AA | Nível AAA | Observações |
|---|---|---|---|
| Texto normal | 4,5:1 | 7:1 | Texto corrido, legendas, rótulos, botões |
| Texto grande | 3:1 | 4,5:1 | Pelo menos 18 pt (cerca de 24 px), ou 14 pt em negrito (cerca de 18,66 px) |
| Ícones e partes da interface | 3:1 | 3:1 | Bordas de campos, linhas de gráficos que carregam significado, ícones sem rótulo |
| Logos e decoração | Nenhum | Nenhum | Logotipos de marca e texto puramente decorativo estão isentos |
Dois detalhes pegam as pessoas de surpresa. Primeiro, “grande” depende do tamanho renderizado, então um título de 24 px em um celular que o reduz pode deixar de contar como grande. Segundo, um botão desativado está isento, mas um texto de exemplo em cinza-claro que as pessoas precisam entender não está.
Como a razão de contraste é calculada
A razão compara a luminância relativa das duas cores: quanta luz cada uma emite, ponderada do jeito que o olho vê. O verde contribui mais, o vermelho menos e o azul muito pouco, e é por isso que um azul saturado pode ser surpreendentemente escuro e um amarelo, surpreendentemente claro. A fórmula é (L1 + 0.05) / (L2 + 0.05), em que L1 é a cor mais clara.
// WCAG 2 contrast ratio between two hex colours
const channel = (c) => {
c /= 255
return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4
}
const luminance = (hex) => {
const [r, g, b] = [1, 3, 5].map((i) => channel(parseInt(hex.slice(i, i + 2), 16)))
return 0.2126 * r + 0.7152 * g + 0.0722 * b
}
const contrast = (a, b) => {
const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x)
return (hi + 0.05) / (lo + 0.05)
}
contrast('#767676', '#ffffff') // 4.54, passes for body text
contrast('#777777', '#ffffff') // 4.48, failsVocê não precisa calcular à mão. O verificador de contraste da WebAIM recebe dois códigos hex e diz quais níveis passam, e o seletor de cor das ferramentas de desenvolvedor do Chrome mostra a razão de qualquer texto que você inspecionar.
Pares de cores que passam e que falham
As cores de marca costumam ficar no meio incômodo: escuras demais para texto escuro e claras demais para texto branco. Verdes, laranjas, rosas e azuis-claros médios são os suspeitos de sempre. Estas são combinações comuns, com as razões reais.
| Texto sobre fundo | Razão | Texto normal | Texto grande |
|---|---|---|---|
Branco sobre violeta #7c3aed | 5,7:1 | Passa | Passa |
Branco sobre violeta-claro #8b5cf6 | 4,2:1 | Falha | Passa |
Branco sobre azul #2563eb | 5,2:1 | Passa | Passa |
Branco sobre azul-céu #3b82f6 | 3,7:1 | Falha | Passa |
Branco sobre verde #10b981 | 2,5:1 | Falha | Falha |
Quase preto #0b0b10 sobre verde #10b981 | 7,7:1 | Passa | Passa |
Branco sobre âmbar #f59e0b | 2,2:1 | Falha | Falha |
Cinza #999999 sobre branco | 2,9:1 | Falha | Falha |
Cinza #6b7280 sobre branco | 4,8:1 | Passa | Passa |
Por que os gradientes dificultam o contraste
Um fundo liso tem uma única razão de contraste. Um gradiente tem uma diferente em cada ponto. Um texto branco que passa fácil sobre a ponta escura de uma mistura pode falhar por completo na ponta clara, e um título que se estende pelo gradiente passa e falha na mesma linha.
linear-gradient(90deg, #1f0b3a 0%, #7c3aed 55%, #f472b6 100%)A regra é simples: teste o ponto mais claro atrás de texto claro, ou o ponto mais escuro atrás de texto escuro. Se o pior ponto passa, a linha toda passa. Cores médias e amostras de conta-gotas tiradas do meio vão enganar você.
Como corrigir o contraste em um gradiente
- 1
Leve as palavras para a ponta calma
Coloque o texto sobre a parte mais escura ou mais clara do gradiente e deixe a transição brilhante acontecer longe dele.
- 2
Estreite a faixa atrás do texto
Mantenha a parte do gradiente que fica atrás das palavras dentro de uma faixa pequena de luminosidade. O resto da tela pode ser tão ousado quanto você quiser.
- 3
Adicione um véu suave
Um degradê suave, escuro ou claro, atrás do texto, como um gradiente de transparente a 30% de preto, aumenta o contraste sem uma caixa visível.
- 4
Vá maior e mais forte
O texto grande só precisa de 3:1. Um peso mais forte e um tamanho maior podem transformar uma linha que falha em uma que passa.
- 5
Teste em um celular de verdade
Confira o design com o brilho no máximo e com o brilho baixo, ao ar livre se puder. As razões são o piso, não o objetivo.
.card {
background: linear-gradient(90deg, #1f0b3a 0%, #7c3aed 55%, #f472b6 100%);
color: #ffffff;
}
/* A soft scrim keeps white text above 4.5:1 across the pink end */
.card .text {
background: linear-gradient(90deg, transparent 0%, rgb(31 11 58 / 0.55) 60%);
padding: 1rem 1.25rem;
}As palavras passam direto pela parte mais brilhante do campo e o contraste cai.
O mesmo design com a região calma e escura movida para trás das palavras.
Essa é a ideia por trás da legibilidade do Gradiently: um Mark sabe onde estão suas palavras, move sua região mais calma e de melhor contraste para trás delas e escolhe tinta clara ou escura por linha a partir da própria paleta. Para mais técnicas que funcionam em qualquer lugar, leia texto sobre gradiente e texto legível sobre fotos. Para interfaces escuras em particular, veja design para modo escuro.
Perguntas frequentes
Qual é uma boa razão de contraste de cores?
Pelo menos 4,5:1 para texto normal e 3:1 para texto grande atendem ao nível AA do WCAG. Para leituras longas, 7:1 (nível AAA) é mais confortável.
O que conta como texto grande no WCAG?
Texto de pelo menos 18 pontos, cerca de 24 px, ou de pelo menos 14 pontos em negrito, cerca de 18,66 px. O texto grande só precisa de 3:1 no nível AA.
Qual é o cinza mais claro que posso usar sobre branco?
#767676 é o cinza simples mais claro que atinge 4,5:1 sobre branco. #777777 mede 4,48:1 e falha para texto comum.
Os logos precisam cumprir os requisitos de contraste?
Não. O WCAG isenta o texto que faz parte de um logo ou nome de marca e o texto puramente decorativo. Tudo o que as pessoas precisam ler ou usar continua valendo.
Como confiro o contraste em um fundo de gradiente?
Meça a cor do texto contra o ponto mais claro atrás de texto claro, ou contra o mais escuro atrás de texto escuro. Se esse pior ponto passar, a linha toda passa.
Escrito pelo Gradiently
A equipe por trás do Gradiently, uma ferramenta de design criada em torno dos Marks: gradientes vivos que fazem tudo o que você cria ter a sua cara.
Ver nosso perfil


