Set your Publisher ID in src/config/ads.ts to display live ads.
How To: Native HTML5 Modal <dialog>
Build fully accessible modals with automatic focus trapping, backdrop dimming, and Escape key dismissal using the native HTML5 <dialog> element.
Why Native <dialog> Outperforms Custom Divs
In the past, creating an accessible modal required 100+ lines of JavaScript to trap Tab navigation inside the modal, prevent background document scrolling, manage z-index stacking wars, and listen for the Escape key.
The native HTML5 <dialog> element handles all of this automatically in modern browsers. When opened via dialog.showModal(), the browser:
z-index values).Escape.::backdrop pseudo-element behind the dialog.Complete Dialog Implementation with Backdrop Styling
Use showModal() to open the dialog as a blocking modal, or show() if you prefer a non-modal popup.
<!-- Trigger Button -->
<button onclick="document.getElementById('myModal').showModal()">
Open Modal
</button>
<!-- Native Dialog Container -->
<dialog id="myModal">
<h2>Account Confirmation</h2>
<p>Are you sure you want to proceed with this operation?</p>
<div class="actions">
<button onclick="document.getElementById('myModal').close()">Cancel</button>
<button class="primary" onclick="confirmAction()">Confirm</button>
</div>
</dialog>
<style>
dialog {
border: 1px solid #334155;
border-radius: 12px;
padding: 24px;
background: #0f172a;
color: #ffffff;
max-width: 480px;
width: 90%;
}
dialog::backdrop {
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(4px);
}
</style>Closing the Modal on Backdrop Click
By default, clicking the backdrop does not close the dialog. You can achieve this with a lightweight click listener checking whether the click coordinates fall outside the dialog bounding rectangle:
const dialog = document.getElementById('myModal');
dialog.addEventListener('click', (event) => {
const rect = dialog.getBoundingClientRect();
const isInDialog = (
rect.top <= event.clientY &&
event.clientY <= rect.top + rect.height &&
rect.left <= event.clientX &&
event.clientX <= rect.left + rect.width
);
if (!isInDialog) {
dialog.close();
}
});Set your Publisher ID in src/config/ads.ts to display live ads.
Test Yourself With Exercise
Which method must be called to open an HTML <dialog> as a true modal with focus trapping and top-layer rendering?