⚡ Curso de HTML • Web-ZoneWare

Acessibilidade Web & WCAG no HTML: Guia | Web Academy

Lição 45 de 50

Acessibilidade Web & WCAG no HTML: Guia | Web Academy

A Acessibilidade Web (frequentemente abreviada como a11y — onde o número 11 representa a quantidade de letras entre o ‘a’ e o ‘y’) é a disciplina que assegura que qualquer pessoa, independentemente de suas capacidades visuais, auditivas, motoras ou cognitivas, consiga navegar, compreender e interagir com um site de forma autônoma. O HTML não é apenas uma linguagem de formatação visual; ele é a base fundamental que alimenta a Árvore de Acessibilidade (Accessibility Tree) utilizada por leitores de tela como NVDA, JAWS, TalkBack e VoiceOver.

1. As Diretrizes da WCAG e os 4 Princípios do POUR

O padrão mundial de conformidade é regido pelas WCAG (Web Content Accessibility Guidelines), mantidas pelo W3C. A especificação divide todos os requisitos de acessibilidade em quatro princípios essenciais:

Princípio Significado no HTML Exemplo Prático
P – Perceptível A informação não pode depender de um único sentido sensorial. Atributos alt em imagens, legendas em vídeos e contraste de cores adequado.
O – Operável Todos os componentes devem ser manipuláveis por qualquer dispositivo de entrada. Navegação 100% funcional por teclado (Tab/Enter/Espaço) e links para pular conteúdo.
U – Compreensível A navegação e a linguagem textual devem ser intuitivas e previsíveis. Definição do atributo lang="pt-BR" e rótulos claros em campos de formulário.
R – Robusto O código deve ser limpo e válido para ser interpretado por diferentes tecnologias assistivas. HTML semântico e ausência de tags mal fechadas ou IDs duplicados na página.

2. A Primeira Regra do WAI-ARIA

O WAI-ARIA (Accessible Rich Internet Applications) é uma especificação técnica que adiciona atributos especiais ao HTML para descrever o estado e a função de componentes interativos complexos (como abas, modais e accordions).

No entanto, a própria documentação oficial do W3C estipula a Primeira Regra de Ouro do ARIA:

💡 “Se existe um elemento HTML nativo que já faz o trabalho, NUNCA use ARIA!”

❌ PÉSSIMA PRÁTICA:
<div class="meu-botao" role="button" tabindex="0" onclick="salvar()">Salvar</div>
Você precisará programar manualmente suporte ao teclado (Enter/Espaço), estados de foco e gerenciamento de acessibilidade.

✅ EXCELÊNCIA NATIVA:
<button type="button" onclick="salvar()">Salvar</button>
A tag nativa <button> já é acessível, responde à tecla Tab e anuncia seu papel ao leitor de tela automaticamente!

3. Catálogo dos Atributos ARIA Mais Importantes

Quando elementos nativos não forem suficientes para descrever estados dinâmicos via JavaScript, utilize estes atributos complementares:

Atributo Sintaxe Finalidade
aria-label aria-label="Fechar Janela" Fornece um rótulo audível para botões que contêm apenas ícones gráficos (como um ‘X’ ou uma lupa).
aria-labelledby aria-labelledby="idDoTitulo" Associa a descrição do elemento ao texto de outro cabeçalho existente na página.
aria-describedby aria-describedby="idDaDica" Vincula um campo de formulário ao seu texto explicativo ou mensagem de erro.
aria-hidden="true" aria-hidden="true" Oculta elementos puramente decorativos (como ícones de enfeite) para não poluir o leitor de tela.
aria-expanded aria-expanded="false" Informa ao usuário de teclado se um menu retrátil ou acordeão está aberto (true) ou fechado (false).
aria-live aria-live="polite" Anuncia mensagens dinâmicas atualizadas por script (como alertas ou confirmações em AJAX).

Usuários com limitações motoras ou pessoas cegas navegam exclusivamente utilizando a tecla Tab (para avançar), Shift + Tab (para retroceder) e Enter/Espaço (para acionar).

O Papel do Atributo tabindex:

  • tabindex="0": Insere um elemento na ordem sequencial natural de navegação por teclado.
  • tabindex="-1": Remove o elemento da ordem do Tab, mas permite que ele receba foco programático via JavaScript (elemento.focus()).
  • ⚠️ Valores Positivos (tabindex="1", tabindex="2"): SÃO PROIBIDOS! Eles quebram a ordem de leitura lógica e criam uma experiência confusa e desconexa.

Em sites com menus extensos com dezenas de links, ter que pressionar Tab 30 vezes em todas as páginas para chegar ao texto é exaustivo. O Skip Link é o primeiro elemento do HTML: ele fica invisível na tela e só surge quando recebe o foco do teclado:

