0Pricing
HTML Academy · Aula

tabindex e accesskey

Controlar a ordem de navegação pelo teclado e os atalhos.

tabindex e accesskey é uma aula grátis de HTML Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de HTML Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de HTML Academy inclui 4 aulas no total.

Navegação pelo teclado

Usuários sem mouse dependem da tecla Tab para navegar pelos elementos interativos:

  • Naturalmente focalizáveis: <a href>, <button>, <input>, <select>, <textarea>
  • Elementos não interativos (<div>, <span>) não fazem parte da ordem de tabulação
  • tabindex controla se e onde um elemento aparece na ordem de tabulação

tabindex="0"

tabindex="0" adiciona um elemento não interativo à ordem natural de tabulação:

<div tabindex="0" role="button" onclick="handleClick()">
  Custom Button
</div>
<!-- Now Tab navigates to this div -->
<!-- It receives focus at the natural position in the DOM -->

<!-- Better: use a real button instead! -->
<button onclick="handleClick()">Real Button</button>

tabindex="-1"

tabindex="-1" torna um elemento focalizável por programação, mas o remove da ordem de tabulação:

<div id="modal" tabindex="-1" role="dialog">
  <!-- modal content -->
</div>

<script>
// Open modal and send focus to it:
document.getElementById('modal').focus();
// Modal is now focused but not in the normal tab sequence
</script>

Valores positivos de tabindex — evite

Valores positivos de tabindex (por exemplo, tabindex="3") definem uma ordem de tabulação personalizada — evite usá-los:

<!-- BAD: positive tabindex creates unpredictable order -->
<input tabindex="3">
<input tabindex="1">
<input tabindex="2">

<!-- The tab order becomes: 1, 2, 3, then all tabindex=0 elements -->
<!-- This almost always confuses users and fails WCAG 2.4.3 -->

<!-- Fix the DOM order instead of using positive tabindex -->

Gerenciamento do foco em aplicativos de página única

Aplicativos de página única precisam gerenciar o foco manualmente:

// When navigating to a new route:
document.querySelector('#main-content').focus();

// When opening a modal:
const modal = document.getElementById('modal');
modal.removeAttribute('hidden');
modal.querySelector('[autofocus], button, [tabindex]').focus();

// When closing a modal: return focus to the trigger
document.getElementById('open-btn').focus();

Confinamento do foco em modais

Confine o foco dentro de um modal aberto para que a tecla Tab permaneça dentro dele:

function trapFocus(element) {
  const focusable = element.querySelectorAll(
    'a, button, input, textarea, select, [tabindex]:not([tabindex="-1"])'
  );
  const first = focusable[0];
  const last = focusable[focusable.length - 1];

  element.addEventListener('keydown', e => {
    if (e.key === 'Tab') {
      if (e.shiftKey && document.activeElement === first) {
        e.preventDefault(); last.focus();
      } else if (!e.shiftKey && document.activeElement === last) {
        e.preventDefault(); first.focus();
      }
    }
  });
}

O atributo accesskey

O atributo accesskey atribui um atalho de teclado a um elemento:

<button accesskey="s">Submit</button>
<!-- On Windows: Alt+S focuses/activates the button -->
<!-- On Mac: Control+Option+S -->
<!-- On Firefox: Shift+Alt+S -->

<a href="/" accesskey="h">Home</a>

Limitações de accesskey

accesskey apresenta problemas significativos:

  • As teclas de ativação variam entre navegadores e sistemas operacionais
  • Entram em conflito com atalhos do navegador (por exemplo, Alt+F = menu Arquivo)
  • Não são anunciadas por padrão pelos leitores de tela
  • Raramente são usadas na prática — documente-as caso decida usá-las

Indicadores visíveis de foco

Nunca oculte os contornos de foco — eles são essenciais para usuários de teclado:

/* BAD: removes focus outline for everyone */
* { outline: none; }

/* Better: style focus outlines, don't remove them */
:focus-visible {
  outline: 2px solid #0070f3;
  outline-offset: 2px;
  border-radius: 3px;
}

/* :focus-visible only shows outline for keyboard navigation -->
/* Mouse clicks do not trigger :focus-visible in modern browsers */

Padrão de link de salto

Um link de salto permite que usuários de teclado pulem a navegação repetitiva:

<a href="#main-content" class="skip-link">Skip to main content</a>

<nav>... long navigation ...</nav>

<main id="main-content" tabindex="-1">... content ...</main>

<!-- CSS: -->
<!--
.skip-link {
  position: absolute;
  top: -100%;
}
.skip-link:focus {
  top: 0;
}
-->

Atributo autofocus

O atributo autofocus move o foco para um elemento quando a página é carregada:

<input type="search" autofocus placeholder="Search...">
<!-- Useful on search pages or forms with a single primary field -->
<!-- Use sparingly: it can disrupt users who rely on the page top for orientation -->
<!-- Only one element per page should have autofocus -->

Verificação rápida

Qual valor de tabindex torna um elemento focalizável via JavaScript, mas faz com que ele seja ignorado na navegação normal pela tecla Tab?

Recapitulação: tabindex e accesskey

Princípios essenciais da acessibilidade pelo teclado:

  • tabindex="0" — adiciona à ordem natural de tabulação
  • tabindex="-1" — focalizável por programação, mas fora da ordem de tabulação
  • Evite valores positivos de tabindex
  • Nunca remova os contornos de :focus-visible
  • Implemente links de salto para usuários de teclado
  • accesskey está disponível, mas raramente é prático devido aos conflitos

Perguntas Frequentes

A aula “tabindex e accesskey” é grátis?

Sim — o texto completo de “tabindex e accesskey” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de HTML Academy, atualize para CoddyKit PRO. O curso de HTML Academy inclui 4 aulas no total.

O que vou aprender em “tabindex e accesskey”?

Controlar a ordem de navegação pelo teclado e os atalhos. Você pratica HTML Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar HTML Academy?

Nenhuma experiência prévia é necessária. HTML Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “tabindex e accesskey”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de HTML Academy?

Sim. Cada aula de HTML Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. id, class, style e title
  2. O atributo hidden
  3. tabindex e accesskey
  4. Atributos de dados personalizados data-*
← Voltar para HTML Academy