Addaw, anar a la pàgina d'inici Donar

Lliçó 8 de 10 · 11 min de lectura · Revisada el 26/10/2026

Regions actives: aria-live, role="status" i role="alert" (4.1.3)

Estàs llegint una lliçó oberta. Matricula't gratis per fer els tests i els exercicis, desar el teu progrés i aconseguir el certificat.

Les interfícies modernes canvien sense recarregar: apareix «Producte afegit al carretó», el comptador de resultats passa de 120 a 8 en aplicar un filtre, una barra de progrés avança, un xat rep un missatge. Qui veu la pantalla ho percep immediatament. Qui fa servir un lector de pantalla està escoltant una altra part de la pàgina i no se n'assabenta, llevat que el codi ho anunciï. Per a això hi ha les regions actives (live regions), i el criteri 4.1.3 Missatges d'estat (AA, introduït a WCAG 2.1) n'exigeix l'ús: els missatges d'estat s'han de poder determinar per programa mitjançant rol o propietats, de manera que les tecnologies de suport els presentin sense que rebin el focus.

Què és un missatge d'estat

WCAG defineix missatge d'estat com un canvi de contingut que informa la persona de l'èxit o el resultat d'una acció, de l'estat d'espera de l'aplicació, del progrés d'un procés o de l'existència d'errors, i que no suposa un canvi de context. Si el focus es mou al missatge (per exemple, a un diàleg o a un resum d'errors que rep el focus), ja no és un missatge d'estat en el sentit de 4.1.3: la persona el llegirà perquè hi és. El criteri cobreix precisament el que apareix sense moure el focus.

Les eines

  • aria-live="polite": el lector anuncia el canvi quan acabi el que estigui dient. És l'opció per defecte per a gairebé tot.
  • aria-live="assertive": interromp immediatament. Només per a errors o avisos que requereixen atenció urgent.
  • role="status": equival a aria-live="polite" amb aria-atomic="true". Per a confirmacions, comptadors, estats de càrrega.
  • role="alert": equival a aria-live="assertive" amb aria-atomic="true". Per a errors i avisos importants.
  • role="log": per a fluxos on s'afegeix contingut al final (xat, registre d'activitat); polite i no atòmic.
  • aria-atomic="true": anuncia tota la regió, no només el fragment que ha canviat. Imprescindible quan el missatge només té sentit complet («3 de 10 fitxers pujats»).
  • aria-relevant: quins canvis s'anuncien (additions, removals, text); el valor per defecte, additions text, és gairebé sempre l'adequat i rarament cal tocar-lo.
  • aria-busy="true": suspèn els anuncis mentre una regió s'actualitza per parts; quan passa a false, s'anuncia el resultat.

Exemple

Comptador de resultats d'un cercador amb filtres:

<p id="contador" role="status"></p>
<ul id="resultados">…</ul>
function actualizarResultados(lista) {
  pintarLista(lista);
  document.getElementById('contador').textContent =
    `${lista.length} resultats trobats`;
}

En canviar un filtre, el lector acaba de llegir el que estigués llegint i anuncia «8 resultats trobats». La persona no ha d'anar a buscar el número. Fixa't que el paràgraf existeix buit des del principi i que només se'n canvia el text.

Les regles que fan que funcioni

Les regions actives són fràgils: petits detalls d'implementació fan que no s'anunciï res o que s'anunciï massa. Aquestes regles eviten la majoria de fallades:

  1. La regió ha d'existir al DOM abans del canvi. Els lectors de pantalla registren les regions actives quan construeixen l'arbre; si crees el <div role="status"> i hi poses el text en la mateixa operació, molts no l'anuncien. Crea el contenidor buit en carregar la pàgina i insereix-hi el text després.
  2. Canvia el contingut, no la visibilitat. Treure display:none a una regió que ja tenia text no compta com a canvi en diversos lectors. Insereix o modifica el text.
  3. Una regió, un missatge cada vegada. Diverses regions parlant alhora es trepitgen. El més habitual és tenir una regió status i una alert globals, buides, a la plantilla, i escriure-hi des de qualsevol component.
  4. Buida la regió al cap d'uns segons si l'has de reutilitzar, perquè el mateix missatge repetit s'anunciï de nou (alguns lectors no anuncien un text idèntic a l'anterior) i perquè no es llegeixi en navegar per la pàgina.
  5. Sigues breu. Una regió activa no és un lloc per a paràgrafs; una frase curta i concreta.
  6. No posis aria-live en contenidors grans (tot el <main>, una taula sencera): cada canvi provocarà lectures interminables.
  7. assertive és l'excepció, no la norma. Reserva role="alert" per als errors que impedeixen continuar i els avisos de temps (sessió a punt de caducar).

