Tabs y accordion accesibles

Diseño e implementación de patrones de pestañas y acordeones con navegación de teclado consistente.

Tabs y acordeones son patrones de estructura, no solo de diseño visual.

Si no controlas roles, estados y teclado, el componente parece funcionar pero falla en accesibilidad.

La clave es que cada cambio de panel sea predecible y comunicable.

Este tema te prepara para crear componentes reutilizables sin deuda semántica.

  • Diferencias y reglas para construir tabs y acordeones robustos.
  • Cómo montar componentes compartidos sin duplicar lógica accesible.
  • Implementa primero comportamiento de teclado y estado; luego estilo visual.
  • Separa lógica del patrón (roles/estados) de contenido para reusar en distintas vistas.
  • Valida en casos con mucho contenido y paneles dinámicos cargados por API.

Claves teóricas

Diferencias y reglas para construir tabs y acordeones robustos.

Aplicación en proyectos reales

Cómo montar componentes compartidos sin duplicar lógica accesible.

Implementa primero comportamiento de teclado y estado; luego estilo visual.

Separa lógica del patrón (roles/estados) de contenido para reusar en distintas vistas.

Valida en casos con mucho contenido y paneles dinámicos cargados por API.

  • Crea utilidades para sincronizar atributos ARIA automáticamente.
  • Evita ocultar panel activo con CSS sin actualizar estado semántico.
  • Define pruebas unitarias para cambios de foco y selección.
  • Documenta API del componente para evitar mal uso en el equipo.

Patrón de código

Estructura mínima de tabs con relación explícita entre control y panel.

Accesibilidad Web
15

Tabs y accordion accesibles

Diseño e implementación de patrones de pestañas y acordeones con navegación de teclado consistente.

Código del tema: tabs accordion a11y

📘 Teoría

Claves teóricas

Diferencias y reglas para construir tabs y acordeones robustos.

1

Tabs: navegación horizontal

Usa `role=tablist`, `role=tab` y `role=tabpanel` con asociación por id.

2

Accordion: secciones expandibles

Controla cada panel con botón y `aria-expanded` sincronizado.

3

Teclado en tabs

Flechas para moverse entre tabs, Enter/Espacio para activar.

4

Teclado en accordion

Tab para navegar entre encabezados y controles internos del panel abierto.

5

Estado claro

Debe verse y anunciarse qué panel está activo/expandido.

6

Error típico

Cambiar contenido visual sin actualizar `aria-selected` o `aria-expanded`.

Aplicación en proyectos reales

Cómo montar componentes compartidos sin duplicar lógica accesible.

Implementa primero comportamiento de teclado y estado; luego estilo visual.

Separa lógica del patrón (roles/estados) de contenido para reusar en distintas vistas.

Valida en casos con mucho contenido y paneles dinámicos cargados por API.

  • Crea utilidades para sincronizar atributos ARIA automáticamente.
  • Evita ocultar panel activo con CSS sin actualizar estado semántico.
  • Define pruebas unitarias para cambios de foco y selección.
  • Documenta API del componente para evitar mal uso en el equipo.

Patrón de código

Estructura mínima de tabs con relación explícita entre control y panel.

Tabs con roles ARIA
<div role="tablist" aria-label="Secciones">
  <button id="tab-resumen" role="tab" aria-selected="true" aria-controls="panel-resumen">Resumen</button>
  <button id="tab-detalle" role="tab" aria-selected="false" aria-controls="panel-detalle">Detalle</button>
</div>
<section id="panel-resumen" role="tabpanel" aria-labelledby="tab-resumen">Contenido resumen</section>

🧪 Aprende probando

Ejemplo Demo guiada Activa tabs y sincroniza selección con panel visible.

🏁 Retos

Reto Reto práctico Corrige tabs sin estado ARIA actualizado.

🧰 Recursos

¿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 .