HTML5 12 linhas
<!-- Primeiro elemento do <body> -->
<a href="#conteudo-principal" class="skip-link">Saltar para o Conteúdo Principal →</a>
 
<header>
    <nav>
        <!-- Dezenas de links de navegação... -->
    </nav>
</header>
 
<main id="conteudo-principal" tabindex="-1">
    <!-- Conteúdo útil da página começa aqui -->
</main>
CSS3 18 linhas
/* Skip Link com foco visível */
.skip-link {
    position: absolute;
    top: -100px;
    left: 10px;
    background-color: #38bdf8;
    color: #0f172a;
    padding: 12px 20px;
    font-weight: 700;
    text-decoration: none;
    border-radius: 4px;
    z-index: 9999;
    transition: top 0.2s ease;
}
 
.skip-link:focus {
    top: 10px; /* Aparece no topo da página quando o usuário aperta Tab! */
}

5. Código Prático Completo: Componente de Menu e Formulário Acessíveis

Abaixo reunimos a implementação de um botão retrátil com estados ARIA e um campo de formulário com instrução vinculada:

HTML5 25 linhas
<div class="wzw-a11y-demo">
    <h3>♿ Demonstração de Padrões Acessíveis</h3>
 
    <!-- 1. Botão Retrátil com aria-expanded -->
    <button id="btnMenu" class="btn-accessible" aria-expanded="false" aria-controls="painelFaq">
        <span>Como funciona a certificação da Web Academy?</span>
        <span id="iconeSeta" aria-hidden="true">▼</span>
    </button>
 
    <div id="painelFaq" class="faq-content" hidden>
        <p>Ao concluir as 50 lições e o projeto prático final, você receberá um certificado digital autenticado com carga horária completa.</p>
    </div>
 
    <!-- 2. Formulário com aria-describedby e foco visível -->
    <div class="form-block">
        <label for="senhaAcesso">Senha de Acesso:</label>
        <input 
            type="password" 
            id="senhaAcesso" 
            name="senha" 
            aria-describedby="dicaSenha" 
            required>
        <small id="dicaSenha" class="hint-text">Mínimo de 8 caracteres contendo ao menos uma letra maiúscula e um número.</small>
    </div>
</div>
CSS3 67 linhas
.wzw-a11y-demo {
    max-width: 580px;
    padding: 24px;
    background-color: #0f172a;
    border: 1px solid #1e293b;
    border-radius: 8px;
    color: #f8fafc;
}
 
.btn-accessible {
    width: 100%;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 14px 18px;
    background-color: #1e293b;
    color: #f8fafc;
    border: 1px solid #334155;
    border-radius: 6px;
    font-size: 1rem;
    font-weight: 600;
    cursor: pointer;
    text-align: left;
}
 
/* Indicador de Foco Acessível (NUNCA faça outline: none sem substituto!) */
.btn-accessible:focus-visible,
input:focus-visible {
    outline: 3px solid #38bdf8;
    outline-offset: 3px;
}
 
.faq-content {
    padding: 16px;
    background-color: #0b1120;
    border: 1px solid #1e293b;
    border-top: none;
    border-radius: 0 0 6px 6px;
    font-size: 0.95rem;
    color: #cbd5e1;
}
 
.form-block {
    margin-top: 24px;
}
 
.form-block label {
    display: block;
    margin-bottom: 6px;
    font-weight: 600;
}
 
.form-block input {
    width: 100%;
    padding: 10px 14px;
    background-color: #1e293b;
    border: 1px solid #334155;
    border-radius: 6px;
    color: #fff;
}
 
.hint-text {
    display: block;
    margin-top: 6px;
    color: #94a3b8;
    font-size: 0.85rem;
}
JavaScript 12 linhas
const btnFaq = document.getElementById('btnMenu');
const painel = document.getElementById('painelFaq');
const seta = document.getElementById('iconeSeta');
 
btnFaq.addEventListener('click', () => {
    const estaExpandido = btnFaq.getAttribute('aria-expanded') === 'true';
    
    // Inverte o estado acessível
    btnFaq.setAttribute('aria-expanded', !estaExpandido);
    painel.hidden = estaExpandido;
    seta.textContent = estaExpandido ? '▼' : '▲';
});
🧪 Quer navegar por teclado e testar os atributos ARIA agora?
⚡ Abrir no Playground IDE →

6. Ferramentas Relacionadas & Próximos Passos

Valide a conformidade do seu código com as ferramentas e lições complementares:

7. Referências Técnicas & Especificações Oficiais


Rolar para cima