Addaw, ir a inicio Donar

Técnica ARIA WCAG 2.2

ARIA22Anunciar mensajes de estado con role="status"

Nombre oficial en el W3C: Usar role=status para presentar mensajes de estado

En pocas palabras

Un mensaje de estado informa de un cambio sin mover el foco: «5 resultados», «Producto añadido a la cesta», «Guardado». Si su contenedor lleva role="status", el lector de pantalla lo lee cuando termina lo que está diciendo, sin interrumpir. Así nadie se queda sin saber qué ha pasado.

Por qué es importante

Quien ve la pantalla nota que el contador de la cesta cambia o que aparece «5 resultados». Quien usa lector de pantalla no se entera de ese cambio si nadie se lo anuncia.

Mover el foco hasta el mensaje tampoco es buena idea, porque la persona pierde su sitio. role="status" resuelve las dos cosas: avisa sin interrumpir y sin mover el foco.

Cómo se hace

  1. Ponga en el HTML inicial el contenedor del mensaje con role="status". Debe existir antes de que cambie su contenido.
  2. Añada aria-atomic="true" para que se lea el mensaje entero y no solo la parte que cambia. Algunos navegadores no lo aplican por defecto.
  3. Meta dentro todo lo que da sentido al mensaje, como la palabra «Cesta:» o el icono del carrito con su texto alternativo.
  4. Actualice con JavaScript solo el texto de ese contenedor.
  5. Use role="status" para avisos rutinarios. Deje role="alert" para errores urgentes.

Ejemplo práctico

Ficha de producto de una tienda online. Tiene un indicador de la cesta que cambia al pulsar «Añadir a la cesta». La página no se recarga y el foco no se mueve.

Así no: Contador de la cesta que cambia en silencio

El número de productos cambia en pantalla, pero el contenedor no es una región activa. El lector de pantalla no dice nada al pulsar el botón. La persona no sabe si el producto se ha añadido. Para notarlo, active NVDA o VoiceOver y pulse el botón.

