Modalas, dar žinomas kaip „pop-upas“, „confirmationas“, dialogas ar „iššokanti lentelė“, yra svarbus vartotojo sąsajos elementas sutinkamas kiekvieną dieną. Modalai dažnai naudojami norint gauti patvirtinimą iš vartotojo, informuojant apie paslaugas, pvz. pasiryžimą atlikti ištrynimo veiksmą arba skatinant užsiregistruoti naujienlaiškiui. Tačiau, jei šis paprastas elementas nėra tinkamai sukonfigūruotas, jis gali tapti dideliu skausmu vartotojams naudojantiems ekrano skaitymo programas.
Puslapio testavimo su neregiu metu pastebėjau, kad iššokęs netvarkingas modalas vartotojams yra paprasčiausiai nematomas. Tokiu atveju vartotojas nesupranta, kodėl anksčiau veikę mygtukai nustoja veikti ir gali ilgai užtrukti, kol su skaitykle netikėtai pavyks surasti patį modalą ir jo uždarymo mygtuką (modalas techniškai dažnai atsiranda pačiame puslapio gale, įsivaizduokit kiek laiko gali trukti kol bus praeinamas visas turinys pavyzdžiui naujienų puslapyje).
Pavyzdys ekrano skaityklės judėjimo puslapyje
Norint tinkamai paruošti modalą, būtina atkreipti dėmesį į kelis pagrindinius dalykus:
- Už modalo esanti informacija turėtų būti vizualiai atskirta (pvz. patamsinta ar „sublurinta“), kad būtų aišku jog ji neprieinama.
- Paspaudus už modalo kortelės ribų, modalas turėtų užsidaryti, nebent sprendimas yra būtinas atlikti.
- Modale turi būti sutvarkyti spąstai tiek klaviatūros, tiek ekrano skaityklės naudotojams.
- Labai svarbus tinkamas fokuso suvaldymas
Apie pastaruosius du pašnekėkime detaliau
Norite patys išsibandyti kaip veikia modalas su ekrano skaitykle?
Išbandykite šiam tikslui sukurtą testavimo įrankį.
Fokusas
Praneškime vartotojui, kad jis modaleTvarkingas modalo fokuso valdymas yra labai svarbus tiek vartotojams su motorikos ar regėjimo sutrikimais, tiek įprastiens lankytojams. Pagrindinės taisyklės yra:
- Mygtukas, kuris iškvietė modalą, jį uždarius, turėtų vėl gauti fokusą.
- Atidarius modalą, jame esantis elementas turi gauti fokusą.
Tik gali kilti klausimas, kuriam modalo elementui skirti fokusą? O gal uždėti fokusą pačiam modalui? ARIA Authoring Practices Guide mini, kad nors dažniausiai verta dėti fokusą ant pirmo fokusuojamo modale elemento, bet yra visokiausių išimčių:
-
Jei modale yra sąrašai, lentelės ar keletas paragrafų teksto, fokusą reikėtų uždėti ant pirmo
statinio elemento (pvz.,
<H1>ar<p>).
Statiniai elementai (kaip pavyzdžiui<H1>ar<p>) paprastai negali gauti fokuso, bet nedidelis ,,hack'as" - atributastabindex="-1"leidžia kodo pagalba sufokusuoti tokį elementą. - Jei modalas prašo patvirtinimo dėl svarbių veiksmų (pavyzdžiui duomenų ištrinimo), fokusą reikėtų dėti ant mažiausiai destruktyvaus mygtuko.
- Jei modalas yra informacinis, fokusą reikėtų dėti ant dažniausiai naudojamo elemento, pvz., „Ok“ ar „Continue“.
Tačiau eksperimentuojant su skirtingomis ekrano skaityklėmis ir operacinėmis sistemomis, panašu, kad yra šiek tiek daugiau niuansų. Mano siūlymas būtų visuomet dėti fokusą ant modalo pavadinimo, nes:
- Vartotojas naudojantis ekrano skaitykle visuomet bus informuotas kokiu tikslu modalas atsirado (ypač TalkBack atveju).
- Vartotojai naviguojantys klaviatūra turės papildomai paspausti tik vieną TAB mygtuką norėdami pažymėti pirmą interaktyvų elementą, bet tuo tarpu ekrano skaityklių naudotojams puslapio bei modalo veikimas būtų žymiai suprantamesnis ir jiems nereikėtų naviguoti po visą modalą norint suprasti apie ką jis.
- Vartotojas nebus suklaidintas dėl fokuso vietos, kadangi naudojant VoiceOver (iOS) ir NVDA jie pirmiausai nuskaito modalo pavadinimą, o ne tai kas tuo metu yra fokusuojama.
- Tokiu atveju
<dialog>komponentas (apie kurį skaitykite žemiau) tinkamai ir prognozuojamai veikia visose aplinkose ir skaityklėse.
Norėdami sužinoti daugiau informacijos kodėl toks pasiūlyms duotas, peržiūrėkite ekrano skaityklės testavimo rezultatus.
Modalo spąstai ir valdymas
Klaviatūros bei ekrano skaityklės apribojimaiTurint fokusą modale yra labai svarbu to fokuso nepamesti iš pačio modalo. Naudotojai, kurie kurie naviguoja klaviatūra arba ekrano skaitykle gali nežinoti kur čia yra modalo pradžia ar pabaiga, dėl to yra svarbu integruoti klaviatūros ir skaityklės fokuso spąstus (focus trap). Jie, paprastai tariant, neleidžia išeiti iš modalo nepasirinkus mygtuko ar nepaspaudus Escape.
Norėdami išbandyti ar teisingai veikia klaviatūros spąstai, esant modale paspauskite
TAB, kad šokinėtumėte komponentais į priekį ir
SHIFT-TAB - atgal. Jeigu fokusas neišeina už modalo ribų, šaunu! O jeigu ne, skaitykite
toliau kaip galite jį gana lengvai pas save
pasidaryti.
Modalo HTML atributai
Kokie modalo esantys atributai yra reikalingi?Modalas gali turėti skirtingus HTML ir ARIA atributus ir juos norėčiau trumpai apžvelgti.
aria-labelledby
Šiame atribute nurodant modalo pavadinimo ID, ekrano skaityklė informuos vartotoją kas čia per modalas.
aria-describedby
Šis atributas yra toks pats kaip aria-labelledby tačiau orientuotas į modalo
aprašymą.
Labai svarbu prasitestuoti kada reikia naudoti aria-describedby ir
aria-labelledby atributus. Tam tikrais fokusuojamų elementų atvejais (pvz. į
pavadinimą) šitie atributai pakartotų jau prieš tai girdėtą informaciją.
role="alertdialog" (arba "dialog")
Šis atributas nurodo ekrano skaityklėms, kad modalas sutrikdys vartotojo darbą ir
pareikalaus
reikalingo sprendimo. Jis tinkamas patvirtinimo
modalams ir klaidų informavimui. Būtent alertdialog rolė leidžia pagalbinėms
technologijoms ar
naršyklėms išskirti šitą dialiogą nuo kitų su
papildomais elementais, kaip pavyzdžiui, paleidžiant sisteminį klaidos garsą.
Praktiškai šnekant, dažniausiais ekrano skaityklė tiesiog pasakys "alert dialog" ar "dialog"
gale
nuskaitymo:
aria-modal
Pridėjus aria-modal="true", ekrano skaityklėms nurodoma, kad kiti elementai yra
nepasiekiami, t.y., modalas gauna ekrano skaityklės
spąstus. Norint, kad jis veiktų, būtinai turi būti uždėtas
role="alertdialog"
atributas.
Kol Mac Voiceover ir NVDA užtenka turėti aria-modal atributą, panašu, kad
mobilūs
telefonai Android (Talkback) ir iOS (VoiceOver) jo
nepalaiko. Norint pasiekti panašių rezultatų reikėtų naudoti inert po modalo
apačia
esantiems elementams.
aria-hidden
Šis atributas nurodo ekrano skaitymo programomis ar elementas turi būti pasiekiamas ar ne.
Modalo
atidarymo atveju
aria-hidden="true" turėtų būti uždedamas turiniui po modalo apačia. Šiuo metu
jis
yra
pilnai palaikomas visų naršyklių.
inert
Šis HTML atributas nurodo naršyklėms, kad elementas yra nepasiekiamas. Tai yra
aria-hidden „tobulesnė" versija, nes jis paslepia
elementus tiek nuo ekrano skaityklių, tiek nuo klaviatūros fokuso.
Atributų ir palaikymo suvestinė
VoiceOver (Mac Chrome ir Safari), NVDA (Chrome)
| Savybė / Atributas | aria-modal | role | aria-hidden | inert |
|---|---|---|---|---|
| Skaityklė nurodo, kad modalas | + | |||
| Leidžia su ESC išjungti | ||||
| Klaviatūros spąstai | + | |||
| Ekrano skaityklės spąstai | + (bet reikia rolės) | + | + |
TalkBack (Chrome)
| Savybė / Atributas | aria-modal | role | aria-hidden | inert |
|---|---|---|---|---|
| Skaityklė nurodo, kad modalas | + (tik fokusuojant į modalą) | |||
| Ekrano skaityklės spąstai | + | + |
VoiceOver (iOS Safari)
| Savybė / Atributas | aria-modal | role | aria-hidden | inert |
|---|---|---|---|---|
| Pasako, kad modalas | ||||
| Ekrano skaityklės spąstai | + | + | + |
Beveik išgelbėtojas Dialog elementas
<dialog> elementas yra gana naujas, bet jau plačiai palaikomas naršyklių
elementas (95%),
kuris gali stipriai padėti supaprastinti kodo eilučių kiekį. Pagrindiniai jo pliusai:
- Užtikrina klaviatūros ir ekrano skaityklės spąstus.
- Automatiškai uždeda rolę (dažniausiai).
- Leidžia „Escape“ mygtuku išjungti modalą.
- Turi integruotą užsklandą kurią galima keisti su
::backdropCSS. - Uždėjus modalo viduje esančiam elementui
autofocusatributą, jis automatiškai gaus fokusą iškvietus patį modalą.
Ekrano skaityklių elgsena su dialogo elementu
| Savybė / Atributas | NVDA (Chrome) | TalkBack (Chrome) | VoiceOver (Chrome ir Safari) | VoiceOver (iOS Safari) |
|---|---|---|---|---|
| Skaityklė nurodo, kad modalas | + | + | ||
| Leidžia su ESC išjungti | + | + | + | + |
| Klaviatūros spąstai | + | + | + | + |
| Ekrano skaityklės spąstai | + | + | + | + |
Apibendrinant
Norint, kad modalai būtų prieinami visiems vartotojams svarbu tinkamai juos sukonfigūruoti. Tai
apima vizualinį atskyrimą, kad už modalo esanti
informacija būtų aiškiai pavaizduota kaip neprieinama, teisingą fokuso valdymą, klaviatūros spąstų
sukūrimą, ir reikalingų ARIA atributų, tokių kaip
aria-labelledby, aria-describedby, role="alertdialog"
naudojimą. Naujas HTML
<dialog> elementas gali labai supaprastinti modalo kūrimą, nes jis automatiškai
suteikia daugelį reikalingų funkcijų.
Kilus klausimams ar atradus kokių straipsnyje netikslumų susisiekite su manimi - tomas@gecevicius.lt
Ačiū!
Papildoma informacija
Atrasti niuansai
-
Norint iškviesti
<dialog>patariu naudoti funkcijąshowModal(), tik tokiu atveju modalas gali būti išjungiamas suEscmygtuku (sushow()funkcija tai neveikia). -
Firefox naršyklėje neveikia
<dialog>autofokusas. Autofokusas užsideda ant pačio modalo, o ne ant to elemento kuris buvo nurodytas. -
VoiceOver (Mac) skaityklė nepasako
aria-labelledbyinformacijos jeigu nėra uždėtasrole=alertdialogatributas. -
VoiceOver (iOS) uždėjus
role=alertdialogatributą skaityklė nusako visus iš eilės elementus, nesvarbu ar yra uždėtasaria-labelledbyatributas ar ne. -
TalkBack skaityklėje
<dialog>elementas yra naudingas tik spąstams. Rolės iraria-labelledbyatributai neveikia. Standartiniuose modaluose rolės pasakymas esantroleatributui veikia tik fokusą dedant į patį modalą.
Testuota su
- Windows - Chrome - 127.0.6533.100
- Android - Chrome - 127.0.6533.103
- Mac - Chrome - 127.0.6533.120
- iOS - Safari - 16.7.8
Testavimo rezultatai
Ekrano skaityklės elgsena su skirtingais fokusavimo metodais naudojant <dialog>
| Ekrano skaityklė | Fokusas į modalą | Fokusas į pavadinimą | Fokusas į antrinį mygtuką |
|---|---|---|---|
| NVDA (Chrome) |
Fokusas - Uždarymo mygtukas
Perskaito:
|
Fokusas - Pavadinimas
Perskaito:
|
Fokusas - Antrinis mygtukas
Perskaito:
|
| Talkback (Android - Chrome) |
Fokusas - Pavadinimas
Esant uždarymo mygtukui - fokusas uždarymo mygtukas. Perskaito:
|
Fokusas - Pavadinimas
Perskaito:
|
Fokusas - Antrinis mygtukas
Perskaito:
|
| VoiceOver (Mac - Chrome) |
Fokusas - Uždarymo mygtukas
Nesant uždarymo mygtukui - fokusas ant pavadinimo Perskaito:
|
Fokusas - Pavadinimas
Perskaito:
|
Fokusas - Antrinis mygtukas
Perskaito:
|
| VoiceOver (iOS - Safari) |
Fokusas - Pavadinimas
Esant uždarymo mygtukui - fokusas uždarymo mygtukas Perskaito:
|
Fokusas - Pavadinimas
Perskaito:
|
Fokusas - Antrinis mygtukas
Perskaito:
|
Ekrano skaityklės elgsena su skirtingais fokusavimo metodais naudojant įprastą modalą.
| Ekrano skaityklė | Fokusas į modalą | Fokusas į pavadinimą | Fokusas į antrinį mygtuką |
|---|---|---|---|
| NVDA (Chrome) |
Fokusas - Modalas
Perskaito:
|
Fokusas - Pavadinimas
Perskaito:
|
Fokusas - Antrinis mygtukas
Perskaito:
|
| Talkback (Android - Chrome) |
Fokusas - Pavadinimas
Perskaito:
|
Fokusas - Pavadinimas
Perskaito:
|
Fokusas - Antrinis mygtukas
Perskaito:
|
| VoiceOver (Mac - Chrome) |
Fokusas - Modalas
Perskaito:
|
Fokusas - Pavadinimas
Perskaito:
Nuėmus aria-label'į:
|
Fokusas - Antrinis mygtukas
Perskaito:
|
| VoiceOver (iOS - Safari) |
Fokusas - Pavadinimas
Esant uždarymo mygtukui - fokusas uždarymo mygtukas. Perskaito:
|
Fokusas - Pavadinimas
Perskaito:
|
Fokusas - Antrinis mygtukas
Perskaito:
|