Curso gratuito de HTML

HTML Demos

// 04 de 09

04 · <dialog>

Modal nativo del navegador. Gestiona foco, Escape, backdrop y accesibilidad automáticamente. No necesita librerías.

<dialog>.showModal().show() .close()::backdropmethod=dialogreturnValue

Demo en vivo

showModal() — bloquea la página, atrapa el foco, cierra con Escape.

show() — no bloquea, sin backdrop, no se cierra con Escape.

returnValue — el value del botón que cerró el dialog, útil para saber qué eligió el usuario.

Código importante

<!-- El dialog en el HTML -->
<dialog id="mi-modal">
  <h2>Título</h2>
  <p>Descripción del modal</p>

  <!-- method=dialog cierra SIN JS -->
  <form method="dialog">
    <button value="confirm">Confirmar</button>
    <button value="cancel">Cancelar</button>
  </form>
</dialog>

<!-- Abrir desde JS -->
const d = document.getElementById('mi-modal')

d.showModal()  // modal: bloquea + backdrop
d.show()       // no-modal: sin bloquear

d.close()      // cerrar desde JS
d.close('ok')  // cerrar con returnValue

<!-- Leer qué botón pulsó el usuario -->
d.addEventListener('close', () => {
  console.log(d.returnValue)
  // "confirm" o "cancel"
})

<!-- Estilar el backdrop -->
dialog::backdrop {
  background: rgba(0,0,0,0.75);
  backdrop-filter: blur(4px);
}

<!-- Cerrar al clicar fuera (backdrop) -->
dialog.addEventListener('click', e => {
  if (e.target === dialog) dialog.close()
})

Modal con showModal()

El foco queda atrapado aquí dentro. Prueba a pulsar Tab o Escape. El resto de la página queda bloqueada.

No-modal (show)

Sin backdrop. Puedes interactuar con la página. No se cierra con Escape.

¿Confirmar acción?

Esta operación no se puede deshacer. ¿Quieres continuar?

Cerrar sin JavaScript

El botón usa form method="dialog". No hay ningún onclick en el HTML.