Navegación por teclado
Capacidad de usar un sitio web completamente mediante teclado sin necesidad de mouse. Esencial para usuarios con discapacidad motora y requisito fundamental de WCAG 2.1.1.
Navegación por teclado
Definición Técnica
La navegación por teclado es la capacidad de usar completamente un sitio web o aplicación mediante el teclado, sin necesidad de un mouse o dispositivo señalador. Es un requisito fundamental de accesibilidad (WCAG 2.1.1) y esencial para usuarios con discapacidad motora, usuarios de tecnologías de asistencia y cualquier persona que prefiera usar el teclado.
Teclas Principales
Navegación Básica
- Tab: Mover foco al siguiente elemento interactivo
- Shift+Tab: Mover foco al elemento anterior
- Enter / Espacio: Activar elemento enfocado (botones, enlaces)
- Esc: Cerrar modales, menús, cancelar acciones
Navegación Avanzada
- Flechas: Navegar dentro de componentes (listas, menús, grids)
- Home / End: Ir al inicio/fin de línea o lista
- Page Up / Page Down: Desplazarse por páginas
- Atajos de teclado: Combinaciones personalizadas (Ctrl+S, etc.)
Elementos Enfocables
Por Defecto
- Enlaces: <a href>
- Botones: <button>
- Campos de formulario: <input>, <select>, <textarea>
- Elementos con tabindex: Cualquier elemento con tabindex="0" o mayor
Hacer Elementos Enfocables
<!-- ✅ Correcto: Elemento enfocable -->
<div role="button" tabindex="0" onclick="action()">
Hacer acción
</div>
<!-- ⚠️ Preferible: Usar elemento semántico -->
<button onclick="action()">Hacer acción</button>
Errores Comunes
❌ Elementos No Enfocables
<!-- ❌ Incorrecto: Div que debería ser botón -->
<div onclick="submit()">Enviar</div>
<!-- No se puede activar con teclado -->
<!-- ✅ Correcto: Botón semántico -->
<button type="submit">Enviar</button>
<!-- Se puede activar con Enter o Espacio -->
❌ Dependencia de Mouse
<!-- ❌ Incorrecto: Solo funciona con mouse -->
<div onmouseover="show()" onmouseout="hide()">
Contenido
</div>
<!-- ✅ Correcto: También funciona con teclado -->
<div
onmouseover="show()"
onmouseout="hide()"
onfocus="show()"
onblur="hide()"
tabindex="0">
Contenido
</div>
Componentes Comunes
Menús Desplegables
<!-- ✅ Correcto: Menú accesible por teclado -->
<button
aria-expanded="false"
aria-controls="menu"
onclick="toggleMenu()">
Menú
</button>
<ul id="menu" role="menu" aria-hidden="true">
<li role="menuitem"><a href="/">Inicio</a></li>
<li role="menuitem"><a href="/productos">Productos</a></li>
</ul>
<script>
function toggleMenu() {
const menu = document.getElementById('menu');
const button = document.querySelector('button');
const isExpanded = menu.getAttribute('aria-hidden') === 'false';
menu.setAttribute('aria-hidden', isExpanded);
button.setAttribute('aria-expanded', !isExpanded);
if (!isExpanded) {
menu.querySelector('a').focus(); // Mover foco al menú
}
}
</script>
Modales
<!-- ✅ Correcto: Modal accesible por teclado -->
<div role="dialog" aria-labelledby="modal-title" aria-modal="true">
<h2 id="modal-title">Confirmar acción</h2>
<button onclick="cerrar()">Cerrar</button>
<button onclick="confirmar()">Confirmar</button>
</div>
<script>
function abrirModal() {
const modal = document.querySelector('[role="dialog"]');
modal.style.display = 'block';
modal.querySelector('button').focus(); // Mover foco al modal
// Atrapar foco dentro del modal
}
function cerrarModal() {
const modal = document.querySelector('[role="dialog"]');
modal.style.display = 'none';
document.querySelector('[onclick="abrirModal()"]').focus(); // Restaurar foco
}
</script>
Criterio WCAG 2.1.1
Teclado (Nivel A): Toda la funcionalidad del contenido es operable mediante una interfaz de teclado sin requerir una velocidad específica de pulsación de teclas.
Testing
Checklist
- Todos los enlaces son activables con Enter
- Todos los botones son activables con Enter o Espacio
- Los formularios son completables solo con teclado
- Los menús desplegables funcionan con teclado
- Los modales se pueden cerrar con Esc
- El orden de tabulación es lógico
- No hay trampas de foco
- El foco es visible en todos los elementos
Referencias
Términos Relacionados
- Foco
- Orden de tabulación
- Indicador de foco visible
- Gestión de foco