Controlar o foco com o tabindex

Elementos HTML padrão, como <button> ou <input>, têm acessibilidade de teclado integrada e devem ser usados sempre que possível. No entanto, se você precisar criar elementos interativos personalizados, adicione tabindex para criar o comportamento esperado do usuário.

Browser Support

  • Chrome: 1.
  • Edge: 12.
  • Firefox: 1.5.
  • Safari: 3.1.

Source

Adicione tabindex apenas a conteúdo interativo. Mesmo que o conteúdo seja importante, como uma imagem importante, os usuários de leitores de tela podem entender o conteúdo sem adicionar foco.

O que é tabindex?

Se você precisar modificar a ordem de guias padrão fornecida por elementos incorporados, use o atributo HTML tabindex para definir explicitamente a posição da guia de um elemento.

tabindex pode ser aplicado a qualquer elemento, embora precise ser aplicado apenas a elementos interativos e receba um intervalo de valores inteiros. Com tabindex, é possível especificar uma ordem explícita para elementos de página com foco, inserir um elemento não focado na ordem de guias e remover elementos da ordem de guias. Exemplo:

tabindex="0": insere um elemento na ordem natural das guias. O elemento pode ser focalizado pressionando Tab e pode ser focalizado chamando o método focus() dele.

tabindex="-1": remove um elemento da ordem de guias natural, mas o elemento ainda pode ser focado chamando o método focus().

tabindex="5": qualquer tabindex maior que 0 traz esse elemento para a frente da ordem de guias natural. Se houver vários elementos com um tabindex maior que 0, a ordem de guias vai começar pelo valor mais baixo maior que zero e aumentar. O uso de um tabindex maior que 0 é considerado um antipadrão.

Garantir que os controles sejam acessíveis pelo teclado

Uma ferramenta como o Lighthouse é ótima para detectar automaticamente determinados problemas de acessibilidade. No entanto, alguns testes ainda precisam ser feitos manualmente por uma pessoa.

Tente pressionar a tecla Tab para navegar pelo site. Você consegue acessar todos os controles interativos na página? Caso contrário, talvez seja necessário usar tabindex para melhorar o foco desses controles.

Gerenciar o foco no nível da página

Às vezes, o tabindex ajuda a criar uma experiência do usuário perfeita. Por exemplo, se você criar uma página única robusta com diferentes seções de conteúdo, em que parte do conteúdo fica oculto em diferentes pontos do carregamento da página. Isso pode significar que os links de navegação mudam o conteúdo visível sem atualizar a página.

Nesse caso, identifique a área de conteúdo selecionada e atribua a ela um tabindex de -1 e chame o método focus. Isso garante que o conteúdo não apareça na ordem natural das guias. Essa técnica, chamada de gerenciamento do foco, mantém o contexto percebido do usuário sincronizado com o conteúdo visual do site.

Gerenciar o foco em componentes

Em alguns casos, também é necessário gerenciar o foco no nível de controle, como com elementos personalizados.

Saber quais comportamentos de teclado implementar pode ser difícil. O guia Práticas de criação de aplicativos ricos acessíveis da Internet (ARIA, em inglês) lista os tipos de componentes e os tipos de ações de teclado compatíveis.

Inserir um elemento na ordem de guias

Insira um elemento na ordem natural das guias usando tabindex="0". Exemplo:

<div tabindex="0">Focus me with the TAB key</div>

Para dar foco a um elemento, pressione a tecla Tab ou chame o método focus() do elemento.

Remover um elemento da ordem das guias

Remova um elemento usando tabindex="-1". Exemplo:

<button tabindex="-1">Can't reach me with the TAB key!</button>

Isso remove um elemento da ordem de guias natural, mas o elemento ainda pode ser centralizado chamando o método focus() dele.

Aplicar tabindex="-1" a um elemento não afeta os filhos dele. Se eles estiverem na ordem de guias naturalmente ou devido a um valor tabindex, eles vão permanecer na ordem de guias. Para remover um elemento e todos os filhos dele da ordem de guias, use o polyfill inert do WICG. O polyfill emula o comportamento de um atributo inert proposto, o que impede que os elementos sejam selecionados ou lidos por tecnologias adaptativas.

Evite tabindex > 0

Qualquer tabindex maior que 0 faz com que o elemento vá para a frente da ordem natural da guia. Se houver vários elementos com um tabindex maior que 0, a ordem vai começar pelo valor mais baixo maior que zero e aumentar.

O uso de um tabindex maior que 0 é considerado um antipadrão, porque os leitores de tela navegam pela página na ordem do DOM, não na ordem das guias. Se você precisar que um elemento apareça mais cedo na ordem de guias, ele precisará ser movido para um local anterior no DOM.

Com o Lighthouse, é possível identificar elementos com tabindex > 0. Execute a auditoria de acessibilidade (Lighthouse > Opções > Acessibilidade) e procure os resultados da auditoria "Nenhum elemento tem um valor de [tabindex] maior que 0".

Usar "tabindex móvel"

Se você estiver criando um componente complexo, talvez seja necessário adicionar mais suporte ao teclado além do foco. Sempre que possível, use o elemento select integrado. Ele pode ser focado e permite que as teclas de seta exibam outras opções selecionáveis.

Para implementar funções semelhantes nos seus próprios componentes, use uma técnica conhecida como "tabindex itinerante". O tabindex itinerante funciona definindo tabindex como -1 para todos os filhos, exceto o ativo. O componente usa um listener de evento de teclado para determinar qual tecla o usuário pressionou.

Quando isso acontece, o componente define o tabindex da filha focada anteriormente como -1, define o tabindex da filha a ser focada como 0 e chama o método focus() nela.

Antes

<div role="toolbar">
  <button tabindex="-1">Undo</button>
  <button tabindex="0">Redo</button>
  <button tabindex="-1">Cut</button>
</div>

Depois

<div role="toolbar">
  <button tabindex="-1">Undo</button>
  <button tabindex="-1">Redo</button>
  <button tabindex="0">Cut</button>
</div>

Receitas de acesso ao teclado

Se você não tiver certeza de qual nível de suporte ao teclado seus componentes personalizados podem precisar, consulte as Práticas de criação de ARIA 1.1. Este guia lista padrões comuns de IU e identifica quais chaves os componentes precisam oferecer suporte.