<caption>
Tablas
Título o leyenda de la tabla. Debe ser el primer hijo directo de <table>. Asocia programáticamente un nombre a la tabla — los lectores de pantalla lo anuncian al entrar, haciendo la tabla identificable sin leer sus celdas.
<caption> es el título de la tabla. Su función es darle un nombre descriptivo que se asocie programáticamente a la tabla en el árbol de accesibilidad, de modo que los lectores de pantalla puedan anunciarlo al usuario antes de que empiece a navegar las celdas. La distinción frente a un <h2> o <p> suelto encima de la tabla es exactamente esa: el encabezado suelto es texto en el DOM pero no tiene relación programática con la tabla. El <caption> está atado a ella por el modelo del documento.
Cuando un usuario de lector de pantalla (NVDA, VoiceOver, JAWS) navega a una tabla que tiene <caption>, escucha algo como “tabla, Comparativa de planes, 3 columnas, 4 filas”. Sin <caption>, escucha solo “tabla, 3 columnas, 4 filas” — y si hay varias tablas en la página, no puede saber cuál es cuál sin entrar a leer las celdas. El <caption> resuelve exactamente ese problema: permite identificar la tabla a distancia, sin navegar su contenido.
La regla de posición de <caption> es estricta: debe ser el primer hijo directo de <table>, antes de <thead>, <tbody>, <tfoot> y cualquier <colgroup>. El contenido del <caption> puede ser texto simple, pero también puede incluir elementos en línea (<strong>, <em>, <abbr>, etc.) si aportan claridad. Por defecto se renderiza centrado encima de la tabla, pero su posición visual se puede cambiar con la propiedad CSS caption-side (top o bottom) — ver propiedades CSS de tablas (próximamente en la referencia).
Cómo funciona
<caption> va como primer hijo directo de <table>, antes de cualquier sección o fila. El navegador lo renderiza visualmente centrado encima de la tabla por defecto, con caption-side: top. La posición visual es controlable por CSS, pero la posición en el DOM debe ser siempre como primer hijo de <table>.
<table>
<caption>Comparativa de planes de suscripción</caption>
<thead>
<tr>
<th scope="col">Característica</th>
<th scope="col">Básico</th>
<th scope="col">Pro</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Precio</th>
<td>$5/mes</td>
<td>$15/mes</td>
</tr>
<tr>
<th scope="row">Almacenamiento</th>
<td>10 GB</td>
<td>100 GB</td>
</tr>
</tbody>
</table>
| Característica | Básico | Pro |
|---|---|---|
| Precio | $5/mes | $15/mes |
| Almacenamiento | 10 GB | 100 GB |
Modelo de contenido
<caption> puede contener contenido de flujo (flow content): texto, elementos en línea (<strong>, <em>, <abbr>, <a>). En la práctica casi siempre se usa texto descriptivo simple. Va exclusivamente como primer hijo de <table>.
Display por defecto: table-caption.
Atributos
<caption> no tiene atributos propios de uso moderno. El atributo align (align="top", align="bottom", align="left", align="right") es legacy desde HTML5 — reemplazado por la propiedad CSS caption-side.
Accesibilidad
<caption> es el mecanismo estándar para nombrar una tabla. En el árbol de accesibilidad, su contenido se convierte en el nombre accesible de la tabla (el equivalente del aria-label de un elemento genérico). Los lectores de pantalla lo leen al entrar a la tabla — antes de anunciar el número de filas y columnas.
La alternativa usando aria-label directamente en <table> (<table aria-label="Ventas mensuales">) funciona igual de bien para la accesibilidad pero no produce la representación visual del <caption>. Para tablas donde el título también debe ser visible, <caption> es el elemento correcto.
La regla general: toda tabla de datos debería tener un <caption> que permita saber qué representa la tabla sin necesidad de leer ninguna de sus celdas.
Cuándo usar qué
| Necesidad | Solución |
|---|---|
| Título visible y asociado a la tabla | <caption> |
| Solo accesibilidad (título invisible) | <table aria-label="..."> o <caption> con CSS para ocultarlo accesiblemente |
| Encabezado de sección que precede a varias tablas | <h2> o <h3> suelto (no caption) |
| Explicación larga debajo de la tabla | <p> después del </table> |
Notas, gotchas e interacción
<caption>debe ir primero. Si lo ponés después de<thead>u otro hijo de<table>, el navegador puede ignorarlo o moverlo en el DOM — el comportamiento es indefinido y varía entre navegadores.caption-side: bottommueve el caption debajo de la tabla visualmente pero en el DOM sigue siendo el primer hijo. El DOM y la presentación visual son independientes en este caso.- No confundir con
<figcaption>.<figcaption>es para describir el contenido de un<figure>(imagen, diagrama, código).<caption>es solo para tablas. Una tabla dentro de un<figure>puede tener ambos — el<caption>nombra la tabla, el<figcaption>describe el contexto en la figura. - Una sola por tabla. Solo puede haber un
<caption>por<table>. Si hay más, el navegador usa el primero.
Vigente / legacy
<caption> es completamente vigente. El atributo align es legacy desde HTML5 — reemplazado por caption-side en CSS.
Aprendelo en el recorrido
Esta entrada complementa la lección La tabla semántica del módulo Tablas, donde <caption> se practica como el título accesible obligatorio de la tabla semántica completa.