Captura de pantalla del ejemplo incorrecto: Contador de la cesta que cambia en silencio
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
<p id="cesta" class="cesta">Cesta: 0 productos</p>
<h2>Aceite de oliva virgen extra, 1 l</h2>
<p>8,95 €</p>
<button type="button" id="anadir">Añadir a la cesta</button>
<style>
  .cesta { font-weight: bold; color: #412c56; }
  h2 { font-size: 1.1em; margin: .5em 0 .2em; }
</style>
<script>
var n = 0;
document.getElementById('anadir').addEventListener('click', function () {
  n++;
  document.getElementById('cesta').textContent = 'Cesta: ' + n + (n === 1 ? ' producto' : ' productos');
});
</script>

Así sí: Mensaje de estado con role="status"

El contenedor lleva role="status" y aria-atomic="true" desde la carga. Cada cambio se anuncia sin interrumpir y sin mover el foco. Además, se lee el texto completo («Cesta: …»), no solo el número que cambia.

Pruébelo aquí:

Ver el código del ejemplo correcto
<p id="cesta" class="cesta" role="status" aria-atomic="true">Cesta: 0 productos</p>
<h2>Aceite de oliva virgen extra, 1 l</h2>
<p>8,95 €</p>
<button type="button" id="anadir">Añadir a la cesta</button>
<style>
  .cesta { font-weight: bold; color: #412c56; }
  h2 { font-size: 1.1em; margin: .5em 0 .2em; }
</style>
<script>
var n = 0;
document.getElementById('anadir').addEventListener('click', function () {
  n++;
  document.getElementById('cesta').textContent = 'Cesta: ' + n + (n === 1 ? ' producto' : ' productos');
});
</script>

Cómo comprobarlo

Lector de pantalla (NVDA o VoiceOver)

  1. Situar el foco en «Añadir a la cesta» y pulsar Intro o Espacio.
  2. Comprobar que, tras leer el botón, se anuncia el nuevo estado de la cesta sin mover el foco.
  3. Pulsar otra vez y verificar que se anuncia el número actualizado.

Debería anunciar: «Cesta: 1 producto»

Herramientas del navegador

  1. Abrir las herramientas de desarrollo (F12) en la pestaña Elementos.
  2. Comprobar que el contenedor del mensaje ya tiene role="status" en el HTML inicial, antes de pulsar el botón.
  3. En la pestaña Accesibilidad, verificar que la función es «status».
  4. Comprobar que todo el mensaje está dentro de ese contenedor, incluido el contexto («Cesta:» o el texto alternativo de un icono).

Teclado

  1. Pulsar el botón con el teclado. El foco debe quedarse en él: un mensaje de estado no mueve el foco (criterio 4.1.3).

Validación automática

  1. Las herramientas automáticas no detectan un mensaje de estado sin región activa. El criterio 4.1.3 se revisa a mano.
  2. axe DevTools sí avisa si el atributo está mal escrito: valores ARIA no válidos (aria-valid-attr-value) o funciones que no existen (aria-roles).

Errores frecuentes en auditorías

  • Añadir role="status" al contenedor en el mismo momento en que se escribe el mensaje. Ya es tarde para que se anuncie.
  • Poner role="status" en un contenedor con toda la lista de resultados. Se lee entera en cada cambio.
  • Usar role="alert" para confirmaciones rutinarias («Producto añadido»). Interrumpe lo que se esté leyendo.
  • Dejar fuera del contenedor el contexto visual (icono de la cesta, palabra «Cesta:»). Solo se anuncia un número sin sentido.
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 ARIA22 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.

Descripción

Esta técnica usa la función (role) status de la especificación ARIA para notificar a las tecnologías de asistencia cuando el contenido se ha actualizado con información sobre el estado del usuario o de la aplicación. Esto se hace añadiendo role="status" al elemento que contiene el mensaje de estado. La función de región activa (live region) de ARIA status tiene un valor implícito de aria-live igual a polite, lo que permite que el usuario sea notificado a través de la tecnología de asistencia (como un lector de pantalla) cuando se añaden mensajes de estado. La función status también tiene un valor predeterminado de aria-atomic igual a true, de modo que las actualizaciones del contenedor marcado con la función status harán que la tecnología de asistencia presente al usuario todo el contenido del contenedor, incluidas las etiquetas definidas por el autor (o los elementos anidados adicionales). Este contexto adicional puede ser fundamental cuando el texto del mensaje de estado por sí solo no proporciona un equivalente a la experiencia visual. El contenido del contenedor aria-live es leído automáticamente por la tecnología de asistencia, sin que esta tenga que situar el foco en el lugar donde se muestra el texto. Consulte WAI-ARIA status (role) para más detalles.

Tenga en cuenta que, dado que actualmente role="status" no se trata como atómico de forma predeterminada en algunos entornos, es recomendable añadir un aria-atomic="true" explícito si debe anunciarse todo el contenido del contenedor.

Ejemplos

Incluir un mensaje con los resultados de una búsqueda

Después de que el usuario pulse un botón de búsqueda, el contenido de la página se actualiza para incluir los resultados de la búsqueda, que se muestran en una sección debajo del botón. El cambio de contenido también incluye el mensaje "5 results returned" (se han devuelto 5 resultados) cerca de la parte superior de este nuevo contenido. A este texto se le asigna una función apropiada para un mensaje de estado. Un lector de pantalla anunciará "5 results returned".

<div role="status" aria-atomic="true">5 results returned.</div>

Ejemplo funcional: role=status en resultados de búsqueda

Actualizar el estado del carrito de la compra

Después de que el usuario pulse un botón de añadir al carrito de la compra, el contenido situado junto al icono del carrito se actualiza para mostrar "1 items" (1 artículos). El contenedor de este texto (en este caso un <p>) está marcado con role="status". Como aporta contexto visual, la imagen del carrito de la compra, con un texto alt breve y preciso, también se coloca dentro del contenedor. Gracias al valor de aria-atomic, un lector de pantalla anunciará "Shopping cart, six items" (carrito de la compra, seis artículos).

<p role="status" aria-atomic="true">
  <img src="shopping-cart.png" alt="Shopping Cart">
  <span id="cart">0</span> items
</p>

Ejemplo funcional: role=status en un carrito de la compra

Pruebas

Procedimiento

Para cada mensaje de estado:

  1. Comprobar que el contenedor destinado a albergar el mensaje de estado tiene un atributo role con el valor status antes de que se produzca el mensaje de estado.
  2. Comprobar que, cuando se desencadena el mensaje de estado, este se encuentra dentro del contenedor.
  3. Comprobar que los elementos o atributos que proporcionan información equivalente a la experiencia visual del mensaje de estado (como una imagen de carrito de la compra con un texto alt adecuado) también residen en el contenedor.

Resultados esperados

  • Las comprobaciones n.º 1, n.º 2 y n.º 3 son verdaderas.

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