Modalo pritaikymas prieinamumui

Ekrano skaityklė

Techninė informacija

6min skaitymo

2024-09-14

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 modale

Tvarkingas modalo fokuso valdymas yra labai svarbus tiek vartotojams su motorikos ar regėjimo sutrikimais, tiek įprastiens lankytojams. Pagrindinės taisyklės yra:

  1. Mygtukas, kuris iškvietė modalą, jį uždarius, turėtų vėl gauti fokusą.
  2. 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ų:

  1. 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>).
    Addition information
    Statiniai elementai (kaip pavyzdžiui <H1> ar <p>) paprastai negali gauti fokuso, bet nedidelis ,,hack'as" - atributas tabindex="-1" leidžia kodo pagalba sufokusuoti tokį elementą.
  2. Jei modalas prašo patvirtinimo dėl svarbių veiksmų (pavyzdžiui duomenų ištrinimo), fokusą reikėtų dėti ant mažiausiai destruktyvaus mygtuko.
  3. 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 apribojimai

Turint 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:
Pavyzdys ekrano skaityklės nuskaityto modalo tekstas su alert dialog žodžiais gale

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:

  1. Užtikrina klaviatūros ir ekrano skaityklės spąstus.
  2. Automatiškai uždeda rolę (dažniausiai).
  3. Leidžia „Escape“ mygtuku išjungti modalą.
  4. Turi integruotą užsklandą kurią galima keisti su ::backdrop CSS.
  5. Uždėjus modalo viduje esančiam elementui autofocus atributą, 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 + + + +

Išbandykite patys kaip kiekviena ekrano skaityklė mato atributus

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 su Esc mygtuku (su show() 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-labelledby informacijos jeigu nėra uždėtas role=alertdialog atributas.
  • VoiceOver (iOS) uždėjus role=alertdialog atributą skaityklė nusako visus iš eilės elementus, nesvarbu ar yra uždėtas aria-labelledby atributas ar ne.
  • TalkBack skaityklėje <dialog> elementas yra naudingas tik spąstams. Rolės ir aria-labelledby atributai neveikia. Standartiniuose modaluose rolės pasakymas esant role atributui 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:
  • Pavadinimas (jeigu yra aria-label)
  • Rolė
  • Antrinis mygtukas
  • Pavadinimas
  • Antrinis mygtukas
  • Pirminis mygtukas
Fokusas - Pavadinimas

Perskaito:
  • Pavadinimas (jeigu yra aria-label)
  • Rolė
  • Aprašymas
  • Pavadinimas
  • Pavadinimas
  • Antrinis mygtukas
  • Pirminis mygtukas
Fokusas - Antrinis mygtukas

Perskaito:
  • Pavadinimas (jeigu yra aria-label)
  • Rolė
  • Aprašymas
  • Antrinis mygtukas
  • Pavadinimas
  • Antrinis mygtukas
  • Pirminis mygtukas
Talkback
(Android - Chrome)
Fokusas - Pavadinimas
Esant uždarymo mygtukui - fokusas uždarymo mygtukas.

Perskaito:
  • Pavadinimas. Esant uždarymo mygtukui - nuskaito uždarymo mygtuką.
Fokusas - Pavadinimas

Perskaito:
  • Pavadinimas
Fokusas - Antrinis mygtukas

Perskaito:
  • Antrinis mygtukas
VoiceOver
(Mac - Chrome)
Fokusas - Uždarymo mygtukas
Nesant uždarymo mygtukui - fokusas ant pavadinimo

Perskaito:
  • Uždarymo mygtukas
  • Pavadinimas
  • Aprašymas
  • Rolė
Fokusas - Pavadinimas

Perskaito:
  • Pavadinimas
  • Aprašymas
  • Rolė
Fokusas - Antrinis mygtukas

Perskaito:
  • Antrinis mygtukas
  • Pavadinimas
  • Aprašymas
  • Rolė
VoiceOver
(iOS - Safari)
Fokusas - Pavadinimas
Esant uždarymo mygtukui - fokusas uždarymo mygtukas

Perskaito:
  • Esant uždarymo mygtukui - Uždarymo mygtukas
  • Pavadinimas
  • Aprašymas
  • Antrinis mygtukas
  • Pirminis mygtukas
Fokusas - Pavadinimas

Perskaito:
  • Esant uždarymo mygtukui - Uždarymo mygtukas
  • Pavadinimas
  • Aprašymas
  • Antrinis mygtukas
  • Pirminis mygtukas
Fokusas - Antrinis mygtukas

Perskaito:
  • Esant uždarymo mygtukui - Uždarymo mygtukas
  • Pavadinimas
  • Aprašymas
  • Antrinis mygtukas
  • Pirminis mygtukas

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:
  • Pavadinimas (jeigu yra aria labelis)
  • Uždarymo mygtukas
  • Pavadinimas
  • Aprašymas
  • Antrinis mygtukas
  • Pirminis mygtukas
Fokusas - Pavadinimas

Perskaito:
  • Pavadinimas (jeigu yra aria labelis)
  • Rolė
  • Aprašymas
  • Pavadinimas
  • Antrinis mygtukas
  • Pirminis mygtukas
Fokusas - Antrinis mygtukas

Perskaito:
  • Pavadinimas (jeigu yra aria labelis)
  • Rolė
  • Antrinis mygtukas
  • Pavadinimas
  • Antrinis mygtukas
  • Pirminis mygtukas
Talkback (Android - Chrome) Fokusas - Pavadinimas

Perskaito:
  • Pavadinimas
  • Rolė
  • Aprašymas
Fokusas - Pavadinimas

Perskaito:
  • Pavadinimas
Fokusas - Antrinis mygtukas

Perskaito:
  • Antrinis mygtukas
VoiceOver (Mac - Chrome) Fokusas - Modalas

Perskaito:
  • Pavadinimas
  • Aprašymas
  • Rolė
Fokusas - Pavadinimas

Perskaito:
  • Pavadinimas
  • Pavadinimas (dėl aria-labelio)
  • Rolė

Nuėmus aria-label'į:
  • Pavadinimas
  • Elementų kiekis modale
  • Pavadinimas
Fokusas - Antrinis mygtukas

Perskaito:
  • Antrinis mygtukas
  • Pavadinimas
  • Aprašymas
  • Rolė
VoiceOver (iOS - Safari) Fokusas - Pavadinimas
Esant uždarymo mygtukui - fokusas uždarymo mygtukas.

Perskaito:
  • Esant uždarymo mygtukui - Uždarymo mygtukas
  • Pavadinimas
  • Aprašymas
  • Antrinis mygtukas
  • Pirminis mygtukas
Fokusas - Pavadinimas

Perskaito:
  • Esant uždarymo mygtukui - Uždarymo mygtukas
  • Pavadinimas
  • Aprašymas
  • Antrinis mygtukas
  • Pirminis mygtukas
Fokusas - Antrinis mygtukas

Perskaito:
  • Esant uždarymo mygtukui - Uždarymo mygtukas
  • Pavadinimas
  • Aprašymas
  • Antrinis mygtukas
  • Pirminis mygtukas