Lliçó 6 de 10 · 13 min de lectura · Revisada el 26/10/2026
Relacions entre elements: referències per id i propietats de relació
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.
L'HTML expressa moltes relacions per imbricació (un <li> pertany a la llista que el conté) o amb atributs natius (<label for>, headers a les taules). Quan la relació no es pot expressar així, perquè el text d'ajuda és lluny del camp, la llista de suggeriments es pinta al final del document o el ressaltat es mou per una llista sense que es mogui el focus real, ARIA ofereix propietats de relació. A la lliçó sobre rols i estats vas veure com es compon un nom amb aria-labelledby; aquí repassem el conjunt de relacions, com funcionen les referències per id en què es basen i quin suport real té cadascuna.
Com funcionen les referències per id
Gairebé totes les propietats de relació apunten a altres elements mitjançant el seu id. Unes admeten un sol identificador (aria-activedescendant, i a ARIA 1.2 també aria-errormessage i aria-details) i d'altres una llista separada per espais (aria-labelledby, aria-describedby, aria-controls, aria-owns). Les regles són senzilles, però s'incompleixen constantment:
- L'identificador ha de ser únic al document. Si hi ha dos elements amb el mateix
id, el navegador en farà servir un (normalment el primer) i el resultat dependrà de l'ordre en què es va pintar la pàgina. - La destinació ha d'existir quan el navegador calcula la relació. Una referència a un
idinexistent no dona cap error visible: simplement no hi ha nom, ni descripció, ni relació. - Els identificadors distingeixen majúscules i minúscules:
ayuda-DNIiayuda-dnisón diferents. - Les referències no travessen el Shadow DOM. En un component web amb shadow root (l'arbre encapsulat d'un component personalitzat), un
aria-labelledbyde l'interior no pot apuntar a uniddel document principal, ni a l'inrevés. Si treballes amb components web, el text del nom o de la descripció ha de viure dins del mateix arbre que el control. - Els components reutilitzables necessiten identificadors per instància. Un camp que es pinta dues vegades a la mateixa pàgina amb
id="ayuda"fix trenca les dues relacions. Genera identificadors únics (a React, per exemple, ambuseId).
Error freqüent
<!-- Component «camp amb ajuda» fet servir dues vegades al mateix formulari -->
<label for="campo">Telèfon</label>
<input id="campo" aria-describedby="ayuda">
<p id="ayuda">Nou xifres, sense prefix</p>
<label for="campo">Correu electrònic</label>
<input id="campo" aria-describedby="ayuda">
<p id="ayuda">T'hi enviarem el justificant</p>El segon camp es queda sense etiqueta i rep l'ajuda del primer (mentre que el primer pot acabar amb les dues etiquetes com a nom); en prémer la segona etiqueta, el focus salta al primer camp. Visualment tot sembla correcte. Les eines automàtiques detecten els id duplicats: és una de les fallades que més rendibilitza passar-les a cada versió.
Les propietats de relació, una per una
| Propietat | Per a què serveix | Suport i precaucions |
|---|---|---|
aria-labelledby | Calcular el nom a partir del text d'altres elements | Molt bo. Té prioritat sobre qualsevol altra font de nom |
aria-describedby | Associar una descripció: format esperat, ajuda, missatge d'error | Molt bo. El text es llegeix aplanat, sense estructura |
aria-controls | Indicar quin element modifica el control (botó i panell, combobox i llista) | Pocs lectors l'aprofiten (JAWS ofereix saltar a l'element controlat). Posa'l quan l'APG (s'obre en una finestra nova) ho indiqui, però no hi transmetis res imprescindible |
aria-owns | Declarar com a fills elements que al DOM són en un altre lloc | Desigual entre navegadors. Gairebé sempre és millor moure l'element al DOM |
aria-activedescendant | Assenyalar quin descendent està actiu mentre el focus real continua al contenidor o al camp | Bo en els patrons de l'APG (combobox, listbox, graella). Exigeix gestionar a mà el ressaltat visual i el desplaçament |
aria-errormessage | Associar el missatge d'error a un camp; només es té en compte si el camp té aria-invalid="true" | Irregular. Combina'l amb aria-describedby o fes servir només aquest últim |
aria-details | Enllaçar amb informació extensa i estructurada (una nota, un comentari, l'explicació d'un gràfic) | Limitat. Ofereix, a més, un enllaç o un text visible |
aria-flowto | Proposar un ordre de lectura alternatiu | Molt limitat. No el facis servir per arreglar un ordre del DOM incorrecte; corregeix l'ordre (1.3.2) |
Punt clau
Les relacions amb més bon suport són les que alimenten el nom i la descripció (aria-labelledby i aria-describedby) i aria-activedescendant dins de patrons coneguts. Per a tota la resta, la millor relació és la que expressa el mateix DOM: l'element correcte, al lloc correcte i en l'ordre correcte.
aria-activedescendant: el focus que no es mou
En un cercador de municipis amb autocompletació, la persona escriu en un camp de text i, amb les fletxes, recorre els suggeriments. El focus real no pot sortir del camp, perquè llavors deixaria de poder escriure. La solució és aria-activedescendant: el camp conserva el focus i el seu atribut indica, mitjançant l'id, quina opció està activa en cada moment. El lector anuncia aquesta opció com si tingués el focus.
<label for="municipio">Municipi</label>
<input id="municipio" type="text" role="combobox"
aria-autocomplete="list" aria-expanded="true"
aria-controls="sugerencias" aria-activedescendant="mun-3">
<ul id="sugerencias" role="listbox" aria-label="Suggeriments">
<li id="mun-1" role="option">Cartagena</li>
<li id="mun-2" role="option">Lorca</li>
<li id="mun-3" role="option" aria-selected="true">Múrcia</li>
</ul>Perquè funcioni, el codi té quatre obligacions:
- Actualitzar
aria-activedescendantamb cada fletxa i buidar-lo (o treure'l) quan la llista es tanca. - Donar un
idúnic a cada opció i apuntar només a elements que existeixin i que siguin descendents de l'element amb focus o, en un combobox, opcions de la llista que controla. - Dibuixar amb CSS el ressaltat de l'opció activa, perquè el navegador no ho fa: sense això s'incompleix 2.4.7 Focus visible per a qui veu la pantalla.
- Desplaçar la llista perquè l'opció activa quedi a la vista.
L'alternativa és el roving tabindex (moure el focus real entre els elements, amb tabindex="0" a l'actiu i -1 a la resta), que vas veure al curs N3-C3. Fes servir aria-activedescendant quan el focus s'hagi de quedar en un camp de text i el roving tabindex en els altres casos; els patrons complets es desenvolupen al curs N3-C5.
Posició i mida en conjunts
El lector calcula «element 3 de 20» comptant els elements que hi ha al DOM. Si la llista està paginada o virtualitzada (només existeixen al DOM les files visibles), aquest recompte és fals. ARIA permet declarar la posició i el total reals:
aria-setsizeiaria-posinset: mida del conjunt i posició de l'element, en llistes, opcions, pestanyes, elements d'arbre o articles d'unfeed. Si el total és desconegut, ARIA 1.2 admetaria-setsize="-1".aria-level: nivell d'imbricació en arbres i en encapçalaments construïts ambrole="heading".aria-rowcount,aria-rowindex,aria-colcountiaria-colindex: files i columnes reals d'una taula o graella de la qual només es pinta una part.
Exemple
El catàleg de tràmits d'una seu electrònica té 1.250 entrades i en carrega 20 cada vegada. Sense més informació, el lector anuncia «1 de 20» al primer resultat de la tercera tanda. Amb la posició real:
<ul aria-label="Tràmits">
<li aria-posinset="41" aria-setsize="1250">…</li>
<li aria-posinset="42" aria-setsize="1250">…</li>
</ul>El suport d'aquests atributs en llistes simples varia entre lectors; prova-ho. I no oblidis el text visible equivalent («Es mostren 41-60 de 1.250»), que ajuda tothom.
Descripcions: quant i què
Que aria-describedby tingui un bon suport no vol dir que admeti qualsevol cosa. La descripció es llegeix després del nom, el rol i l'estat, aplanada en un únic text: sense encapçalaments, sense llistes i sense enllaços operables. Per això:
- Mantén-la breu: format esperat, una restricció, el missatge d'error.
- No apuntis a blocs llargs (les condicions d'ús completes): es llegiran sencers cada vegada que el camp rebi el focus, i la persona no hi podrà navegar.
- No apuntis a contingut interactiu: l'enllaç que contingui es llegirà com a text, però no es podrà activar des d'allà.
- Si necessites diverses peces (ajuda i error), fes servir una llista d'identificadors en l'ordre en què vols que es llegeixin:
aria-describedby="error-dni ayuda-dni".
Prova-ho tu
Busca un formulari amb textos d'ajuda (el d'alta en un servei o el d'una sol·licitud en una seu electrònica). Inspecciona un camp: té aria-describedby?, el panell Accessibilitat mostra una descripció? Copia l'identificador i comprova a la consola quants elements el tenen amb document.querySelectorAll('[id="ayuda-dni"]').length, substituint-ne el valor. Si dona 0, la referència està trencada; si dona més d'1, està duplicada.
Consulta la definició formal de cada propietat a l'especificació, per exemple la d'aria-activedescendant a WAI-ARIA 1.2.
Resum
- Les relacions ARIA es basen en referències per
id: únics, existents, amb les majúscules exactes i dins del mateix arbre de Shadow DOM. aria-labelledby,aria-describedbyiaria-activedescendanttenen un bon suport;aria-controls,aria-owns,aria-details,aria-errormessageiaria-flowtoel tenen limitat o desigual.aria-activedescendantmanté el focus al camp i assenyala l'opció activa, però el ressaltat visual i el desplaçament són responsabilitat teva.- En llistes paginades o virtualitzades,
aria-setsizeiaria-posinset(i els seus equivalents per a files i columnes) donen la posició real. - Les descripcions han de ser breus, sense contingut interactiu i en l'ordre de lectura desitjat.
Portes 5 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.