Lliçó 4 de 10 · 10 min de lectura · Revisada el 26/10/2026
Rols, estats i propietats; nom i descripció accessibles (4.1.2)
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.
El criteri 4.1.2 Nom, funció i valor (A) és el cor de l'accessibilitat de qualsevol component: per a tot element d'interfície, el nom i la funció (rol) s'han de poder determinar per programa; els estats, les propietats i els valors que la persona pot modificar s'han de poder llegir i canviar per programa; i les tecnologies de suport han de rebre la notificació dels canvis. ARIA és el vocabulari amb què expressem tot això quan l'HTML no hi arriba. En aquesta lliçó ordenem aquest vocabulari.
Rols: què és l'element
El rol respon a la pregunta «què és això?». ARIA 1.2 defineix desenes de rols agrupats en categories:
- Rols de giny:
button,checkbox,radio,switch,slider,tab,menuitem,option,combobox,textbox,link… - Rols compostos, que contenen ginys:
tablist,menu,listbox,radiogroup,tree,grid. - Rols d'estructura:
heading(ambaria-level),list,listitem,table,row,cell,img,group,presentation/none. - Rols de landmark:
banner,navigation,main,complementary,contentinfo,search,form,region. - Rols de regió activa:
alert,status,log,timer,marquee. - Rols de finestra:
dialog,alertdialog.
Gairebé tots tenen un equivalent HTML amb rol implícit (<button> és button, <h2> és heading de nivell 2, <nav> és navigation). Escriure el rol explícit sobre l'element natiu equivalent (<button role="button">) és redundant i inútil; les eines el marquen com a avís.
Alguns rols exigeixen una estructura concreta: un tab ha d'estar dins d'un tablist; un option, dins d'un listbox; un row, dins d'un table o grid; un menuitem, dins d'un menu o menubar. Si trenques aquesta jerarquia, el lector no sap interpretar el component.
Estats i propietats: com està i amb què es relaciona
Els atributs aria-* es divideixen en dos grups. Els estats canvien amb la interacció i cal actualitzar-los amb JavaScript:
| Estat | Significat | On es fa servir |
|---|---|---|
aria-expanded | Desplegat o contret | Botons d'acordió, menús, combobox |
aria-pressed | Premut o no (commutador) | Botons d'alternança (negreta, preferit) |
aria-checked | Marcat, no marcat o mixt | Caselles i botons d'opció personalitzats, switch |
aria-selected | Seleccionat | Pestanyes, opcions, files de graella |
aria-disabled | Inhabilitat però perceptible | Controls personalitzats |
aria-invalid | Valor no vàlid | Camps amb error |
aria-current | Element actual d'un conjunt | Enllaç de la pàgina actual, pas actual |
aria-busy | S'està actualitzant | Regions en càrrega |
Les propietats descriuen característiques i relacions més estables:
- Nom i descripció:
aria-label,aria-labelledby,aria-describedby. - Relacions:
aria-controls(quin element controla),aria-owns(fills lògics fora del DOM),aria-activedescendant(quin descendent té el focus virtual). - Rang i valor:
aria-valuemin,aria-valuemax,aria-valuenow,aria-valuetextper a controls lliscants, barres de progrés i mesuradors. - Comportament:
aria-haspopup,aria-modal,aria-multiselectable,aria-required,aria-readonly,aria-level,aria-posinset,aria-setsize. - Visibilitat:
aria-hidden(que WAI-ARIA 1.2 (s'obre en una finestra nova) classifica, en realitat, com a estat).
Exemple
Un interruptor de «Notificacions» construït amb un botó natiu:
<button type="button" role="switch" aria-checked="false" id="notif">
Notificacions per correu
</button>const sw = document.getElementById('notif');
sw.addEventListener('click', () => {
const activo = sw.getAttribute('aria-checked') === 'true';
sw.setAttribute('aria-checked', String(!activo));
});El lector anuncia «Notificacions per correu, interruptor, desactivat» i, en prémer-lo, «activat». Es compleix 4.1.2: nom (el text), funció (switch), estat (aria-checked) i notificació del canvi (el navegador avisa en canviar l'atribut). El teclat el dona el <button>. L'estil visual de l'interruptor es dibuixa amb CSS a partir de [aria-checked="true"], de manera que l'estat visual i el programàtic no se separen mai.
Nom i descripció accessibles
Recordem del curs d'HTML l'ordre de càlcul del nom: aria-labelledby, aria-label, font nativa, title. Hi afegim ara matisos importants:
aria-labelledbypot fer referència a diversosidi els concatena en ordre, inclòs el mateix element. És útil per compondre noms:aria-labelledby="boton-leer titulo-tarjeta"dona «Llegeix-ne més Pressupostos 2025»; si inverteixes l'ordre delsid, el nom serà «Pressupostos 2025 Llegeix-ne més».- L'element referenciat pot estar amagat amb
hiddenoaria-hidden; el seu text es fa servir igualment per al nom. Això permet textos només per al nom sense mostrar-los. aria-labeliaria-labelledbyno funcionen de manera fiable en elements sense rol o amb rols genèrics (div,span) ni en alguns rols de text, comparagraph(el dep),codeostrong, que prohibeixen expressament el nom. Posararia-labelen un<div>sense rol no serveix de res a la pràctica.- La descripció (
aria-describedby) és informació secundària: el lector l'anuncia després del nom, el rol i l'estat, sovint després d'una pausa, i alguns usuaris la desactiven. No posis mai a la descripció res que sigui imprescindible per entendre el control. - Els rols de giny només admeten nom a partir del contingut en alguns casos (
button,link,tab,menuitem,option,checkbox…). Untextbox,comboboxoslidernecessitaaria-label,aria-labelledbyo un<label>.
Error freqüent
<div aria-label="Resultats de la cerca">…</div>
<span aria-label="Preu">189 €</span>En el primer cas l'aria-label s'ignora perquè el <div> no té rol; cal role="region" (o un <section>). En el segon, en alguns navegadors el nom substitueix el contingut i la persona sent «Preu» però no «189 €». Per al text normal, no facis servir aria-label; escriu el text visible que calgui.
Notificar els canvis
L'última part de 4.1.2 diu que les tecnologies de suport han de rebre la notificació dels canvis d'estat. Això passa automàticament quan modifiques els atributs ARIA o les propietats natives (checked, disabled, value) de l'element que té el focus: el navegador genera l'esdeveniment d'accessibilitat corresponent. El que no es notifica és un canvi purament visual: canviar una classe CSS per pintar un botó com a «actiu» sense tocar aria-pressed deixa el lector sense informació. La regla és senzilla: cada estat visual ha de tenir un estat programàtic que l'acompanyi, i l'ideal és que el CSS depengui de l'atribut ([aria-pressed="true"]) i no d'una classe paral·lela.
Punt clau
Per a cada component pregunta't quatre coses: què és? (rol), com es diu? (nom), com està? (estat o valor) i se n'assabenta el lector quan canvia? Si les quatre tenen resposta en el codi, compleixes 4.1.2.
Resum
- El rol diu què és l'element; gairebé sempre l'aporta l'HTML natiu, i els rols explícits han de respectar la jerarquia que exigeix ARIA.
- Els estats (
aria-expanded,aria-checked,aria-selected,aria-current…) canvien amb la interacció i s'han d'actualitzar amb JavaScript; les propietats descriuen relacions i rangs. aria-labeliaria-labelledbynomés funcionen en elements amb rol; no els facis servir en text normal.- La descripció és secundària; el que és imprescindible va al nom o al contingut.
- Fes que el CSS depengui de l'atribut ARIA perquè l'estat visual i el programàtic no se separin mai.
Portes 10 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.