Az aktuális elem jelzése akadálymentesen

A cikk témái

Ha logikailag összetartozó elemek halmazából szeretnénk kiemelni egyet, mondjuk az aktuálisat, akkor több akadálymentességi szempontra is figyelnünk kell.

Klasszikus példa a navigációs menü, ahol az aktuálisan megjelenített oldal menüpontját szoktuk kiemelni a többi menüpont közül. Fontos tisztázni, hogy ezt a kiemelést nem a dizájn miatt csináljuk, hanem azért, hogy a felhasználóink számára egyfajta „Ön itt van” tájékozódási pontot adjunk.

Hagyományosan ezt úgy oldjuk meg, hogy első lépésben az aktuális menüpont <a> jelölőelemét egy megkülönböztető osztálynévvel látjuk el. Tételezzük fel, hogy példánkban az aktuális menüpont a Rólunk, amihez mondjuk az aktualis nevű osztályt társítjuk:

<nav>
<ul>
<li><a href="/">Főoldal</a></li>
<li><a href="rolunk" class="aktualis">Rólunk</a></li>
<li><a href="kapcsolat">Kapcsolat</a></li>
</ul>
</nav>

Természetesen ezt a megkülönböztetést még egyetlen felhasználónk sem fogja érzékelni. A class definiálása önmagában még nem eredményez látható változást a weboldalon, és a képernyőolvasó programok sem olvassák fel a class értékét.

Ha viszont a megadott osztálynévre hivatkozva definiálunk egy olyan CSS szabályt, ami a menüpont megjelenését elkülöníti a többitől, akkor első körben legalább a vizuális kiemelést megoldottnak tekinthetjük.

Akadálymentes vizuális kiemelés

Akadálymentességi szempontból nagyon nem mindegy, hogy milyen is az aktuális menüpont vizuális kiemelése. Például a következő CSS szabály biztosan nem jó:

.aktualis {
color: red;
}

Azért nem jó, mert az aktuális menüpontot kizárólag eltérő betűszín jelöli. Ezzel gondot okozhatunk például a színvak, illetve színtévesztő felhasználóknak, a monokróm e-book olvasóval internetező felhasználóknak, és azoknak a gyengénlátó felhasználóknak is, akik böngészőjüket vagy operációs rendszerüket nagy kontrasztú üzemmódban használják.

A következő ábrán jól látszik a probléma. A legfelső képernyőfotón az aktuális menüpontot feltűnő piros szín jelzi. A középső képernyőfotó egy szimulált kép arról, hogy egy színtévesztő felhasználó (aki például nem érzékeli a piros színárnyalatokat) hogyan látná ugyanezt a menüt. Neki az aktuális és a többi menüpont színe nagyon hasonló lesz, ezért a kiemelés elsikkadhat. A legalsó képernyőfotó azt mutatja, hogy a Windows nagy kontrasztú üzemmódjában hogyan jelenik meg a kiindulási menü. Ebben az üzemmódban az összes link egyforma színű, tehát teljesen eltűnik az aktuális menüpont megkülönböztetése.

Három képernyőfotó egymás alatt, ugyanarról a navigációs menüről, amiben a főoldal, a rólunk és a kapcsolat menüpontok látszanak. Az aktuális menüpont csak színnel van kiemelve.
Ugyanaz a navigációs menü három különböző „nézőpontból”.

Sokkal jobb megoldás, ha az eltérő betűszín mellett (vagy helyett) egy másik – színektől független – vizuális megkülönböztetést is alkalmazunk. Szóba jöhet például a CSS font-weight tulajdonságával megvalósított betűvastagítás:

.aktualis {
color: red;
font-weight: bold;
}

De azért azt mindig vizsgáljuk meg, hogy az alkalmazott betűcsaládnál önmagában a vastagítás mennyire szembetűnő.

Három különböző képernyőfotó egymás alatt, ugyanarról a navigációs menüről. Az aktuális menüpontot a színnel történő kiemelés mellett betűvastagítás is jelzi.
Kérdés, hogy a betűvastagítás vajon elég feltűnő-e a színtévesztők, és a Windows nagy kontrasztú üzemmódját használó gyengénlátók számára.

Érdemes megfontolni a szegély (vagyis a CSS border) használatát, akár úgy is, hogy a szegély nem körben, hanem csak az egyik irányban látszik.

