dialog
Merkitsee säilön modaaliseksi tai ei-modaaliseksi dialogiksi. Käytä natiivista <dialog>-elementtiä showModal()-metodin kanssa — se hoitaa kohdistuseristyksen, yläkerroksen, taustan ja Escape-sulkemisen automaattisesti. Turvaudu role="dialog"-rooliin vain, kun natiivi elementti on mahdoton.
Käyttötilanteet
Käytetään .showModal()-metodilla avattua <dialog>-elementtiä. Natiivi elementti on tuettu kaikissa nykyisissä selaimissa ja hoitaa automaattisesti taustan passivoinnin, kohdistuseristyksen, Escape-sulkemisen, ::backdrop-tyylityskoukun ja yläkerroksen renderöinnin. Se säästää noin 200 riviä hauraasta JavaScriptistä.
role="dialog" <div>-elementissä on perusteltua vain, kun:
- Tuetaan vanhempia selaimia kuin Chrome 37 / Firefox 98 / Safari 15.4 (epätodennäköistä vuonna 2026).
- Suunnittelu vaatii dialogia, joka ei voi olla yläkerroksessa (harvinaista).
- Korjataan saavutettamatonta mukautettua modaalia refaktoroinnin yhteydessä.
Jokaisella dialogilla on oltava saavutettava nimi (vahvin malli on aria-labelledby, joka osoittaa näkyvään otsikkoon). Modaaleilla on lisäksi oltava aria-modal="true".
Näppäimistö- ja kohdistussopimus
APG-dialogimallin mukaisesti:
- Avattaessa kohdistus siirtyy ensimmäiseen tarkennettavaan elementtiin dialogin sisällä (usein sulkupainikkeeseen tai pääsyöttökenttään).
- Tab ja Shift+Tab kiertävät kohdistusta dialogin SISÄLLÄ — “kohdistuseristys”. Tab viimeisestä elementistä palaa ensimmäiseen; Shift+Tab ensimmäisestä palaa viimeiseen.
- Escape sulkee dialogin.
- Sulkemisen jälkeen kohdistus palaa elementtiin, joka avasi dialogin. Kohdistuksen tallentaminen ja palauttaminen on ehdotonta; käyttäjät, jotka menettävät paikkansa, jäävät ilman ankkuria.
- Muu sivu on
inert-tilassa (taiaria-hidden="true"+ ei-tarkennettavana varavaihtoehtona) dialogin ollessa auki.
Yleisimmät virheet
- Mukautettu dialogi ilman kohdistuseristystä. Tab siirtyy ulos dialogista ja sen taakse; käyttäjät menettävät kontekstin.
- Kohdistus ei palaudu laukaisijaan sulkemisen jälkeen. Seuraava Tab-painallus päätyy dokumentin body-elementtiin.
- Taustasisältö pysyy tarkennettavana Tab-näppäimellä, vaikka se on visuaalisesti piilossa dialogin takana.
- Ei saavutettavaa nimeä. Dialogi aukeaa ja ruudunlukuohjelma ilmoittaa vain “dialogi”.
- Mukautettu dialogi ilman
aria-modal="true"— apuvälineteknologiat käsittelevät sitä tekstivirran osana. - Escape sulkee dialogin, mutta dialogi on renderöity portaalin kautta, joka menettää näppäimistökohdistuksen sulkemisanimaation aikana.
Esimerkki
<!-- Suositeltava -->
<dialog id="confirm">
<h2>Poistetaanko tämä luonnos?</h2>
<p>Toimintoa ei voi peruuttaa.</p>
<form method="dialog">
<button value="cancel">Peruuta</button>
<button value="delete" autofocus>Poista</button>
</form>
</dialog>
<script>
document.getElementById('confirm').showModal();
</script>
<!-- Kun <dialog> on mahdoton -->
<div role="dialog" aria-modal="true" aria-labelledby="dlgTitle">
<h2 id="dlgTitle">Muokkaa profiilia</h2>
…
</div>