Skip to Content
Component ExamplesAlert Dialogs

Overview

Alert dialogs are a special type of dialog used for confirmations and urgent warnings that require an explicit user response before proceeding. Unlike standard modals, alert dialogs use role="alertdialog" which combines the semantics of an alert (urgent, assertive announcement) with a dialog (interactive, focus-trapping container). The key safety principle: focus the least destructive action so that a quick Enter press does not cause data loss. Alert dialogs should be used sparingly — overuse causes alert fatigue, where users start dismissing them without reading.

WCAG Criteria:

Key requirements:

  • Use role="alertdialog" to combine urgent announcement with interactive dialog semantics
  • Label the dialog with aria-labelledby pointing to its heading
  • Describe the warning with aria-describedby pointing to the message text
  • Focus the least destructive action (e.g., Cancel, not Delete) when the dialog opens
  • Trap focus within the dialog — Tab must not escape to background content
  • Provide at least two actions: a safe option (Cancel) and the destructive option (Delete/Confirm)
  • Use alert dialogs sparingly — overuse desensitizes users and causes fatigue

Confirmation Alert Dialog

Unsafe Popup vs. Accessible Alert Dialog

Inaccessible
<!-- Div popup — no alertdialog role, focus on destructive action --> <button onclick=" document.getElementById('overlay').style.display = 'flex'; document.getElementById('delete-btn').focus(); ">Delete Item</button> <div id="overlay" style=" display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.5); "> <div> <h2>Delete this item?</h2> <p>This action is permanent and cannot be undone.</p> <button onclick="close()">Cancel</button> <button id="delete-btn" onclick="close()">Delete</button> </div> </div>
Live Preview
Accessible
<!-- Native dialog with role="alertdialog" — focus on safe action --> <button id="trigger" onclick=" var d = document.getElementById('dlg'); d.showModal(); document.getElementById('cancel-btn').focus(); ">Delete Item</button> <dialog id="dlg" role="alertdialog" aria-labelledby="dlg-title" aria-describedby="dlg-desc" onclose="document.getElementById('trigger').focus()"> <h2 id="dlg-title">Delete this item?</h2> <p id="dlg-desc"> This action is permanent and cannot be undone. </p> <button id="cancel-btn" onclick="this.closest('dialog').close()"> Cancel </button> <button onclick="this.closest('dialog').close()"> Delete </button> </dialog>
Live Preview

Delete this item?

This action is permanent and cannot be undone. The item and all associated data will be removed.

What’s wrong with the unsafe popup?

  • No alertdialog role — screen readers announce it as generic content, not as an urgent confirmation dialog
  • Focus is placed on the “Delete” button (the destructive action) — a quick Enter press causes data loss
  • No focus trap — Tab key moves to elements behind the overlay, so keyboard users can interact with background content
  • No Escape key handling — keyboard users cannot dismiss the popup
  • No aria-labelledby or aria-describedby — the heading and warning text are not programmatically associated with the dialog
  • Background content remains interactive — nothing prevents clicks or focus behind the overlay

What role="alertdialog" provides:

  • Combines alert semantics (urgent, assertive announcement) with dialog semantics (interactive, focus-trapping)
  • Screen readers announce both the dialog role and the urgency — users understand this requires immediate attention
  • Unlike role="alert" (which is purely informational), alertdialog expects user interaction before proceeding

What the screen reader announces:

VersionAnnouncement on open
Inaccessible (div popup)“Delete” (just the focused button text — no dialog context, no warning read)
Accessible (alertdialog)“Delete this item?, alert dialog. This action is permanent and cannot be undone. Cancel, button”

Why focus the safe option:

  • Users may press Enter immediately after a dialog opens — if the destructive button has focus, this causes accidental data loss
  • Focusing Cancel (the least destructive action) ensures that an accidental Enter press is harmless
  • This is a core principle of defensive UI design for confirmation dialogs
  • WCAG 3.2.1 (On Focus) requires that receiving focus does not trigger an unintended action

Alert dialog vs. standard dialog:

Featuredialogalertdialog
Roledialogalertdialog
UrgencyNeutralUrgent — screen reader announces assertively
Use caseForms, settings, contentConfirmations, destructive actions, warnings
User can ignore?Yes (close and continue)No — requires explicit acknowledgment
FrequencyUse freelyUse sparingly — overuse causes fatigue

Key teaching points:

  • role="alertdialog" combines alert (urgent) + dialog (interactive) — use it for confirmations of destructive or irreversible actions
  • Always focus the safe option (Cancel) — never the destructive button
  • Alert dialogs should be rare — overuse desensitizes users and trains them to dismiss without reading
  • The native <dialog> element with .showModal() provides focus trapping and Escape key handling for free

Resources