.aktualis {
color: red;
border-bottom: 5px solid;
}
Három különböző képernyőfotó egymás alatt, ugyanarról a navigációs menüről. Az aktuális menüpontot a színnel történő kiemelés mellett aláhúzás is jelzi.
A szegélyezéssel történő kiemelést a színtévesztők, és a Windows nagy kontrasztú üzemmódját használó gyengénlátók is jól láthatják.

Sok honlapnál eltérő háttérszín, vagy eltérő háttérkép jelzi az aktuális menüpontot. Például így:

.aktualis {
background-color: red;
}

Önmagában ez a megoldás sem jó.

Egyrészt ebben az esetben is érvényes, hogy a szín önmagában nem különböztethet meg elemeket. Persze ha a többi menüpontnak nincs kitöltött háttere, vagy ha kellően elkülöníthető háttérszíneket alkalmazunk, akkor várhatóan egy színtévesztő felhasználónak sem okoz majd problémát az aktuális menüpont beazonosítása.

Ellenben azok a gyengénlátó felhasználók, akik az említett nagy kontrasztú üzemmódot használják már komoly gondban lesznek. A nagy kontrasztú üzemmódban ugyanis eltűnnek a weboldalról a háttérszínek és a CSS-ben definiált háttérképek, így eltűnik az aktuális menüpont kiemelése is. Magyarul, ezen felhasználóink számára vizuálisan teljesen egyformák lesznek a menüpontok.

Három különböző képernyőfotó egymás alatt, ugyanarról a navigációs menüről. Az aktuális menüpont háttere eltérő színnel van kitöltve.
A kitöltött hátteret a színtévesztő felhasználók még érzékelhetik, de a nagy kontrasztú üzemmódot használó gyengénlátók már nem.

A megoldás ebben az esetben is az, hogy valamilyen egyéb megkülönböztetést is alkalmaznunk kell, ami nem fog eltűnni a nagy kontrasztú üzemmódban. A korábban említett betűvastagítás vagy szegélyezés itt is működhet.

Létezik például egy trükk, amikor az aktuális menüpont köré, vagy valamelyik oldalára egy olyan színű szegélyt teszünk, mint a kiemelés háttérszíne:

.aktualis {
background-color: red;
border: 1px solid red;
}

Ez azért jó, mert a sztenderd megjelenéskor a szegély vizuálisan összeolvad a háttérrel, vagyis a felhasználó magát a szegélyt nem veszi észre. Ellenben a nagy kontrasztú üzemmódban a háttérszín eltűnik, de megmarad a szegély, mint vizuális jelzés.

Három különböző képernyőfotó egymás alatt, ugyanarról a navigációs menüről. Az aktuális menüpont háttere eltérő színnel van kitöltve.
A szegély csak a nagy kontrasztú üzemmódban jelenik meg keretként.

Hallható kiemelés

Mondanom sem kell, hogy az eddig tárgyalt vizuális kiemelések a vak felhasználók számára abszolút használhatatlanok. A képernyőolvasó programok ezeket a CSS-ben definiált vizuális kiemeléseket értelemszerűen nem olvassák fel.

Tehát egy olyan megoldást kell alkalmaznunk, ami – az akadálymentes vizuális megkülönböztetéssel párhuzamosan – hallhatóvá is teszi a kiemelést. A hallhatóságot viszont csak a HTML kódban tudjuk biztosítani.

Vizuálisan rejtett magyarázószöveg

Az egyik ilyen megoldás, hogy az aktuális menüpont szövegét kiegészítjük egy olyan magyarázószöveggel, ami a menüpont kiemelésének indokára utal. Például: aktuális oldal, jelenlegi oldal, vagy Ön itt van. Természetesen ezt a magyarázószöveget vizuálisan nem szeretnénk megjeleníteni, tehát azt az elrejtési technikát alkalmazzuk rajta, hogy hallható legyen, de ne legyen látható.

<nav>
<ul>
<li><a href="/">Főoldal</a></li>
<li><a href="rolunk" class="aktualis">Rólunk<span class="vizualisanrejtett"> (aktuális oldal)</span></a></li>
<li><a href="kapcsolat">Kapcsolat</a></li>
</ul>
</nav>

