Addaw, ir a inicio Donar

Técnica HTML WCAG 2.2

H63Usar scope para unir los encabezados con sus celdas en las tablas

Nombre oficial en el W3C: Usar el atributo scope para asociar las celdas de encabezado con las celdas de datos en las tablas de datos

En pocas palabras

En una tabla de datos, cada encabezado se marca con th, y su atributo scope dice a qué datos afecta. scope="col" indica que encabeza una columna y scope="row", que encabeza una fila. Así el lector de pantalla anuncia el encabezado correcto al leer cada dato.

Por qué es importante

Quien usa un lector de pantalla (programa que lee en voz alta lo que hay en la pantalla) recorre la tabla celda a celda. Si el dato no está unido a su encabezado, solo oye «19:30» y no sabe a qué día ni a qué actividad corresponde.

En tablas muy simples, el navegador adivina bien los encabezados. Pero falla cuando el encabezado de fila no está en la primera columna o cuando un encabezado abarca un grupo. El atributo scope lo deja claro.

Cómo se hace

  1. Marque cada encabezado con <th>, nunca con un <td> en negrita.
  2. En los encabezados de columna, ponga scope="col".
  3. En los encabezados de fila, ponga scope="row", aunque no estén en la primera columna.
  4. Si un encabezado abarca un grupo de filas o de columnas, use scope="rowgroup" o scope="colgroup".
  5. Si la tabla tiene encabezados de varios niveles, use id y headers, o divídala en tablas más simples.

Ejemplo práctico

El horario de actividades de un polideportivo municipal es una tabla de datos simple. Pero el dato clave de cada fila, la actividad, no está en la primera columna. Está en la segunda, después del número de orden.

Así no: Encabezado de fila marcado como celda de datos

El nombre de la actividad está en un td con strong. Por eso el navegador no lo trata como encabezado de fila. Al bajar por la columna «Hora» con un lector de pantalla se oye solo «19:30». No se sabe a qué actividad corresponde.

Captura de pantalla del ejemplo incorrecto: Encabezado de fila marcado como celda de datos
Así se ve el ejemplo incorrecto.

La demostración contiene, a propósito, el error de accesibilidad que se explica.

