Saavutettavuuspuu
Katso myös: a11y tree, accessibility object model, AOM
Sisäinen tietorakenne, jonka selaimet ja käyttöjärjestelmät rakentavat DOM:sta — se kuvaa jokaisen elementin roolin, nimen, tilan ja suhteet. Tämän rakenteen läpi ruudunlukuohjelmat ja muu avustava teknologia kulkevat.
Saavutettavuuspuu on käyttöjärjestelmätason tietorakenne, jota ruudunlukuohjelmat ja muu avustava teknologia todella käyttävät. Kun avaat sivun selaimessa, selain rakentaa kaksi puuta: DOM-puun (tavallisen HTML-hierarkian) ja saavutettavuuspuun, rinnakkaisen rakenteen, joka on johdettu DOM:sta mutta sisältää saavutettavuuden metatiedot.
Saavutettavuuspuun ymmärtäminen selittää noin 80 % muuten hämmentävästä ARIA:n, ruudunlukuohjelmien ja „miksi tämä ei ilmoita mitään?“-vianetsinnän käyttäytymisestä.
Mitä se sisältää
Jokaisella saavutettavuuspuun solmulla on:
- Rooli — mitä elementti on: painike, linkki, otsikko, navigaatio, valintaikkuna.
Se määräytyy HTML-elementtityypistä tai eksplisiittisestä ARIA-attribuutista
role="...". - Nimi — miten elementtiä kutsutaan. Lähteinä ovat nimilapputeksti,
alt-attribuutti,aria-label,aria-labelledbytai laskettu tekstisisältö. - Kuvaus — lisäkonteksti. Lähteenä ovat
aria-describedbytaititle-attribuutit. - Tila — nykyinen tila: painettu, laajennettu, valittu, käsittelyssä. Määräytyy
HTML-attribuuteista (
disabled,required) tai ARIA:sta (aria-pressed,aria-expanded). - Ominaisuudet — suhteet ja metatiedot:
aria-controls,aria-owns,aria-haspopup.
Ruudunlukuohjelmat käyvät tämän puun läpi ja ilmoittavat jokaisen solmun näiden kenttien perusteella. Välilehti- ja nuolinäppäimistönavigointi kulkee puun, ei DOM:n kautta.
Miksi pelkästään visuaalinen sisältö katoaa näkyvistä
<div onclick="..."> jota tyylitellään näyttämään painikkeelta ei saa roolia
saavutettavuuspuussa — selain näkee geneerisen <div>-elementin ja kirjaa sen
tilaksi role="generic" (käytännössä näkymätön avustavalle teknologialle). onclick-
käsittelijä ei siirry saavutettavuuspuuhun, koska saavutettavuuspuu heijastaa
ainoastaan sen, mitä selain päättelee elementin olevan HTML-roolinsa perusteella.
Tästä syystä semanttinen HTML on tärkeää kaikkein perustavanlaatuisimmalla tasolla: ei tyylin tai käytännön vuoksi, vaan koska semanttiset HTML-elementit täyttävät saavutettavuuspuun oikeilla rooleilla automaattisesti. Ei-semanttinen merkintä luo div-viidakkopuun, josta ruudunlukuohjelmat eivät saa selvää.
ARIA:n tehtävä puussa
ARIA on olemassa nimenomaan täydentämään saavutettavuuspuuta tapauksissa, joissa
natiivissa HTML:ssä ei ole vastaavaa elementtiä. role="combobox" käskee selainta
lisäämään combobox-solmun puuhun elementille, joka muuten näkyisi geneerisenä.
aria-expanded="true" asettaa tilaominaisuuden kyseiselle solmulle.
ARIA ei muuta DOM:a. Se muuttaa sen, mitä selain kirjoittaa saavutettavuuspuuhun.
Miten sitä tarkastellaan
Selainten kehittäjätyökalut paljastavat saavutettavuuspuun suoraan:
- Chrome / Edge DevTools — Elementit-paneeli → Saavutettavuus-välilehti (oikea sarake) näyttää valitun solmun lasketut saavutettavuusominaisuudet. „Koko sivun saavutettavuuspuu“-vaihtoehto (Chrome-lippu joissakin versioissa) näyttää puun sivupaneelina.
- Firefox DevTools — Saavutettavuus-paneeli (kuvake työkalurivillä) näyttää erillisen saavutettavuuspuunäkymän, samankaltaisen kuin Elementit-näkymä mutta saavutettavuuspuun käsittein esitettynä.
- Safari Web Inspector — Tarkistus / Saavutettavuus-välilehti tarjoaa vastaavan tarkistusmahdollisuuden.
Kun saavutettavuuspuu on nähtävissä, voidaan empiirisesti vastata kysymykseen „miksi tämä ei ilmoita mitään?“ Vastaus on lähes aina: puun solmulla on eri rooli kuin odotettiin, sen nimi on tyhjä tai sen tila on väärä.
Miksi „saavutettavuuspuu“ on parempi mentaalimalli kuin „ARIA“
Kehittäjät, jotka opiskelevat ARIA:n ymmärtämättä saavutettavuuspuuta, päätyvät lisäilemään ARIA-attribuutteja toivoen, että ruudunlukuohjelmat poimivat ne. Kehittäjät, jotka ymmärtävät saavutettavuuspuun, tietävät, että ARIA:n tehtävä on kirjoittaa tiettyjä kenttiä tiettyihin puun solmuihin, ja että puun suora tarkastelu on nopeampaa kuin arvaileminen.