A magyarázószöveget nem kötelező zárójelek közé tenni, de az sem feltétlenül jó, ha a menüpont szövege és a magyarázószöveg mondatszerűen „összeolvasódik”. Tapasztalatom alapján ez a megoldás a képernyőolvasó programoknál jellemzően ereszkedő hanglejtést, vagy magának a zárójelezésnek a beolvasását eredményezi, így a vak felhasználóknak talán kicsit könnyebb értelmezni a magyarázatot. De ugyanígy jó lehet a kettősponttal történő elválasztás is.

Magyarázószöveg logikai kapcsolattal

Elsőre talán furcsa, de működőképes megoldás lehet az is, ha a magyarázószöveget nem közvetlenül a menüpont szövegébe illesztjük, hanem a menüponttól teljesen független, önálló jelölőelembe. Az aktuális menüpont linkje és a magyarázószöveg jelölőeleme között az aria-describedby attribútum teremti meg a magyarázatot jelentő logikai kapcsolatot.

Az aria-describedby attribútum a magyarázószöveg jelölőelemének id attribútumára hivatkozik. A magyarázószöveg a HTML5 hidden attribútumával van elrejtve, ami ugyan teljes (azaz vizuális és hallható) rejtést jelent, de az aria-describedby kapcsolat mentén mégis felolvasásra kerül.

<nav>
<ul>
<li><a href="/">Főoldal</a></li>
<li><a href="rolunk" class="aktualis" aria-describedby="aktualis">Rólunk</a></li>
<li><a href="kapcsolat">Kapcsolat</a></li>
</ul>
<div id="aktualis" hidden>aktuális oldal</div>
</nav>

Így az aktuális menüpont szövege és a magyarázószöveg között mindenképpen egy hallható szünet lesz. Sőt van olyan képernyőolvasó program is, amelyik előbb beolvassa, hogy Rólunk, hivatkozás, majd utána, hogy aktuális oldal. (Az előző megoldásnál Rólunk, aktuális oldal, hivatkozás a felolvasás sorrendje.)

Megjegyzem, ezzel a megoldással okafogyottá válhat a class=”aktualis” attribútum használata, hiszen a vizuális kiemelésre az aria-describedby attribútumra hivatkozó CSS szabályt is használhatjuk. Például így:

[aria-describedby="aktualis"] {
background-color: red;
border: 1px solid red;
}

A link elhagyása

Weboldalak használhatóságával foglalkozó szakemberek közül sokan állítják, hogy felesleges, megtévesztő és zavaró, ha a menüpont linkje ugyanarra az oldalra viszi vissza a felhasználót, mint amin éppen van. Ez a megállapítás tulajdonképpen független attól, hogy látó vagy vak felhasználóról beszélünk.

Ezen érvelés alapján az is egy megoldás lehet, ha az aktuális menüpont nem link, hanem egy sima szöveg.

<nav>
<ul>
<li><a href="/">Főoldal</a></li>
<li class="aktualis">Rólunk</li>
<li><a href="kapcsolat">Kapcsolat</a></li>
</ul>
</nav>

A linktől megfosztott aktuális menüpont vizuális kiemelése ugyanolyan módszerekkel biztosítható, mint a linkelt verzióé. Arra esetleg szükség lehet, hogy a class attribútumot – az a jelölőelem hiánya miatt – a menüpont listaeleme (li jelölőeleme) kapja meg, ahogy ez a példában is látszik.

De szemantikus megoldás lehet az is, ha az aktuális menüpont szövege a strong jelölőelem segítségével nyomatékosítva van, ami aztán a CSS-ből tetszőlegesen formázható:

<nav>
<ul>
<li><a href="/">Főoldal</a></li>
<li><strong>Rólunk</strong></li>
<li><a href="kapcsolat">Kapcsolat</a></li>
</ul>
</nav>

A hallható kiemelés szempontjából vizsgálva a link elhagyása már önmagában is egy megkülönböztető jelzésként szolgálhat a képernyőolvasós felhasználóknak. Ugyanis a linkelt menüpontoknál a képernyőolvasó program beolvassa, hogy hivatkozás, az aktuális menüpontnál viszont nem. Ha ezt következetesen alkalmazzuk, akkor szükségtelenné válhat a magyarázószöveg használata.

