Accesibilidad en interacciones DOM con JavaScript

Implementa componentes interactivos que funcionen con teclado, lector de pantalla y gestión correcta del foco.

Interactividad sin accesibilidad es deuda técnica y deuda de producto.

JavaScript debe respetar orden de foco, feedback semántico y control por teclado.

Si cambias estado visual, también debes actualizar estado accesible.

Los patrones correctos evitan frustración y mejoran calidad global de la UI.

  • Todo componente interactivo debe poder usarse sin ratón.
  • Si un botón abre un panel, el foco debe moverse a un lugar útil. Si el panel se cierra, el foco debe volver al trigger.
  • Evita `div` clicables para acciones principales; usa elementos nativos (`button`, `a`) siempre que puedas.
  • Gestiona foco en abrir/cerrar modales.
  • Soporta Enter y Space en controles personalizados.

Foco y teclado: base obligatoria

Todo componente interactivo debe poder usarse sin ratón.

Si un botón abre un panel, el foco debe moverse a un lugar útil. Si el panel se cierra, el foco debe volver al trigger.

Evita `div` clicables para acciones principales; usa elementos nativos (`button`, `a`) siempre que puedas.

  • Gestiona foco en abrir/cerrar modales.
  • Soporta Enter y Space en controles personalizados.
  • No ocultes el focus ring con CSS.

Sincronizar estado visual y estado ARIA

Si cambia la UI, cambia también lo que 'lee' tecnología asistiva.

Errores JS frecuentes que rompen accesibilidad

Son comunes y evitables con una checklist corta.

  • Abrir modal sin mover foco al contenido.
  • Cerrar modal sin devolver foco al botón que lo abrió.
  • Ocultar contenido visualmente sin actualizar atributos.
  • Capturar teclas globalmente e impedir navegación natural.
JavaScript
29

Accesibilidad en interacciones DOM con JavaScript

Implementa componentes interactivos que funcionen con teclado, lector de pantalla y gestión correcta del foco.

Código del tema: focus management | aria-* | keyboard events

📘 Teoría

Foco y teclado: base obligatoria

Todo componente interactivo debe poder usarse sin ratón.

Si un botón abre un panel, el foco debe moverse a un lugar útil. Si el panel se cierra, el foco debe volver al trigger.

Evita `div` clicables para acciones principales; usa elementos nativos (`button`, `a`) siempre que puedas.

  • Gestiona foco en abrir/cerrar modales.
  • Soporta Enter y Space en controles personalizados.
  • No ocultes el focus ring con CSS.

Sincronizar estado visual y estado ARIA

Si cambia la UI, cambia también lo que 'lee' tecnología asistiva.

Actualizar aria-expanded
const btn = document.querySelector('#toggle-menu');
const panel = document.querySelector('#menu');

btn.addEventListener('click', () => {
  const expanded = btn.getAttribute('aria-expanded') === 'true';
  btn.setAttribute('aria-expanded', String(!expanded));
  panel.hidden = expanded;
});

Errores JS frecuentes que rompen accesibilidad

Son comunes y evitables con una checklist corta.

  • Abrir modal sin mover foco al contenido.
  • Cerrar modal sin devolver foco al botón que lo abrió.
  • Ocultar contenido visualmente sin actualizar atributos.
  • Capturar teclas globalmente e impedir navegación natural.
Cerrar modal devolviendo foco
const abrir = document.querySelector('#abrir');
const cerrar = document.querySelector('#cerrar');
const modal = document.querySelector('#modal');

abrir.addEventListener('click', () => {
  modal.hidden = false;
  cerrar.focus();
});

cerrar.addEventListener('click', () => {
  modal.hidden = true;
  abrir.focus();
});

🧪 Aprende probando

Ejemplo Ejemplo guiado: botón expandible accesible Control de panel con `aria-expanded` y `hidden`.

🏁 Retos

Reto Reto: soportar Escape para cerrar Añade manejo de teclado para cerrar un panel/modal.

🧰 Recursos

Test

Comprueba tus conocimientos con un test sobre JavaScript.

Test de JavaScript
CodePen: eventos y DOM
Abrir en CodePen

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .