Volver al curso

Accesibilidad Web (WCAG)

lección
4 / 6
intermediate
10 horas
HTML Semántico y ARIA

HTML Semántico para Accesibilidad

Lectura
15 min~3 min lectura

El HTML Semántico es la Base de Todo

El HTML semántico usa los elementos correctos para su propósito: un botón es un <button>, un encabezado es un <h1>, una lista es un <ul>. Parece obvio, pero la mayoría de los problemas de accesibilidad se resolverían usando el HTML correcto en lugar de divs genéricos con estilos.

Elementos semánticos esenciales

  • <header>, <nav>, <main>, <footer>: las landmarks que los lectores de pantalla usan para navegar la página
  • <h1> a <h6>: jerarquía de títulos — SIEMPRE en orden descendente, nunca saltar niveles (h1 → h3 sin h2 es un error)
  • <button>: para acciones interactivas — NUNCA uses <div onclick> como botón (no es accesible por teclado)
  • <a>: para navegación a otra página o sección — tiene focus, hover y es anunciado por lectores de pantalla automáticamente
  • <ul>/<ol>/<li>: para listas — los lectores de pantalla anuncian 'lista con 5 elementos', dando contexto al usuario

Imágenes accesibles

  • Toda imagen informativa necesita un alt descriptivo: alt='Gráfico de barras mostrando ventas creciendo 30% en Q2'
  • Imágenes decorativas usan alt vacío: alt='' — así el lector de pantalla las ignora en lugar de decir 'imagen'
  • Nunca pongas alt='imagen de...' o alt='foto de...' — el lector de pantalla ya dice 'imagen', sería redundante
  • Para imágenes complejas (gráficos, infografías), añade una descripción larga debajo o en un enlace 'Descripción detallada'
  • Los SVG necesitan role='img' y un aria-label para ser accesibles

Tablas accesibles

  • Usa <table> solo para datos tabulares, NUNCA para layout de página (eso es de 1999)
  • <thead> con <th> para encabezados de columna — los lectores de pantalla asocian cada celda con su encabezado
  • scope='col' en <th> de columnas y scope='row' en <th> de filas — clarifica la relación datos-encabezado
  • <caption>: un título descriptivo para la tabla que los lectores de pantalla anuncian al encontrarla
  • Para tablas complejas con celdas combinadas, usa headers e id para asociaciones explícitas

Ejemplo práctico

<!-- MAL: div como botón -->
<div class="btn" onclick="handleClick()">Enviar</div>

<!-- BIEN: button semántico -->
<button type="submit" class="btn">Enviar</button>

<!-- MAL: imagen sin alt -->
<img src="chart.png">

<!-- BIEN: imagen con alt descriptivo -->
<img src="chart.png" alt="Ventas mensuales: enero $5K, febrero $8K, marzo $12K">

<!-- MAL: jerarquía de títulos rota -->
<h1>Mi Sitio</h1>
<h3>Sección</h3> <!-- Saltó h2! -->

<!-- BIEN: jerarquía correcta -->
<h1>Mi Sitio</h1>
<h2>Sección</h2>
Consejo: Antes de agregar un ARIA attribute, pregúntate: ¿hay un elemento HTML nativo que haga esto? En el 90% de los casos, la respuesta es sí y es mejor usarlo.