tabindex y accesskey
Controle el orden de navegación con el teclado y los atajos.
tabindex y accesskey es una lección gratuita de HTML Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de HTML Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de HTML Academy incluye 4 lecciones en total.
Navegación con el teclado
Las personas que no utilizan ratón dependen de Tab para navegar por los elementos interactivos:
- Elementos que reciben el foco de forma natural:
<a href>,<button>,<input>,<select>,<textarea> - Los elementos no interactivos (
<div>,<span>) no forman parte del orden de tabulación tabindexcontrola si un elemento aparece en el orden de tabulación y en qué posición
tabindex="0"
tabindex="0" añade un elemento no interactivo al orden de tabulación natural:
<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" permite enfocar un elemento mediante programación, pero lo elimina del orden de tabulación:
<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: evítelos
Los valores positivos de tabindex (por ejemplo, tabindex="3") establecen un orden de tabulación personalizado; evítelos:
<!-- 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 -->Gestión del foco en SPA
Las aplicaciones de una sola página deben gestionar el 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();Trampa de foco en diálogos modales
Confine el foco dentro de un diálogo modal abierto para que Tab permanezca dentro de él:
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();
}
}
});
}El atributo accesskey
El atributo accesskey asigna un atajo de teclado a un 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>Limitaciones de accesskey
accesskey presenta problemas importantes:
- Las teclas de activación varían según el navegador y el sistema operativo
- Entra en conflicto con los atajos del navegador (por ejemplo, Alt+F = menú Archivo)
- Los lectores de pantalla no lo anuncian de forma predeterminada
- Rara vez se utiliza en la práctica; si lo utiliza, documéntelo
Indicadores de foco visibles
No oculte nunca los contornos de foco; son esenciales para quienes utilizan el 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 */Patrón de enlace para saltar
Un enlace para saltar permite a quienes utilizan el teclado omitir la navegación 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
El atributo autofocus mueve el foco a un elemento cuando se carga la página:
<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 -->Comprobación rápida
¿Qué valor de tabindex permite enfocar un elemento mediante JavaScript, pero lo omite en la navegación normal con Tab?
Resumen: tabindex y accesskey
Aspectos esenciales de la accesibilidad mediante teclado:
tabindex="0": añadir al orden de tabulación naturaltabindex="-1": se puede enfocar mediante programación, pero no forma parte del orden de tabulación- Evite los valores positivos de tabindex
- No elimine nunca los contornos de
:focus-visible - Implemente enlaces para saltar para quienes utilizan el teclado
accesskeyestá disponible, pero rara vez resulta práctico debido a los conflictos
Preguntas frecuentes
¿La lección «tabindex y accesskey» es gratis?
Sí — el texto completo de «tabindex y accesskey» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de HTML Academy, actualiza a CoddyKit PRO. El curso de HTML Academy incluye 4 lecciones en total.
¿Qué aprenderé en «tabindex y accesskey»?
Controle el orden de navegación con el teclado y los atajos. Practicas HTML Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar HTML Academy?
No se requiere experiencia previa. HTML Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «tabindex y accesskey»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de HTML Academy?
Sí. Cada lección de HTML Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- id, class, style y title
- El atributo hidden
- tabindex y accesskey
- Atributos de datos personalizados data-*