Cor

Contraste de cores: texto legível para todos

Contraste é a diferença entre palavras que as pessoas leem e palavras que elas pulam. Os números do WCAG em português claro, como conferi-los e o que muda quando o fundo é um gradiente.

GradientlyConta verificada do Gradiently··6 min de leitura
Capa: Andes Mirror · GR·WVR2·V3

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 #777777 falha 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 AANível AAAObservações
Texto normal4,5:17:1Texto corrido, legendas, rótulos, botões
Texto grande3:14,5:1Pelo menos 18 pt (cerca de 24 px), ou 14 pt em negrito (cerca de 18,66 px)
Ícones e partes da interface3:13:1Bordas de campos, linhas de gráficos que carregam significado, ícones sem rótulo
Logos e decoraçãoNenhumNenhumLogotipos de marca e texto puramente decorativo estão isentos
O nível AA é o alvo habitual. O AAA é mais rigoroso e vale a pena em leituras longas.

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.

js
// 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, fails
O cálculo inteiro cabe em uma dúzia de linhas. Útil para conferir uma paleta de marca em lote.

Você 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 fundoRazãoTexto normalTexto grande
Branco sobre violeta #7c3aed5,7:1PassaPassa
Branco sobre violeta-claro #8b5cf64,2:1FalhaPassa
Branco sobre azul #2563eb5,2:1PassaPassa
Branco sobre azul-céu #3b82f63,7:1FalhaPassa
Branco sobre verde #10b9812,5:1FalhaFalha
Quase preto #0b0b10 sobre verde #10b9817,7:1PassaPassa
Branco sobre âmbar #f59e0b2,2:1FalhaFalha
Cinza #999999 sobre branco2,9:1FalhaFalha
Cinza #6b7280 sobre branco4,8:1PassaPassa
Uma pequena mudança pode decidir: dois azuis que parecem quase iguais caem em lados opostos de 4,5:1.

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.

Meia-noite, violeta e rosalinear-gradient(90deg, #1f0b3a 0%, #7c3aed 55%, #f472b6 100%)
O texto branco marca 18:1 à esquerda, 5,7:1 sobre o violeta e 2,7:1 na ponta rosa. Um gradiente, três veredictos.

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. 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. 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. 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. 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. 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.

css
.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;
}
O véu escurece só onde o gradiente clareia, então o lado esquerdo fica intacto.

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.

Compartilhar este guia

Escrito pelo GradientlyConta verificada do 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
Todos os guias de Cor