Bevezetés a WAI-ARIA szabvány használatába 2.rész

A cikk témái

Cikksorozatom előző részében a WAI-ARIA szabvány segítségével definiált szemantikai szerepekről volt szó. Ebben a részben a WAI-ARIA által biztosított állapotjellemzéssel ismerkedünk meg.

Emlékeztetőül a WAI-ARIA-ban a role attribútum segítségével bármely HTML jelölőelemről megadhatjuk, hogy annak milyen szemantikai jelentést szánunk. Ezt jellemzően akkor tesszük meg, ha az adott jelölőelemnek eleve nincs szemantikai jelentése (például a div-nek), vagy az adott kontextusban az adott jelölőelemnek speciális szerepet szánunk. Mindezt azért csináljuk, hogy a képernyőolvasó program megértse és továbbítsa az elem valódi szemantikai jelentését.

Sok esetben azonban nem elég pusztán a szemantikai szerep definiálása. Ha olyan elemről van szó, amelyikhez állapot is társítható, akkor az adott pillanatban érvényes állapotinformációt is továbbítanunk kell. Ez jellemzően az interaktív elemeknél fontos.

A WAI-ARIA több tucat aria- előtaggal kezdődő attribútumot definiál a jellemzett elem tulajdonságainak (angolul properties) és aktuális állapotának (angolul states) leírására. Bár a tulajdonság és az állapot hasonló fogalom, a szabvány mégis finoman megkülönbözteti őket. Abból indul ki, hogy például egy webalkalmazásban a tulajdonságok viszonylag ritkán változnak, míg az állapotok a folyamatos interakciók és események hatására sűrűbben.

Példaként vegyünk egy jelölőnégyzetet. Ha a jelölőnégyzetet klasszikus módon az input type="checkbox" segítségével definiáljuk, akkor minden rendszer érteni fogja az elem szemantikáját és az aktuális állapotát is. Vagyis azt, hogy ez egy jelölőnégyzet, ami jelenleg nincs bejelölve. De mi van akkor, ha a fejlesztő valamilyen megfontolásból a jelölőnégyzetet nem így szeretné megvalósítani. Mondjuk kitalálja, hogy a jelölőnégyzetet egy kapcsológombbal helyettesíti, ami vagy be van nyomva vagy nincs. És mindezt úgy csinálja, hogy a kapcsológombot div jelölőelemmel készíti el például így:

<div id="kapcsologomb">
   Kapcsoló
</div>

Ha ehhez a fejlesztő megírja a megfelelő CSS és JavaScript kódokat, akkor kész a kapcsológomb. De sajnos ez a megoldás messze nem akadálymentes, még akkor sem, ha eltekintünk annak feszegetésétől, hogy kikapcsolt JavaScript esetén eleve használhatatlan a dolog.

A fő gond az, hogy a képernyőolvasó a div elemet nem értelmezi, mindössze a benne található szöveget olvassa fel így: Kapcsoló. Ahhoz, hogy az elem valódi szerepére fény derüljön felhasználhatjuk a WAI-ARIA szerepdefiníciós lehetőségét. A WAI-ARIA szerepek között megtalálható a checkbox (jelölőnégyzet) szerep, amit egyszerűen így tudunk hozzárendelni a példánkhoz:

<div id="kapcsologomb" role="checkbox">
   Kapcsoló
</div>

Ezzel megadtunk, hogy a div elemünk tulajdonképpen egy jelölőnégyzet. De hiányzik még az az információ, hogy a jelölőnégyzet jelenleg be van-e jelölve, vagy sem. A WAI-ARIA szabvány szerint a checkbox szerepű elemekhez kötelezően meg kell adni az aria-checked nevű attribútumot, ami a bejelöltség állapotát tükrözi. Ha az attribútum értéke true, akkor a jelölőnégyzet be van jelölve. Ha false, akkor nincs. Elvileg a háromállapotú jelölőnégyzeteknél a szabvány ismeri még a mixed állapotot is, de ez most számunkra nem releváns. Az aktuális állapotot tehát így rendeljük hozzá a példánkhoz:

<div id="kapcsologomb" role="checkbox" aria-checked="false">
   Kapcsoló
</div>

A WAI-ARIA-t ismerő képernyőolvasó programok ehhez az elemhez érve nagyjából ezt fogják felolvasni: Jelölőnégyzet. Nincs bejelölve. Kapcsoló. Sikerült tehát a sima div elemből állapottal rendelkező jelölőnégyzetet csinálnunk.

Persze ettől még a jelölőnégyzetünk nem interaktív, hiszen a viselkedését JavaScript-ben kell leprogramozni. Ott viszont figyelni kell arra, hogy a felhasználói interakció hatására az aria-checked attribútumot is dinamikusan változtassuk. Például ezzel a JavaScript kóddal:

var kapcsologomb = document.getElementById("kapcsologomb");
   kapcsologomb.onclick = function() {
   var ezBejelolt = (this.getAttribute("aria-checked") === "true");
   this.setAttribute("aria-checked",!ezBejelolt);
};

Az így felvértezett jelölőnégyzet már reagálni fog az egérkattintásra, illetve az enter vagy a space billentyű lenyomására is. Sőt a képernyőolvasó az adott esemény hatására lezajló állapotváltást fel is olvassa. Vagyis a bejelöléskor a Bejelölve, a bejelölés visszavonásakor a Nincs bejelölve szöveget.

A teljes akadálymentességhez már csak egy mozzanat van hátra. A kizárólag billentyűzettel navigáló felhasználók számára a jelölőnégyzetünk használhatatlan, ugyanis nincs benne a tabulátorral elérhető elemek között, vagyis nem kapja meg a fókuszt. Ennek kiküszöböléséhez csak annyit kell tennünk, hogy a HTML tabindex attribútumát is megadjuk. Ha ennek értéke 0, akkor az adott elem bekerül a tabulátorral elérhető elemek közé.

<div id="kapcsologomb" role="checkbox" aria-checked="false" tabindex="0">
   Kapcsoló
</div>

Végezetül megjegyzem, hogy további pozitív „mellékhatása” is lehet annak, ha a WAI-ARIA attribútumait használjuk. A modern böngészőprogramok a CSS szabályokban már támogatják az úgynevezett attribútum kiválasztást. Ennek segítségével adott attribútum jelenlététől vagy annak értékétől függően más és más megjelenést lehet definiálni az elemekhez. Természetesen az aria-* attribútumokat is felhasználhatjuk a CSS kiválasztókhoz. Példánkban a kapcsológomb bejelölt állapotának vizuális megjelenését az alábbi CSS kóddal is megadhatjuk:

#kapcsologomb[aria-checked="true"] {
   background-color: #cfc;
}

A cikk példájául szolgáló jelölőnégyzetes demót itt próbálhatja ki.