Ver el código del ejemplo incorrecto
<style>
  table { border-collapse: collapse; }
  caption { font-weight: bold; text-align: left; margin-bottom: 6px; }
  th, td { border: 1px solid #767676; padding: 4px 10px; text-align: left; }
</style>
<table>
  <caption>Horario de actividades dirigidas</caption>
  <tr><th>N.º</th><th>Actividad</th><th>Día</th><th>Hora</th></tr>
  <tr><td>1</td><td><strong>Pilates</strong></td><td>Lunes</td><td>18:00</td></tr>
  <tr><td>2</td><td><strong>Yoga</strong></td><td>Martes</td><td>19:30</td></tr>
  <tr><td>3</td><td><strong>Natación infantil</strong></td><td>Miércoles</td><td>17:00</td></tr>
</table>

Así sí: th con scope="col" y scope="row"

Las celdas de la primera fila son th scope="col". La actividad de cada fila pasa a ser th scope="row". Así cada dato queda unido a su columna y a su actividad, aunque el encabezado de fila no esté en la primera columna.

Pruébelo aquí:

Ver el código del ejemplo correcto
<style>
  table { border-collapse: collapse; }
  caption { font-weight: bold; text-align: left; margin-bottom: 6px; }
  th, td { border: 1px solid #767676; padding: 4px 10px; text-align: left; }
</style>
<table>
  <caption>Horario de actividades dirigidas</caption>
  <tr><th scope="col">N.º</th><th scope="col">Actividad</th><th scope="col">Día</th><th scope="col">Hora</th></tr>
  <tr><td>1</td><th scope="row">Pilates</th><td>Lunes</td><td>18:00</td></tr>
  <tr><td>2</td><th scope="row">Yoga</th><td>Martes</td><td>19:30</td></tr>
  <tr><td>3</td><th scope="row">Natación infantil</th><td>Miércoles</td><td>17:00</td></tr>
</table>

Cómo comprobarlo

Revisión del código

  1. En cada tabla de datos, localizar qué celdas hacen de encabezado de columna y de fila.
  2. Comprobar que son th. Si el encabezado de fila no está en la primera columna o la tabla no es simple, deben llevar scope con el valor row, col, rowgroup o colgroup.

Lector de pantalla (NVDA o VoiceOver)

  1. Entrar en la tabla (tecla T en NVDA) y situarse en la celda «18:00».
  2. Bajar por la columna con Ctrl+Alt+flecha abajo (NVDA) o VO+flecha abajo (VoiceOver). En cada celda debe anunciarse la actividad de la fila.
  3. Moverse en horizontal con Ctrl+Alt+flecha derecha. Debe anunciarse el encabezado de columna.

Debería anunciar: En la hora del yoga, algo como «Yoga, fila 3, 19:30». Las palabras exactas dependen del lector y de su versión.

Herramientas del navegador

  1. Abrir las herramientas de desarrollo (F12), pestaña Accesibilidad, y seleccionar la celda de la actividad.
  2. Comprobar que su función es rowheader. Las celdas de la primera fila deben ser columnheader.

Validación automática

  1. axe DevTools comprueba que los valores de scope son válidos (regla scope-attr-valid). También que los th tienen celdas asociadas (regla th-has-data-cells).
  2. No detecta que la actividad debería ser un encabezado de fila. Una celda de datos que hace de encabezado solo se descubre revisando la tabla a mano.

Errores frecuentes en auditorías

  • Encabezados de columna o de fila hechos con td y negrita (strong, b o CSS), en lugar de th.
  • Escribir scope="column" o scope="fila". Son valores que no existen y el navegador los ignora.
  • Resolver solo con scope tablas con encabezados de varios niveles o con celdas combinadas. Necesitan id y headers, o dividirse en tablas más simples.
  • Poner scope en celdas td. Es un uso obsoleto en HTML y no garantiza la unión con los datos.
Ver el texto completo del W3C (traducción al español)

Esta es una traducción no oficial al español de la técnica H63 de Techniques for WCAG 2.2, del W3C. Puede contener errores. El único documento oficial y normativo es la versión original en inglés, publicada en el sitio web del W3C.

Aplicabilidad

HTML

Descripción

El objetivo de esta técnica es asociar las celdas de encabezado con las celdas de datos en tablas complejas usando el atributo scope. El atributo scope puede usarse para aclarar el alcance de cualquier celda que actúe como encabezado. El atributo scope identifica si la celda es un encabezado de una fila, de una columna o de un grupo de filas o de columnas. Los valores row, col, rowgroup y colgroup identifican, respectivamente, estos posibles alcances.

Esta técnica puede usarse en tablas de datos simples en las que el encabezado no está en la primera fila o columna, como la del ejemplo 1.

En las tablas simples que tienen los encabezados en la primera fila o columna, basta con usar los elementos th sin scope.

En las tablas complejas, use id y headers como se indica en Usar los atributos id y headers para asociar las celdas de datos con las celdas de encabezado en las tablas de datos.

A algunos usuarios puede resultarles más fácil trabajar con varias tablas simples que con una sola tabla más compleja. Los autores pueden plantearse si es posible convertir las tablas complejas en una o varias tablas simples.

Ejemplos

Un horario simple

En el siguiente ejemplo, la primera columna contiene los números de orden de las filas de la tabla, y la segunda columna contiene el valor clave de la fila. Por tanto, las celdas de la segunda columna pueden usar scope="row". Las celdas de la primera fila también se marcan con td y usan scope="col".

<table>
  <caption>Contact Information</caption>
  <tr>
    <td></td>
    <th scope="col">Name</th>
    <th scope="col">Phone Number</th>
    <th scope="col">City</th>
  </tr>
  <tr>
    <td>1.</td>
    <th scope="row">Charlotte Smith</th>
    <td>412-212-5421</td>
    <td>Pittsburgh</td>
  </tr>
  <tr>
    <td>2.</td>
    <th scope="row">Joetta Frere</th>
    <td>410-306-5400</td>
    <td>Baltimore</td>
  </tr>
  <tr>
    <td>3.</td>
    <th scope="row">David Walls</th>
    <td>281-511-6600</td>
    <td>New York</td>
  </tr>
</table> 

Pruebas

Procedimiento

Para cada tabla de datos:

  1. Comprobar que todos los elementos th tienen un atributo scope.
  2. Comprobar que todos los atributos scope tienen el valor row, col, rowgroup o colgroup.

Resultados esperados

  • Todas las comprobaciones anteriores son verdaderas.

Recursos

Cómo lo comprobamos en ADDAW

En cada auditoría de ADDAW revisamos esta técnica página a página y le entregamos los errores con capturas y la forma de corregirlos.

Solicitar una auditoría

Basado en la técnica H63 del W3C (WCAG 2.2). Explicación y ejemplos: ADDAW. Traducción no oficial del texto del W3C © W3C, licencia de documentos del W3C. ¿Ha visto un error? Escríbanos.