A acessibilidade por teclado é um dos aspectos mais críticos — e mais negligenciados — da acessibilidade na web, com estudos mostrando que 85% dos sites ainda falham em fornecer uma navegação por teclado adequada. Este guia aborda os requisitos do WCAG, padrões comuns de falha e técnicas práticas em nível de código para ajudar desenvolvedores e responsáveis por conformidade a criar experiências verdadeiramente navegáveis por teclado.
Imagine tentar preencher uma candidatura de emprego, marcar uma consulta médica ou concluir uma compra online — e o seu mouse não funciona. Não está quebrado, só é irrelevante: você navega inteiramente pressionando Tab, Enter e as teclas de seta. Para milhões de pessoas no mundo todo, isso não é um experimento mental. Pessoas com deficiências motoras, lesões por esforço repetitivo, deficiências visuais e aquelas que dependem de leitores de tela contam com a navegação por teclado como sua principal interface com a web. Ainda assim, pesquisas mostram de forma consistente que 85% dos sites não oferecem navegação por teclado adequada, excluindo esses usuários de tarefas digitais básicas todos os dias. Se o seu site está nessa maioria, este guia é para você.
Quem Depende da Navegação por Teclado — e Por Que Isso Importa Mais do Que Você Pensa
A acessibilidade por teclado não é uma preocupação de nicho para uma pequena parcela de usuários. A população que depende dela é mais ampla e variada do que a maioria dos desenvolvedores imagina. Pessoas com deficiências físicas que não podem usar um mouse, pessoas cegas que não conseguem ver o ponteiro do mouse na tela e pessoas com condições crônicas como lesões por esforço repetitivo, que devem limitar o uso do mouse, todas dependem da navegação por teclado como seu portal para a web. Além da deficiência, muitos usuários avançados — desenvolvedores, redatores, profissionais de digitação de dados — preferem atalhos de teclado pela velocidade e eficiência.
Usuários de leitores de tela representam outro grupo importante. Leitores de tela interpretam e anunciam elementos da página com base no foco e na estrutura semântica, e os usuários navegam pelo conteúdo com pressionamentos de tecla. Se um site não mantém o foco do teclado ou não oferece uma ordem de foco lógica, a navegação com leitor de tela entra em colapso por completo. Softwares de reconhecimento de voz como Dragon NaturallySpeaking também geram eventos de teclado, o que significa que um suporte ruim ao teclado também quebra a navegação controlada por voz.
O argumento de negócios é igualmente convincente. De acordo com dados disponíveis, pessoas com deficiência nos EUA detêm quase meio trilhão de dólares em renda disponível. Quando o seu site não é acessível por teclado, você está ativamente afastando uma parte significativa desse mercado. A exposição legal também é real: a acessibilidade por teclado é essencial para conformidade com as WCAG, que são a referência para cumprimento da ADA, da Section 508, do European Accessibility Act e da EN 301 549 globalmente. Somente os “keyboard traps” — quando um usuário fica preso dentro de um elemento da página sem saída — são citados como falhas claras de WCAG que já apareceram em processos judiciais sobre acessibilidade.
Talvez o mais revelador: 71% dos usuários com deficiência simplesmente abandonarão um site que consideram difícil de usar. Eles não reclamam. Eles vão embora. E como os problemas de acessibilidade por teclado tendem a se concentrar nos pontos de interação mais críticos — formulários, modais, menus de navegação e fluxos de checkout — o impacto recai diretamente sobre suas taxas de conversão.
O Framework WCAG: O Que as Regras Realmente Exigem
As Web Content Accessibility Guidelines (WCAG) organizam os requisitos de teclado principalmente sob a Diretriz 2.1 — “Tornar toda a funcionalidade disponível a partir de um teclado”. Entender o que é e o que não é exigido é o primeiro passo rumo à conformidade. A WCAG 2.2, que se tornou o padrão oficial do W3C em 5 de outubro de 2023 e adicionou nove novos critérios de sucesso ao framework existente, é agora o padrão recomendado para ADA, Section 508 e o European Accessibility Act.
Os principais critérios de sucesso relacionados ao teclado que você precisa conhecer são:
- SC 2.1.1 Keyboard (Nível A): Toda funcionalidade deve ser operável por meio de uma interface de teclado sem exigir temporização específica para pressionamentos individuais de tecla, exceto quando a função subjacente exigir entrada dependente de trajetória (como desenho à mão livre). Este é o básico — todo elemento interativo deve ser alcançável e operável por teclado.
- SC 2.1.2 No Keyboard Trap (Nível A): Se o foco do teclado puder ser movido para um componente usando o teclado, o foco também deve poder ser movido para fora usando apenas o teclado. Se for necessário um método não padrão para sair, os usuários devem ser informados. Keyboard traps são um bloqueio absoluto para usuários de teclado.
- SC 2.4.3 Focus Order (Nível A): Se uma página da web puder ser navegada sequencialmente, a ordem de foco deve preservar o significado e a operabilidade. Uma ordem de tabulação lógica e previsível é inegociável.
- SC 2.4.7 Focus Visible (Nível AA): Qualquer interface de usuário operável por teclado deve ter um modo em que o indicador de foco do teclado seja visível. Os usuários devem sempre conseguir ver onde estão na página.
- SC 2.4.11 Focus Not Obscured (Minimum) (Nível AA — novo na WCAG 2.2): Quando um elemento focável por teclado recebe foco, ele não deve ficar completamente oculto por conteúdo criado pelo autor, como cabeçalhos fixos ou banners de cookies.
- SC 2.4.12 Focus Not Obscured (Enhanced) (Nível AAA): Uma versão mais rígida que exige que nenhuma parte do componente em foco fique oculta por conteúdo criado pelo autor.
- SC 2.5.8 Target Size (Minimum) (Nível AA — novo na WCAG 2.2): Alvos interativos devem ter pelo menos 24x24 pixels CSS, reduzindo erros para usuários com controle motor limitado.
- SC 2.5.7 Dragging Movements (Nível AA — novo na WCAG 2.2): Qualquer funcionalidade que exija arrastar deve ter uma alternativa de ponteiro único — o que, por extensão, beneficia usuários de teclado que não conseguem realizar operações de arrastar.
A WCAG 2.2 é totalmente compatível com versões anteriores da WCAG 2.1 — ela adiciona critérios, mas não remove nenhum (exceto o agora obsoleto 4.1.1 Parsing). Se o seu site já atende à WCAG 2.1 AA, você só precisa implementar os seis novos critérios de Nível AA. Para acessibilidade por teclado especificamente, a grande novidade é garantir que elementos em foco nunca fiquem totalmente encobertos por elementos fixos da página — um problema comum no mundo real que a WCAG 2.1 não abordava explicitamente.
O princípio das WCAG é simples de enunciar, exigente de implementar: se toda a funcionalidade puder ser realizada usando o teclado, ela poderá ser executada por usuários de teclado, entrada por voz, teclados na tela e uma grande variedade de tecnologias assistivas que geram pressionamentos de tecla simulados. Nenhuma outra forma de entrada tem essa flexibilidade ou é universalmente suportada.
As Falhas de Acessibilidade por Teclado Mais Comuns (e o Que as Causa)
Auditorias manuais revelam de forma consistente que problemas de acessibilidade por teclado estão entre as barreiras de acessibilidade mais comuns e disruptivas na web. Em um estudo em larga escala, 54% das páginas com formulários apresentavam problemas de acessibilidade por teclado afetando ações críticas do usuário, como tabular entre campos de formulário, fechar janelas pop-up ou pressionar botões de Enviar. Testadores eram frequentemente forçados a abandonar carrinhos de compra ou atualizar páginas depois de ficarem presos em elementos que não conseguiam controlar apenas com o teclado.
As causas raízes se agrupam em alguns padrões recorrentes que valem ser examinados em detalhe.
1. Manipuladores de evento apenas para mouse. Usar onmouseover, onmouseout ou onclick em elementos <div> sem manipuladores de evento equivalentes para teclado é uma das falhas mais comuns. Um <div> com um manipulador de clique não é um botão — ele não tem função de teclado implícita, não recebe foco via Tab e não responde a Enter ou Espaço. Atribuir role='button' via ARIA ajuda leitores de tela, mas ainda exige que você adicione manualmente tabindex='0', manipuladores onkeydown e onkeyup. A correção certa quase sempre é usar um elemento <button> de verdade.
2. Supressão de contornos de foco. Um dos problemas mais disseminados é a regra CSS outline: none ou outline: 0 aplicada globalmente ou a elementos em foco. Designers frequentemente removem o anel de foco padrão do navegador porque ele parece pouco atraente em certos temas. O resultado é que usuários de teclado não têm ideia de onde estão na página. Isso é uma violação direta da WCAG SC 2.4.7 e um dos problemas mais fáceis de criar — e de corrigir.
3. Keyboard traps em modais, widgets e iframes. Caixas de diálogo modais que não restringem o foco corretamente permitem que o Tab avance além do modal para conteúdo de fundo oculto, tornando o modal impossível de ser dispensado via teclado. Widgets de terceiros — ferramentas de chat, players de vídeo, seletores de data, embeds de mapa — são especialmente propensos a isso porque o tratamento interno de teclado deles é opaco para você.
4. Ordem de tabulação ilógica. A ordem padrão de navegação por teclado é determinada pela ordem do DOM. Quando desenvolvedores usam CSS Grid, Flexbox ou posicionamento CSS para reordenar a apresentação visual independentemente da ordem no DOM, o foco de Tab salta pela tela de maneiras completamente desconectadas do layout visual. Valores positivos de tabindex (por exemplo, tabindex='2') usados para forçar uma ordem específica tornam esse problema significativamente pior na maioria dos casos reais.
5. Menus suspensos apenas em hover. Menus de navegação que abrem apenas ao passar o mouse, sem gatilho de teclado, deixam usuários de teclado abandonados. Esse é um padrão extremamente comum em menus suspensos apenas com CSS, em que submenus aparecem em :hover mas nunca são expostos à navegação baseada em foco.
6. Foco não retornado após interações dinâmicas. Quando um modal, gaveta ou flyout é fechado, o foco deve retornar ao elemento que o acionou. Se isso não acontecer — se ele for parar no topo da página ou desaparecer em um local indeterminado — o usuário fica completamente perdido. Aplicações dinâmicas de página única são particularmente vulneráveis a isso.
Construindo Acessibilidade por Teclado da Maneira Certa: Implementação Prática
Com os padrões de falha em mente, veja como é a implementação correta nas áreas mais importantes de um site típico.
Use HTML Semântico Primeiro
Elementos nativos de HTML são acessíveis por teclado por padrão. Links (<a href>), botões (<button>), campos de formulário, selects e textareas participam da ordem de tabulação, respondem a pressionamentos de tecla padrão e comunicam seu papel para tecnologias assistivas — tudo isso sem uma linha extra de JavaScript. Um elemento <button> automaticamente tem o papel correto, é acessível por teclado, responde a Enter e Espaço e tem gerenciamento de foco adequado embutido. Adicionar role='button' a um <div> fornece o papel correto, mas ainda exige que você implemente manualmente o suporte a teclado e o gerenciamento de foco. Sempre prefira HTML semântico.
<!-- Evite: div não semântico fingindo ser um botão -->
<div onclick='doSomething()' class='btn'>Submit</div>
<!-- Correto: elemento button nativo -->
<button type='button' onclick='doSomething()'>Submit</button>
Corrija Seus Indicadores de Foco
Em vez de remover o contorno padrão do navegador, substitua-o por um indicador de foco personalizado estilizado. A WCAG 2.2 SC 2.4.11 exige que a área do indicador de foco seja pelo menos tão grande quanto um perímetro de 2 pixels CSS de espessura do componente sem foco, com uma taxa de contraste de pelo menos 3:1 entre os estados com e sem foco. Use a pseudo-classe :focus-visible em vez de :focus para mostrar indicadores de foco apenas para usuários de teclado, sem afetar a estética da interação com mouse.
/* Remova o padrão apenas para substituí-lo por um indicador melhor */
*:focus {
outline: none;
}
*:focus-visible {
outline: 3px solid #005fcc;
outline-offset: 3px;
border-radius: 2px;
}
Essa abordagem oferece controle visual completo enquanto mantém a conformidade com as WCAG. Garanta que a cor do foco tenha contraste suficiente tanto em relação ao plano de fundo quanto ao próprio componente, especialmente em sites com tema escuro ou sobre imagens.
Gerencie o Foco em Interações Dinâmicas
Quando o conteúdo muda dinamicamente — ao abrir um modal, carregar novo conteúdo, remover um elemento — você deve gerenciar o foco programaticamente. Ao abrir um modal, mova o foco para o primeiro elemento focável dentro dele. Ao fechar, retorne o foco ao elemento que o acionou. Use o método .focus() do JavaScript para isso. Para prender o foco corretamente dentro de um modal, intercepte eventos de tecla Tab e Shift+Tab e faça o foco circular entre o primeiro e o último elementos focáveis dentro da caixa de diálogo.
// Abrindo um modal: mover o foco para dentro
function openModal(modalEl, triggerEl) {
modalEl.removeAttribute('hidden');
const firstFocusable = modalEl.querySelector(
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
);
if (firstFocusable) firstFocusable.focus();
}
// Fechando um modal: retornar o foco ao gatilho
function closeModal(modalEl, triggerEl) {
modalEl.setAttribute('hidden', '');
triggerEl.focus();
}
Implemente Links de Pular Navegação
Usuários de teclado precisam pressionar Tab para navegar por todos os elementos interativos antes do conteúdo principal — cabeçalhos, menus de navegação, barras de busca — em cada carregamento de página. Links de pular navegação são a solução: um link visualmente oculto no topo da página que se torna visível ao receber foco e leva os usuários diretamente à área de conteúdo principal. Eles são um requisito de Nível A das WCAG e um dos ganhos rápidos mais impactantes disponíveis.
<!-- Coloque como o primeiro elemento em <body> -->
<a href='#main-content' class='skip-link'>Skip to main content</a>
<!-- Âncora de destino no contêiner de conteúdo principal -->
<main id='main-content' tabindex='-1'>
<!-- page content -->
</main>
/* Mostrar o link de pular apenas com foco de teclado */
.skip-link {
position: absolute;
top: -40px;
left: 0;
background: #000;
color: #fff;
padding: 8px 16px;
z-index: 100;
transition: top 0.2s;
}
.skip-link:focus {
top: 0;
}
Construa Menus de Navegação Acessíveis
Menus de navegação com submenus suspensos exigem atenção cuidadosa. O padrão correto de interação por teclado para um menu de navegação é: Tab move entre itens de nível superior; Enter ou Espaço abre um submenu; teclas de seta navegam dentro do submenu; e Escape fecha o submenu e retorna o foco ao gatilho. Use atributos ARIA para comunicar o estado. Menus que abrem apenas em hover, sem gatilho de teclado, são inacessíveis e precisam ser corrigidos.
<nav aria-label='Main navigation'>
<ul role='menubar'>
<li role='none'>
<button
aria-haspopup='true'
aria-expanded='false'
aria-controls='products-menu'>
Products
</button>
<ul role='menu' id='products-menu' hidden>
<li role='none'>
<a role='menuitem' href='/software'>Software</a>
</li>
<li role='none'>
<a role='menuitem' href='/hardware'>Hardware</a>
</li>
</ul>
</li>
</ul>
</nav>
Use aria-expanded='false' e aria-expanded='true' alternados via JavaScript para comunicar o estado aberto/fechado. Use aria-haspopup='true' para sinalizar que ativar o botão revela um submenu. Garanta que a tecla Escape feche o submenu e retorne o foco ao botão gatilho.
Trate tabindex Corretamente
Existem três valores significativos de tabindex e cada um tem um propósito distinto. tabindex='0' adiciona um elemento não interativo à ordem natural de tabulação — use isso quando você realmente precisar que um elemento não focável (como o contêiner de um widget personalizado) receba foco. tabindex='-1' remove um elemento da ordem de tabulação, mas permite que ele receba foco programático via .focus() — essencial para alvos de modais e destinos de links de pular navegação. Valores positivos de tabindex (como tabindex='1' ou tabindex='5') substituem a ordem natural de maneiras que quase sempre causam mais problemas do que resolvem; evite-os completamente e corrija a ordem do DOM em vez disso.
ARIA: Uma Ferramenta Poderosa, Não uma Bala de Prata
Atributos Accessible Rich Internet Applications (ARIA) estendem a semântica do HTML para ajudar tecnologias assistivas a entender componentes personalizados que o HTML nativo não cobre — abas, acordeões, tree views, carrosséis, combo boxes. Atributos ARIA podem fornecer contexto adicional, mas devem complementar — não substituir — o HTML semântico. Um erro comum e perigoso é recorrer ao ARIA antes de considerar se um elemento HTML nativo poderia fazer o trabalho em seu lugar.
A primeira regra do ARIA é: não use ARIA se um elemento ou atributo HTML nativo puder fazer o mesmo trabalho. A segunda regra: nenhum ARIA é melhor do que ARIA mal utilizado. Marcação ARIA incorreta — por exemplo, aplicar role='menu' sem a hierarquia adequada de filhos role='menuitem', ou usar aria-hidden='true' em um elemento que recebe foco — pode prejudicar ativamente a acessibilidade em vez de ajudar.
Quando o ARIA é realmente necessário, os atributos mais úteis para interações de teclado são: aria-expanded para comunicar o estado aberto/fechado em elementos colapsáveis; aria-controls para vincular um gatilho ao conteúdo que ele controla; aria-haspopup para sinalizar que um botão abre um menu ou diálogo; aria-modal='true' em elementos de diálogo para sinalizar que o conteúdo de fundo está inerte; e regiões aria-live (polite para mensagens de status, assertive para alertas urgentes) para anunciar mudanças dinâmicas de conteúdo a usuários de leitores de tela sem mover o foco.
Uma consideração sutil, mas importante: leitores de tela como NVDA e JAWS usam seus próprios atalhos de teclado — por exemplo, pressionar H no NVDA move o usuário para o próximo heading na página. Desenvolvedores devem evitar criar atalhos personalizados de aplicação que entrem em conflito com esses comandos de tecnologias assistivas.
Testando a Acessibilidade por Teclado
O teste mais eficaz que você pode executar agora não exige ferramentas: desconecte o mouse e navegue pelo seu site usando apenas o teclado. Pressione Tab para avançar pelos elementos interativos, Shift+Tab para voltar, Enter para ativar links e botões, Espaço para alternar checkboxes e ativar botões, Escape para fechar modais e menus e teclas de seta para navegar dentro de componentes. Pergunte a si mesmo: Você consegue alcançar todos os elementos interativos? Consegue ver onde está o foco o tempo todo? Consegue concluir todas as jornadas críticas do usuário sem ficar preso?
Ferramentas automatizadas podem detectar um subconjunto significativo de problemas de acessibilidade por teclado — especialmente rótulos ausentes, botões vazios e alguns problemas de gerenciamento de foco. Ferramentas como axe DevTools, WAVE e Lighthouse são bons primeiros passos. No entanto, ferramentas automatizadas detectam apenas cerca de 40% dos problemas de WCAG. Visibilidade do foco, ordem lógica de foco e gerenciamento correto de estado ARIA exigem avaliação manual humana. Para a avaliação mais completa, combine varredura automatizada com testes manuais apenas com teclado em vários navegadores e inclua testes com leitores de tela como NVDA (Windows), JAWS (Windows) ou VoiceOver (macOS/iOS).
Alguns cenários específicos para testar manualmente sempre que você lançar um novo componente ou página: Você consegue abrir e fechar todos os dropdowns, modais e acordeões usando apenas Tab, Enter e Escape? Quando um modal é fechado, o foco retorna ao gatilho? O link de pular navegação aparece e funciona ao primeiro pressionamento de Tab? Há pontos em que o foco de Tab desaparece em um elemento sem indicador visível? Cabeçalhos fixos ou banners de cookies encobrem elementos em foco enquanto você navega com Tab pela página?
Para equipes que constroem bibliotecas de componentes, o WAI-ARIA Authoring Practices Guide (APG) publicado pelo W3C é a referência definitiva para padrões de interação por teclado em dezenas de tipos de widgets — de acordeões e carrosséis a seletores de data e tree views. Cada padrão especifica exatamente quais teclas devem ser suportadas e qual deve ser o comportamento esperado.
Cabeçalhos Fixos, Rodapés Fixos e Obstrução de Foco
Um dos novos requisitos mais relevantes na prática na WCAG 2.2 é o Critério de Sucesso 2.4.11: Focus Not Obscured. Ele aborda um problema tão comum que praticamente define a web moderna: barras de navegação fixas, banners de consentimento de cookies, widgets de chat e rodapés fixos que ficam sobre o conteúdo da página. Quando um usuário de teclado navega com Tab até um elemento que foi rolado para trás de uma dessas camadas fixas, o elemento em foco se torna invisível — o usuário não consegue ver com o que está interagindo.
A correção exige coordenação entre CSS e JavaScript. Quando um elemento recebe foco, o navegador deve rolá-lo para uma área visível. Mas um cabeçalho fixo com position: fixed e altura de, digamos, 80px significa que os 80px superiores da viewport estão permanentemente ocupados. O scroll padding em CSS pode compensar isso:
html {
/* Altura do seu cabeçalho fixo + uma pequena folga */
scroll-padding-top: 96px;
}
Isso diz ao navegador para compensar a ancoragem de rolagem pelo valor especificado, de modo que, quando ele rolar automaticamente um elemento em foco para a visualização, leve em conta o cabeçalho fixo. Você também pode precisar de scroll-padding-bottom equivalente se tiver um rodapé fixo. Para banners de cookies ou overlays que aparecem e desaparecem, garanta que eles tenham valores de z-index que não cubram o elemento em foco ou ajuste dinamicamente o scroll padding quando o banner estiver visível.
Principais Lições
- HTML semântico é seu melhor primeiro passo. Elementos nativos como
<button>,<a>e controles de formulário são acessíveis por teclado por padrão. Cada widget personalizado construído com divs custa acessibilidade que você depois terá de reconstruir manualmente com ARIA e JavaScript. - Nunca suprima indicadores de foco sem substituí-los. A regra global
outline: noneé uma das coisas mais prejudiciais que você pode colocar em uma folha de estilo. Use:focus-visiblepara fornecer um anel de foco estilizado e de alto contraste que atenda aos requisitos mínimos de tamanho e contraste da WCAG 2.2. - Gerencie o foco programaticamente em toda interação dinâmica. Modais, gavetas, notificações toast e mudanças dinâmicas de conteúdo exigem gerenciamento explícito de foco — mover o foco para dentro e retorná-lo ao fechar. Sem isso, usuários de teclado perdem seu lugar toda vez que a interface muda.
- Adicione um link de pular navegação no topo de cada página. Ele exige menos de 20 linhas de código e melhora dramaticamente a experiência de usuários de teclado que, de outra forma, teriam de percorrer com Tab todo o seu cabeçalho e navegação em cada carregamento de página.
- Teste com o teclado antes de publicar. Ferramentas automatizadas detectam apenas uma fração dos problemas de acessibilidade por teclado. Um walkthrough de dez minutos usando apenas o teclado nas jornadas de usuário mais críticas revelará bloqueios reais que nenhum scanner encontrará — e pode ser feito por qualquer desenvolvedor da equipe sem treinamento especializado.
