Lliçó 3 de 10 · 14 min de lectura · Revisada el 26/10/2026
Com veu la pàgina un motor de regles: DOM, arbre d'accessibilitat i moment de l'anàlisi
Estàs llegint una lliçó oberta. Matricula't per fer els tests i els exercicis, desar el teu progrés i aconseguir el certificat.
Matricula-m'hi · nivell 4 (49 €)Com vam veure a la lliçó anterior, una eina automàtica només pot comprovar el que és verificable mecànicament. Per interpretar-ne els resultats cal saber, a més, què veu exactament: no el codi de l'equip de desenvolupament ni la pantalla de la persona usuària, sinó una fotografia del DOM i dels estils calculats en un instant concret. Aquesta lliçó obre la caixa: què analitza el motor, com està construïda una regla, com calcula el nom accessible i el contrast, i què se li escapa. Amb això entendràs l'origen de molts falsos positius i negatius.
Del codi font a l'arbre d'accessibilitat
Entre el que envia el servidor i el que rep un lector de pantalla hi ha quatre capes, i cada eina treballa sobre una de diferent:
- Codi font: l'HTML que retorna el servidor (el que veus amb Ctrl + U). En una aplicació d'una sola pàgina pot ser poc més que un
<div id="app">buit. - DOM: l'arbre de nodes que construeix el navegador després d'analitzar l'HTML i executar el JavaScript. És el que mostra el panell Elements i canvia amb cada interacció.
- Estils calculats: el resultat final de la cascada CSS per a cada element (color, mida, visibilitat, posició).
- Arbre d'accessibilitat: el que el navegador exposa a les tecnologies de suport mitjançant les API d'accessibilitat del sistema operatiu (UI Automation i IAccessible2 a Windows, NSAccessibility a macOS, AT-SPI a Linux): rol, nom, estat i relacions de cada objecte.
Els motors de regles com axe-core o el d'IBM Equal Access s'executen com a JavaScript dins de la pàgina. Llegeixen el DOM i els estils calculats i, amb ells, reconstrueixen la seva pròpia aproximació a l'arbre d'accessibilitat: no consulten el que genera el navegador. Per això el nom accessible que calcula axe pot no coincidir, en casos límit, amb el que mostra el panell Accessibility de Chrome o amb el que anuncia NVDA. El validador Nu HTML, en canvi, analitza el codi font quan li dones un URL: no executa JavaScript i no veu el DOM final.
Exemple
El portal de cita prèvia d'un organisme està fet amb un framework de JavaScript. El seu codi font és aquest:
<body>
<div id="app"></div>
<script src="/assets/main.js"></script>
</body> Validat per URL al Nu HTML Checker, no apareix cap problema del formulari, perquè no existeix en el codi servit. Per validar-lo cal copiar l'HTML del DOM generat (al panell Elements, «Copia l'element») i enganxar-lo a l'entrada de text del validador. axe sí que analitza el formulari, perquè treballa sobre el DOM renderitzat.
Infografia · Procés
Com analitza una pàgina un motor de regles
Del DOM renderitzat al resultat: cada pas explica un tipus de fals positiu o negatiu
- Pas 1: 1. Carregar i renderitzarEl navegador construeix el DOM, executa el JavaScript i calcula els estils
- Pas 2: 2. Fixar l'estatEl que no estigui obert, carregat o visible en aquell instant no s'analitza
- Pas 3: 3. Seleccionar elementsCada regla tria a quins elements s'aplica; si no n'hi ha cap, és inaplicable
- Pas 4: 4. Executar comprovacionsAtributs, nom accessible, rols i contrast calculat; mai el significat
- Pas 5: 5. ClassificarPassa, falla, necessita revisió o inaplicable, element per element
- Pas 6: 6. InformarRegla, selector, codi i criteri WCAG etiquetat, pendent de verificar
Llegeix la infografia com a text
Procés de sis passos en seqüència. Pas 1, carregar i renderitzar: el navegador construeix el DOM, executa el JavaScript i calcula els estils. Pas 2, fixar l'estat: l'anàlisi és una fotografia, i el que no estigui obert, carregat o visible en aquell instant no s'analitza. Pas 3, seleccionar elements: cada regla tria a quins elements s'aplica i, si no n'hi ha cap, el resultat és inaplicable. Pas 4, executar comprovacions: atributs, nom accessible calculat, rols i contrast a partir dels estils, sense avaluar el significat. Pas 5, classificar cada element com a passa, falla, necessita revisió o inaplicable. Pas 6, informar: identificador de la regla, selector, fragment de codi i criteri WCAG amb què està etiquetada la regla, que l'auditor ha de verificar.
Anatomia d'una regla
Totes les regles automàtiques segueixen el mateix esquema, tant a axe-core com en el format ACT Rules del W3C que vam veure a la primera lliçó:
- Aplicabilitat: a quins elements s'aplica la regla. Per exemple,
image-alts'aplica als elementsimgque no estan ocults. Si no n'hi ha cap, el resultat és «inaplicable». - Comprovacions: a axe s'agrupen en tres tipus: any (n'hi ha prou que en passi una: l'
imgtéalt, oaria-label, oaria-labelledbyvàlid, o rol de presentació), all (han de passar totes) i none (no se n'ha de donar cap, com un atribut ARIA prohibit). - Resultat per element: passa, falla o, si alguna comprovació no pot decidir, «necessita revisió» (incomplete).
El que és important és el que no forma part de cap comprovació: el significat. La regla button-name passa si el botó té text intern, aria-label, aria-labelledby que apunti a text o title. Un botó anomenat «Botó1» o «Click» passa exactament igual que un d'anomenat «Demanar cita».
Com calcula el nom accessible
El nom accessible es calcula segons l'especificació del W3C Accessible Name and Description Computation (accname 1.2) i les regles de cada llenguatge (HTML-AAM). Simplificant, l'ordre de prioritat és:
aria-labelledby(encara que el text referenciat estigui ocult).aria-label.- El mecanisme natiu del llenguatge:
labelassociat,alt,caption,legend,valued'un botó de tipusinput. - El contingut del mateix element, quan el rol ho permet (botons, enllaços, encapçalaments, cel·les).
titlei, com a últim recurs en els camps,placeholder.
La conseqüència pràctica és que el que va primer substitueix el que va després. Un aria-label oculta el text visible del botó, i l'eina només comprova que el nom existeix:
<!-- Passa button-name, però el nom no conté el text visible -->
<button type="submit" aria-label="Enviar el formulari">Cercar</button>
<!-- Correcte: el nom surt del text visible -->
<button type="submit">Cercar</button> Qui fa servir control per veu dirà «prémer Cercar» i no passarà res, perquè el nom és «Enviar el formulari»: incompleix el 2.5.3 Etiqueta en el nom. axe té una regla per a aquest cas (label-content-name-mismatch), però és experimental i ve desactivada per defecte, així que a la pràctica és un fals negatiu.
Punt clau
Quan dubtis d'un resultat sobre noms, no discuteixis amb l'eina: obre el panell Accessibility de Chrome (o l'Inspector d'accessibilitat de Firefox), selecciona l'element i mira el nom calculat pel navegador i de quin atribut prové. Aquest és el nom que rebran les tecnologies de suport.
Com calcula el contrast
Per a la regla de contrast, el motor obté el color calculat del text (inclosa la seva opacitat) i busca què hi ha al darrere: recorre els elements apilats en aquell punt i combina les capes semitransparents fins a arribar a un fons opac. Després calcula la luminància relativa de tots dos colors amb la fórmula de les WCAG 2.x i decideix el llindar segons la mida: 4,5:1 per a text normal i 3:1 per a text gran, que les WCAG defineixen com a 18 punts o 14 punts en negreta (uns 24 px i 18,66 px CSS).
El càlcul funciona bé amb colors plans. Quan darrere del text hi ha una imatge, un degradat, un pseudoelement, una ombra de text o un element superposat, el motor no pot assegurar el color de fons i el deixa com a «necessita revisió». També mesura només l'estat present en el moment de l'anàlisi: si vols mesurar el focus o el pas del punter, has de forçar aquest estat (a Chrome, panell Estils, botó :hov, «Força l'estat de l'element») i tornar a analitzar. En els casos límit de mida, com un text de 18 px en negreta, confirma a mà la mida calculada abans d'acceptar el llindar que ha aplicat l'eina.
Les zones cegues: el que el motor no arriba a veure
Tot el que no és al DOM, o en l'estat adequat, quan prems «Analitzar», no existeix per a l'eina.
| Situació | Què fa el motor | Què has de fer |
|---|---|---|
| Menús, modals, errors de formulari o resultats que apareixen en interactuar | Només els analitza si estan oberts en aquell moment; els elements amb display: none s'ignoren | Posar la pàgina en cada estat de la mostra i tornar a analitzar |
| Contingut carregat de manera diferida (desplaçament infinit, càrrega mandrosa) | Analitza només el que ja s'ha carregat | Desplaçar-se fins al final o provocar la càrrega abans d'analitzar |
| Iframes, sobretot de tercers (mapes, xats, passarel·les de pagament) | Les extensions intenten injectar el motor a cada marc, però restriccions de seguretat o de càrrega els poden deixar fora | Comprovar als resultats que el contingut del marc s'ha analitzat |
| Components amb Shadow DOM | axe recorre el Shadow DOM obert; el tancat no és accessible des de JavaScript | Revisar a mà els components amb arrel tancada |
canvas, WebGL, vídeo i àudio | No en veu el contingut; com a molt, si existeix un contingut alternatiu o una pista de subtítols | Avaluació manual completa |
| Disseny adaptable | Analitza el disseny de la mida de finestra actual | Repetir-ho amb amplada de mòbil (320 px CSS) i d'escriptori |
| Criteris que comparen pàgines (3.2.3, 3.2.4, 3.2.6) | Analitza cada pàgina per separat i no compara | Comparar la mostra a mà |
Error freqüent
Analitzar només l'estat inicial de cada pàgina. L'informe diu «sense violacions automàtiques» a la pàgina de demanar cita, però ningú no va obrir el calendari, ningú no va enviar el formulari buit i ningú no va desplegar el menú amb amplada de mòbil. En repetir l'anàlisi en aquests tres estats apareixen camps sense nom, un botó de tancament buit i un missatge d'error amb contrast 2,8:1.
Prova-ho tu
- Obre un web que tingui un menú desplegable o una finestra modal i executa axe DevTools en l'estat inicial. Anota el nombre de violacions i d'elements per revisar.
- Obre el menú o la modal i torna a analitzar. Compara les xifres.
- A Chrome, obre les eines per a desenvolupadors, selecciona un botó al panell Elements i obre la pestanya Accessibility: observa el nom calculat i de quin atribut prové.
Resum
- Els motors de regles analitzen el DOM i els estils calculats en un instant i reconstrueixen la seva pròpia versió de l'arbre d'accessibilitat; el validador Nu analitza el codi servit.
- Cada regla té una aplicabilitat i unes comprovacions (any, all, none); cap no avalua el significat.
- El nom accessible segueix un ordre de prioritat (aria-labelledby, aria-label, mecanisme natiu, contingut, title): el que va primer substitueix el següent i pot provocar fallades del 2.5.3 que l'eina no veu.
- El contrast es calcula bé sobre colors plans; imatges, degradats, superposicions i estats exigeixen mesura manual.
- Estats d'interacció, càrrega diferida, iframes, Shadow DOM tancat, canvas, disseny adaptable i comparacions entre pàgines són zones cegues que cal cobrir a mà.
Portes 7 lliçons d'aquest curs: que no es perdin
Crea el teu compte 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 del nivell 4 quan aprovis l'examen
Entres amb el teu compte de Google o només amb el teu correu electrònic. No cal contrasenya.
Matricula-m'hi · nivell 4 (49 €)