Acessibilidade

Contraste e Cores

Garantindo contraste adequado e não dependendo apenas de cores.

Por que Contraste é Importante?

Contraste adequado entre texto e fundo é essencial para:

  • Legibilidade: Texto deve ser facilmente legível
  • Deficiência visual: Pessoas com baixa visão precisam de mais contraste
  • Condições de iluminação: Funciona em diferentes ambientes
  • Conformidade WCAG: Requisito para níveis AA e AAA

Requisitos de Contraste WCAG

Nível AA (Recomendado)

  • Texto normal (menor que 18pt ou 14pt bold): Contraste mínimo de 4.5:1
  • Texto grande (18pt+ ou 14pt+ bold): Contraste mínimo de 3:1
  • Componentes de UI: Contraste mínimo de 3:1 para elementos interativos

Nível AAA (Alto)

  • Texto normal: Contraste mínimo de 7:1
  • Texto grande: Contraste mínimo de 4.5:1

Calculando Contraste

Fórmula de Contraste

Contraste = (L1 + 0.05) / (L2 + 0.05)

Onde:

  • L1 = Luminância relativa da cor mais clara
  • L2 = Luminância relativa da cor mais escura

Ferramentas para Verificar

Exemplos de Contraste

✅ Bom Contraste

/* Texto escuro em fundo claro - 4.5:1+ */
.texto-escuro {
  color: #000000; /* Preto */
  background: #ffffff; /* Branco */
  /* Contraste: 21:1 */
}

/* Texto claro em fundo escuro - 4.5:1+ */
.texto-claro {
  color: #ffffff; /* Branco */
  background: #1a1a1a; /* Cinza escuro */
  /* Contraste: 12.6:1 */
}

❌ Contraste Insuficiente

/* Texto cinza claro em fundo branco - menos de 4.5:1 */
.texto-ruim {
  color: #cccccc; /* Cinza claro */
  background: #ffffff; /* Branco */
  /* Contraste: 1.6:1 - MUITO BAIXO */
}

Cores e Estados

Não Dependa Apenas de Cor

<!-- ❌ Ruim - apenas cor indica erro -->
<span style="color: red;">Campo obrigatório</span>

<!-- ✅ Bom - cor + ícone + texto -->
<span style="color: red;">
  <span aria-hidden="true">⚠️</span>
  <strong>Campo obrigatório</strong>
</span>

Estados de Formulário

<!-- ✅ Bom - múltiplos indicadores -->
<label>
  Email
  <input 
    type="email" 
    aria-invalid="true"
    aria-describedby="email-error"
    class="input-error">
  <span id="email-error" class="error-message">
    <span aria-hidden="true">⚠️</span>
    Email inválido
  </span>
</label>
.input-error {
  border: 2px solid #d32f2f; /* Vermelho */
  background-color: #ffebee; /* Vermelho claro */
}

.error-message {
  color: #d32f2f;
  font-weight: bold;
}
/* Link normal */
a {
  color: #0066cc; /* Azul com bom contraste */
  text-decoration: underline;
}

/* Link visitado */
a:visited {
  color: #551a8b; /* Roxo com bom contraste */
}

/* Link com foco */
a:focus {
  outline: 2px solid #0066cc;
  outline-offset: 2px;
}

Estados de Hover e Focus

button {
  background: #0066cc;
  color: #ffffff;
  border: 2px solid #0066cc;
}

button:hover {
  background: #0052a3; /* Mais escuro */
}

button:focus {
  outline: 3px solid #ffcc00; /* Amarelo com bom contraste */
  outline-offset: 2px;
}

button:active {
  background: #003d7a; /* Ainda mais escuro */
}

Modo Escuro e Alto Contraste

Suporte a Modo Escuro

/* Tema claro (padrão) */
:root {
  --bg-color: #ffffff;
  --text-color: #000000;
  --link-color: #0066cc;
}

/* Tema escuro */
@media (prefers-color-scheme: dark) {
  :root {
    --bg-color: #1a1a1a;
    --text-color: #ffffff;
    --link-color: #4da6ff; /* Azul mais claro para contraste */
  }
}

body {
  background: var(--bg-color);
  color: var(--text-color);
}

Modo Alto Contraste

/* Respeitar preferências de alto contraste */
@media (prefers-contrast: high) {
  body {
    background: #000000;
    color: #ffffff;
  }
  
  a {
    color: #ffff00; /* Amarelo para máximo contraste */
    text-decoration: underline;
  }
}

Gráficos e Dados

Gráficos Acessíveis

<!-- ✅ Bom - não depende apenas de cor -->
<svg>
  <rect fill="#0066cc" aria-label="Q1: 100 vendas">
    <title>Q1: 100 vendas</title>
  </rect>
  <rect fill="#ff6b6b" aria-label="Q2: 150 vendas">
    <title>Q2: 150 vendas</title>
  </rect>
  <!-- Padrões diferentes para cada barra -->
</svg>

Tabelas com Contraste

<table>
  <thead>
    <tr>
      <th style="background: #333; color: #fff;">Produto</th>
      <th style="background: #333; color: #fff;">Vendas</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Produto A</td>
      <td>100</td>
    </tr>
  </tbody>
</table>

Boas Práticas

1. Teste Regularmente

Use ferramentas para verificar contraste durante o desenvolvimento.

2. Considere Contexto

Contraste necessário pode variar dependendo do contexto e tamanho do texto.

3. Múltiplos Indicadores

Use cor, ícones, texto e padrões para transmitir informação.

4. Respeite Preferências

Suporte modo escuro e alto contraste quando possível.

5. Teste com Usuários

Teste com pessoas que têm deficiência visual para feedback real.

Ferramentas e Recursos

  • WebAIM Contrast Checker: https://webaim.org/resources/contrastchecker/
  • Colour Contrast Analyser: Aplicativo desktop
  • Chrome DevTools: Inspecione contraste de elementos
  • Lighthouse: Auditoria automática de contraste
  • axe DevTools: Detecta problemas de contraste
Lembre-se: contraste adequado beneficia todos os usuários, não apenas pessoas com deficiência visual. Texto com bom contraste é mais fácil de ler em qualquer condição.