You know those popup windows that appear on top of a page asking you to confirm something or log in? Those are called dialogs. HTML has a built-in <dialog> element that gives you a proper, accessible modal dialog — no fancy library needed.
The Dialog Element
The <dialog> element is a native HTML element for creating dialogs. By default, a dialog is hidden. You use JavaScript to show it — either with show() for non-modal dialogs or showModal() for modal dialogs that block interaction with the rest of the page.
<dialog id="myDialog">
<p>Are you sure you want to delete this item?</p>
<button id="cancelBtn">Cancel</button>
<button id="confirmBtn">Confirm</button>
</dialog>
<button id="openBtn">Delete Item</button>
showModal vs show
showModal() opens the dialog as a modal — it overlays the page content with a backdrop and traps focus inside the dialog. show() opens it as a non-modal dialog that sits on top of the page but still lets users interact with the rest of the content.
<script>
const dialog = document.getElementById('myDialog');
const openBtn = document.getElementById('openBtn');
const cancelBtn = document.getElementById('cancelBtn');
openBtn.addEventListener('click', () => {
dialog.showModal();
});
cancelBtn.addEventListener('click', () => {
dialog.close();
});
</script>
The Close Method and Return Value
You can close a dialog with dialog.close() and pass a return value. This is useful when you want to know which button the user clicked — like "confirm" or "cancel" — to decide what to do next.
<script>
const confirmBtn = document.getElementById('confirmBtn');
confirmBtn.addEventListener('click', () => {
dialog.close('confirmed');
});
dialog.addEventListener('close', () => {
if (dialog.returnValue === 'confirmed') {
console.log('User confirmed the deletion');
}
});
</script>
Styling the Dialog and Backdrop
The dialog element comes with some default styles, but you can customize everything. The ::backdrop pseudo-element lets you style the dark overlay behind a modal dialog, and you can style the dialog box itself however you like.
<style>
dialog {
border: none;
border-radius: 8px;
padding: 24px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
}
dialog::backdrop {
background-color: rgba(0, 0, 0, 0.5);
}
</style>