Dialog / Modale — Démo interactive
Testez le composant <dialog> natif. Utilisez Échap pour fermer,
Tab/Shift+Tab pour naviguer. Testez aussi avec un lecteur d'écran.
Exemple 1 : Dialog simple
Une modale basique avec titre, contenu, et bouton de fermeture.
Voir le code HTML
<dialog id="dialog1" aria-labelledby="dialog1-title" aria-modal="true">
<h2 id="dialog1-title">Titre de la modale</h2>
<p>Contenu de la modale...</p>
<form method="dialog">
<button type="submit">Fermer</button>
</form>
</dialog>
<button onclick="document.getElementById('dialog1').showModal()">
Ouvrir la modale
</button> À tester :
- Clavier : Tab pour naviguer, Entrée/Espace sur bouton, Échap pour fermer
- Lecteur d'écran : NVDA annonce « Boîte de dialogue, Titre de la modale »
- Focus : après fermeture, le focus revient au bouton d'ouverture
Exemple 2 : Dialog avec formulaire
Une modale contenant un formulaire. L'envoi ou l'annulation ferme la modale.
Voir le code HTML
<dialog id="dialog2" aria-labelledby="dialog2-title" aria-modal="true">
<h2 id="dialog2-title">Formulaire</h2>
<form method="dialog">
<label for="name">Nom</label>
<input type="text" id="name" name="name" required />
<label for="email">Email</label>
<input type="email" id="email" name="email" required />
<button type="submit">Envoyer</button>
<button type="button" onclick="this.closest('dialog').close()">
Annuler
</button>
</form>
</dialog> À tester :
- Clavier : Tab entre champs, Entrée pour valider
- Formulaire : click Envoyer ferme la modale avec returnValue
- Annulation : click Annuler ferme sans validation
- Lecteur d'écran : tous les labels annoncés correctement
Exemple 3 : Dialog imbriquée (cas limite)
Une modale ouvrant une autre modale. Testez le piège du focus et l'Échap.
Voir le code HTML
<!-- Modale parent -->
<dialog id="dialog3a" aria-labelledby="dialog3a-title" aria-modal="true">
<h2 id="dialog3a-title">Modale 1</h2>
<p>Contenu...</p>
<button onclick="document.getElementById('dialog3b').showModal()">
Ouvrir modale 2
</button>
<form method="dialog">
<button type="submit">Fermer</button>
</form>
</dialog>
<!-- Modale enfant -->
<dialog id="dialog3b" aria-labelledby="dialog3b-title" aria-modal="true">
<h2 id="dialog3b-title">Modale 2</h2>
<p>Modale imbriquée...</p>
<form method="dialog">
<button type="submit">Fermer</button>
</form>
</dialog> À tester :
- Navigation : Tab ne sort pas de la modale 2 quand elle est ouverte
- Échap : ferme uniquement la modale 2 (la plus récente)
- Focus : focus retourne à Ouvrir modale 2 après fermeture de modale 2
- Lecteur d'écran : NVDA annonce correctement le contexte
Notes d'accessibilité
- `aria-labelledby` lie la modale à son titre (lecteur d'écran)
- `aria-modal="true"` annonce « Boîte de dialogue » aux lecteurs d'écran
- `
- Échap ferme la modale (gratuit, géré par le navigateur)
- Focus trap : gratuit, géré par `