Por Que Acessibilidade Importa?
- 1.3 bilhões de pessoas com deficiência no mundo
- Leis como ADA, LGPD, EU Accessibility Act
- SEO – Google prioriza sites acessíveis
- Reputação – Marca inclusiva
- Mercado – P público que você está excluindo
WCAG 2.1 – Princípios
4 Princípios (POUR)
| Princípio | Descrição |
|---|---|
| Perceivable | Informações devem ser perceptíveis |
| Operable | Interface deve ser operável |
| Understandable | Informações e interface compreensíveis |
| Robust | Conteúdo deve funcionar com tecnologias assistivas |
Níveis de Conformidade
| Nível | Significado | Requisito |
|---|---|---|
| A | Básico | Mínimo, deve atender |
| AA | Padrão | Recomendado, maioria das leis |
| AAA | Avançado | Mais rigoroso, poucos достигают |
Ferramentas Automatizadas
axe-core
// Npm
npm install @axe-core/playwright
// Playwright integration
const { chromium } = require('playwright');
const AxeBuilder = require('@axe-core/playwright').default;
async function runAccessibilityTest() {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
const results = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag21aa'])
.analyze();
console.log('Violations:', results.violations.length);
results.violations.forEach(v => {
console.log(- ${v.id}: ${v.description});
});
await browser.close();
}
Lighthouse CI
# GitHub Actions- name: Lighthouse
uses: treosh/lighthouse-ci-action@v10
with:
urls: https://example.com
budgetPath: ./lighthouserc.json
uploadArtifacts: true
// lighthouserc.json
{
"ci": {
"collect": {
"settings": {
"staticDistDir": "./dist"
}
},
"assert": {
"assertions": {
"categories:accessibility": ["error", {"minScore": 0.9}],
"first-contentful-paint": ["warn", { "maxNumericValue": 2000 }],
"uses-passive-event-listeners": "off"
}
}
}
}
Testes Manuais
Checklist de Teclado
Navegação por Teclado
Essential
- [ ] Tab avança logicamente entre elementos
- [ ] Shift+Tab retorna ao elemento anterior
- [ ] Enter ativa botões e links
- [ ] Space ativa botões e checkboxes
- [ ] Escape fecha modais e dropdowns
- [ ] Setas navegam em menus
Skip Links
- [ ] Link "Skip to main content" existe
- [ ] Link é visível quando focado
- [ ] Link funciona corretamente
Focus Indicators
- [ ] Focus é sempre visível
- [ ] Estilo de focus não é apenas cor
- [ ] Focus não desaparece em nenhum elemento
Checklist de Screen Reader
Screen Reader Testing
Imagens
- [ ] Alt text em todas imagens informativas
- [ ] Alt text é descritivo e útil
- [ ] Imagens decorativas têm alt=""
- [ ] SVG complexos têm descriptions
Formulários
- [ ] Labels associados corretamente (for/id)
- [ ] Placeholder não substitui label
- [ ] Erros anunciados
- [ ] Required fields marcados
Heading Structure
- [ ] h1 é único na página
- [ ] Hierarquia lógica (h1 > h2 > h3)
- [ ] Sem saltos (h1 > h3, pulando h2)
- [ ] Headings não são só visuais
Links e Botões
- [ ] Links fazem sentido fora de contexto
- [ ] Botões descrevem ação
- [ ] Links novos/abrem em nova aba avisados
Implementando Acessibilidade
ARIA Basics
<div
role="dialog"
aria-labelledby="modal-title"
aria-describedby="modal-desc"
aria-modal="true"
>
Confirmação
Tem certeza que deseja excluir?