Error freqüent

// Incorrecte: la regió es crea amb el missatge a dins
const aviso = document.createElement('div');
aviso.setAttribute('role', 'alert');
aviso.textContent = 'Error en desar';
document.body.appendChild(aviso);
// Correcte: el contenidor ja existeix a l'HTML, buit
// <div id="aviso-error" role="alert"></div>
document.getElementById('aviso-error').textContent = 'Error en desar';

Hi ha lectors que sí que anuncien el primer cas, però no tots ni sempre. El segon funciona de manera consistent.

Casos típics i l'eina adequada

SituacióSolució
«Afegit al carretó», «Desat», «Copiat»role="status"
Nombre de resultats després de filtrarrole="status"
Error de validació en sortir d'un camp (sense moure el focus)Missatge associat amb aria-describedby; opcionalment una regió status que l'anunciï
Error del servidor que impedeix continuarrole="alert"
La sessió caduca d'aquí a 2 minutsrole="alert" (o un diàleg amb focus si cal actuar)
Barra de progrés d'una pujada<progress> o role="progressbar" amb aria-valuenow; anuncis a status cada 25 %, no cada 1 %
Missatges nous en un xatrole="log"
«Carregant…» mentre arriben les dadesrole="status" amb el text «Carregant resultats» i aria-busy a la regió que s'actualitza
Caràcters restants en un textarearole="status" actualitzat amb moderació (cada 10 caràcters o quan es deixa d'escriure), no a cada tecla

Quan no s'ha de fer servir una regió activa

Si la persona ha d'actuar sobre el que apareix (confirmar, corregir, triar), mou-hi el focus en lloc d'anunciar-ho: un diàleg modal, un resum d'errors enfocable. I si el canvi és la conseqüència directa i evident de l'acció sobre l'element amb focus (marcar una casella, canviar una pestanya), el mateix canvi d'estat de l'element ja s'anuncia; una regió activa duplicaria el missatge.

Punt clau

Un parell de regions buides a la plantilla base (<div role="status"> i <div role="alert">), una funció anunciar(texto, urgente) que escrigui a l'adequada i la buidi al cap d'uns segons, i disciplina per fer servir status gairebé sempre: amb això es compleix 4.1.3 en tota l'aplicació.

Com comprovar-ho

  • Amb NVDA o VoiceOver actiu, provoca cada missatge d'estat sense moure el focus i comprova que s'anuncia una sola vegada i complet.
  • Inspecciona l'HTML inicial: les regions han d'existir buides abans de la interacció.
  • Busca aria-live en contenidors grans i assertive injustificats.
  • Prova el mateix missatge dues vegades seguides: s'ha d'anunciar les dues.

Resum

  • 4.1.3 exigeix que els missatges que apareixen sense moure el focus siguin anunciats per les tecnologies de suport mitjançant rol o propietats ARIA.
  • role="status" (polite, atòmic) per a gairebé tot; role="alert" (assertive) només per a errors i urgències; role="log" per a fluxos.
  • La regió ha d'existir buida al DOM abans d'inserir-hi el text; canvia el contingut, no la visibilitat.
  • Poques regions, missatges curts, sense aria-live en contenidors grans.
  • Si la persona ha d'actuar, mou el focus en lloc d'anunciar.

Portes 3 lliçons d'aquest curs: que no es perdin

Crea el teu compte gratis i desa el que ja has llegit i segueix el curs amb tot:

  • El test d'aquesta lliçó (3 preguntes) per comprovar el que has après
  • Exercicis pràctics amb pàgines reals
  • El teu progrés desat: continues on ho vas deixar, des de qualsevol dispositiu
  • Constància del curs amb les hores i certificat gratuït del nivell 3 quan aprovis l'examen

Entres amb el teu compte de Google o només amb el teu correu electrònic. No cal contrasenya.