Sajnos azonban mellékhatásokkal is számolnunk kell. Ha a képernyőolvasós felhasználó nem lineárisan, hanem a tab billentyű segítségével lépked a navigációs menü elemei között, akkor az aktuális menüpontot nem fogja hallani, mert a tabulátoros fókusz csak a linkelt menüpontokra áll rá.

aria-current attribútum

A hallható kiemelés kissé körülményes megvalósítása miatt talán nem véletlen, hogy az WAI-ARIA szabvány 1.1-es verziójába bekerült az aria-current nevű attribútum, aminek pontosan az a célja, hogy szemantikailag megjelölje a jelenlegi vagy aktuális elemet. Ennek segítségével így írhatjuk a példánkat:

<nav>
<ul>
<li><a href="/">Főoldal</a></li>
<li><a href="rolunk" aria-current="page">Rólunk</a></li>
<li><a href="kapcsolat">Kapcsolat</a></li>
</ul>
</nav>

Amikor a képernyőolvasó program a Rólunk menüponthoz ér, akkor például ezt olvassa fel: Rólunk, jelenlegi oldal, hivatkozás.

Ráadásul itt is kihasználhatjuk, hogy a CSS vizuális kiemelést is ehhez az attribútumhoz kössük:

[aria-current="page"] {
background-color: red;
border: 1px solid red;
}

Egyetlen szépséghibája van a dolognak. Cikkem írásakor (2017. áprilisában) a Magyarországon legelterjedtebb, és magyar nyelvre lokalizált két képernyőolvasó program (a JAWS és az NVDA) közül még egyik sem támogatja az aria-current attribútumot. Magyar nyelven egyedül az iOS és macOS gyári képernyőolvasója, a VoiceOver ismeri. De szerencsére már vannak arra mutató jelek, hogy nemsokára a többi magyar nyelvű képernyőolvasóban is megjelenik.

Frissítés (2017.október): Az NVDA 2017.2 verziójában már megjelent. Az NVDA-ban a fenti példa így hangzik el: Hivatkozás, aktuális oldal, Rólunk.

Addig viszont a korábban ismertetett megoldásokat javaslom a kiemelésre. Mindenképpen vigyázzunk arra, hogy ne használjuk párhuzamosan a „hagyományos” és az aria-current-re épülő megoldást, mert zavaró duplikációt (például Rólunk, jelenlegi oldal, jelenlegi oldal, hivatkozás felolvasást) hallhat az a felhasználó, akinél már működik az aria-current is.

Nem csak a navigációs menüknél lehet aktuális elem

Ugyan a cikkben végig az aktuális menüpont példáján mutattam be az akadálymentes megkülönböztető kiemelést, de ez nem jelenti azt, hogy csak itt alkalmazható. Az ismertetett megoldások nagyszerűen bevethetők például a naptáraknál, vagy a többlépcsős folyamatjelzőknél is.

Ha például a hét napjai közül az aktuális napot szeretnénk kiemelni, akkor ezt egy vizuálisan rejtett magyarázószöveggel így tehetnénk meg:

<ul>
  <li>Hétfő</li>
  <li>Kedd</li>
  <li class="aktualis">Szerda <span class="vizualisanrejtett"> (jelenlegi nap)</span></li>
  <li>Csütörtök</li>
  <li>Péntek</li>
  <li>Szombat</li>
  <li>Vasárnap</li>
</ul>

Maga az aria-current attribútum is úgy lett kitalálva, hogy támogassa ezt a széleskörű felhasználást.

Az ARIA 1.1 szabvány szerint az attribútum az alábbi értékeket veheti fel:

page
a jelenlegi (aktuális) oldal egy adott oldalhalmazban
step
a jelenlegi (aktuális) lépés egy többlépcsős folyamatban
location
a jelenlegi (aktuális) hely egy adott környezetben vagy kontextusban
date
a jelenlegi (aktuális) dátum adott dátumok halmazában
time
a jelenlegi (aktuális) időpont adott időpontok halmazában
true
a jelenlegi (aktuális) elem valamilyen elemek halmazában

Ezek alapján a naptáras példánkat akár így is írhatnánk:

<ul>
  <li>Hétfő</li>
  <li>Kedd</li>
  <li aria-current="date">Szerda</li>
  <li>Csütörtök</li>
  <li>Péntek</li>
  <li>Szombat</li>
  <li>Vasárnap</li>
</ul>