Prijeđi na sadržaj

Tutorial

Kako modal učiniti pristupačnim

Ukratko

Koristi nativni <dialog> element s showModal(): zadržava fokus unutar dijaloga, čini pozadinu inertnom, zatvara se na Escape i daje ulogu dijaloga. Dodaj naziv pomoću aria-labelledby i vrati fokus na gumb koji je otvorio dijalog pri zatvaranju.

Ukratko po koracima

  1. Koristi nativni <dialog>

    Zamijeni <div> koji se prikazuje pomoću CSS-a s <dialog> elementom i otvori ga s showModal().

  2. Imenuj dijalog

    Poveži naslov s dijalogom pomoću aria-labelledby kako bi čitači zaslona najavili njegovu svrhu.

  3. Provjeri Escape i zamku fokusa

    showModal() zadržava fokus u dijalogu i zatvara ga na Escape. Testiraj samo tipkovnicom.

  4. Vrati fokus

    Na close događaj vrati fokus na gumb koji je otvorio dijalog.

Modal je jedna od najčešćih prepreka na webu. Tipične pogreške: tipkovnica može doći u pozadinu, Escape ne zatvara ništa, čitač zaslona nikad ne najavi da je dijalog otvoren, a nakon zatvaranja fokus nigdje ne završi. Jedan element koji preglednik već ima rješava sva četiri problema.

Problem

Ovaj obrazac izgleda kao dijalog, ali za asistivnu tehnologiju to nije: nema ulogu, naziv, zamku fokusa ni Escape.

Prije: nije pristupačnoHTML
<button onclick="openModal()">Newsletter abonnieren</button>

<div class="modal" id="modal" style="display: none">
  <div class="modal-box">
    <h2>Newsletter</h2>
    <p>Melde dich fuer unseren Newsletter an.</p>
    <input type="email" placeholder="E-Mail" />
    <button onclick="closeModal()">Schliessen</button>
  </div>
</div>
  • Pozadina ostaje dostupna tipkom Tab (fokus napušta dijalog).
  • Escape ne zatvara dijalog.
  • Čitač zaslona ne najavljuje dijalog jer nedostaju uloga i naziv.
  • Nakon zatvaranja fokus je izgubljen.

Rješenje: nativni <dialog> element

showModal() obavlja većinu posla: zadržava fokus u dijalogu (time 2.1.2 Bez zamke tipkovnice dobiva definiran izlaz), čini ostatak stranice inertnim, prikazuje pozadinu i zatvara se na Escape. Ostaje ti samo imenovati dijalog i vratiti fokus pri zatvaranju.

Poslije: pristupačnoHTML
<button type="button" id="open">Newsletter abonnieren</button>

<dialog id="modal" aria-labelledby="modal-title">
  <h2 id="modal-title">Newsletter</h2>
  <p>Melde dich fuer unseren Newsletter an.</p>
  <label for="email">E-Mail</label>
  <input id="email" type="email" />
  <button type="button" id="close">Schliessen</button>
</dialog>
Otvaranje, zatvaranje, vraćanje fokusaJavaScript
const dialog = document.getElementById("modal");
const openBtn = document.getElementById("open");

openBtn.addEventListener("click", () => {
  // showModal() traps focus inside the dialog, makes the rest of the page inert,
  // and lets the Escape key close it. All three are WCAG requirements you no longer
  // have to hand-roll.
  dialog.showModal();
});

document.getElementById("close").addEventListener("click", () => dialog.close());

// Return focus to the trigger when the dialog closes (native or via Escape).
dialog.addEventListener("close", () => openBtn.focus());

Testiranje (samo tipkovnicom)

  1. Otvori dijalog tipkom Enter/Space na gumbu.
  2. Prođi kroz dijalog tipkom Tab: fokus mora kružiti unutar njega, nikad u pozadinu.
  3. Escape mora zatvoriti dijalog.
  4. Nakon zatvaranja fokus mora biti natrag na gumbu koji ga je otvorio.

Ako trebaš ARIA obrazac bez <dialog> (npr. zbog starih preglednika), moraš sam u JavaScriptu ponovno izraditi zamku fokusa, obradu Escape tipke i inertnost pozadine, uz role="dialog" i aria-modal="true". Nativni element uklanja upravo taj dio sklon pogreškama.

Česta pitanja

Trebam li role="dialog" kad koristim <dialog>?
Ne. Nativni <dialog> element već ima ulogu dijaloga. Dodatni role="dialog" je suvišan. Samo ručno izrađen dijalog od <div> elementa treba role="dialog" i aria-modal="true".
Zašto showModal(), a ne show()?
show() otvara nemodalni dijalog bez zamke fokusa, bez inertne pozadine i bez zatvaranja na Escape. Za pravi modal treba ti showModal().
Kako pravilno vratiti fokus?
Zapamti element koji je otvorio dijalog (ili pročitaj document.activeElement pri otvaranju) i pozovi .focus() na njemu u close događaju. Inače čitač zaslona nakon zatvaranja skoči na vrh stranice.

Zatražite besplatno skeniranje

Recite nam svoju domenu — provodimo besplatno početno skeniranje i pokazujemo najvažnije prepreke.