Se abre en una pestaña nueva

Diseño web

Elemento dialog de HTML: cómo hacer una ventana modal accesible

Qué hace el elemento dialog, la diferencia entre show() y showModal(), adónde va el foco, cómo se cierra y qué tiene que rehacer un modal hecho a mano.

Revisada5 de noviembre de 2026
Lectura
Forma parte deDiseño web
Escucha esta guía
0:00 /7:15

Respuesta corta: usa el elemento dialog y ábrelo con showModal() cuando la persona deba terminar algo antes de volver a la página. El navegador deja entonces inerte el resto de la página, pone el foco dentro y permite cerrarlo con Escape. Dale un nombre y un botón visible para cerrarlo, y devuelve el foco a donde estaba.

MDN describe el elemento dialog como un cuadro de diálogo modal o no modal. Uno modal bloquea el resto de la página y lo deja inerte. Uno no modal deja seguir usando la página que lo rodea.

Cómo lo abres El resto de la página Escape
showModal() Inerte, detrás de un fondo Lo cierra
show() Se puede seguir usando No lo cierra
El atributo open Se puede seguir usando No lo cierra
Un div con role="dialog" Lo que haga tu script Solo si tu script lo gestiona

De MDN y web.dev, consultados el 5 de noviembre de 2026.

web.dev añade que un diálogo modal se muestra encima de la página, y el resto queda tapado por un fondo semitransparente. Ese fondo se puede cambiar con el pseudoelemento ::backdrop. MDN desaconseja abrir un diálogo con el atributo open: así siempre es no modal.

El foco entra y vuelve

Cuando showModal() abre un diálogo, el foco pasa al primer elemento de dentro que puede recibirlo. MDN recomienda el atributo autofocus en el control que la persona necesita primero, o en el botón de cerrar cuando no hay otro antes.

Con un diálogo modal abierto, web.dev señala que pulsar Tab una y otra vez solo recorre lo que hay dentro. Al cerrarse, el foco vuelve al elemento que lo abrió. Nuestra guía de navegación con teclado muestra cómo se recorre una página sin mouse.

Cómo se cierra

Escape cierra un diálogo abierto con showModal(), y MDN pide mantenerlo así, porque quien usa el teclado lo espera. Escape no cierra un diálogo no modal, así que su propio botón de cerrar importa todavía más.

web.dev aconseja tomar como obligatorio un botón visible para cerrarlo, aunque la especificación no lo pida. El atributo closedby de MDN decide el resto: con el valor any, un clic o un toque fuera también cierra el diálogo, lo que MDN llama light dismiss.

Un nombre y el rol correcto

Los navegadores presentan el elemento dialog casi igual que uno hecho a mano con role="dialog". MDN señala que un diálogo abierto con showModal() recibe aria-modal="true" por sí solo.

Dale un nombre al diálogo, normalmente apuntando aria-labelledby a su título, como describe el patrón del W3C para diálogos modales. Nuestra guía de aria-label explica cuándo nombrar un elemento con un texto visible.

Si lo haces sin el elemento dialog

MDN advierte que el elemento dialog trae funciones que tienes que rehacer si usas un div. aria-modal="true" por sí solo avisa a las tecnologías de apoyo de que el diálogo es modal, pero no lo vuelve modal.

Tienes que mantener el foco dentro con un script, cerrarlo con Escape y dejar inerte todo lo demás. El atributo inert hace esto último: el contenido inerte no se puede pulsar ni enfocar, y sale del árbol de accesibilidad. Un diálogo que no es modal debe quitar aria-modal o ponerlo en false. Nuestra guía de qué es ARIA explica por qué ARIA deja el comportamiento en manos de tu script.

Cómo hacer una ventana modal accesible

  1. Usa el elemento dialog y ábrelo con showModal().
  2. Dale nombre apuntando aria-labelledby a su título.
  3. Pon dentro un botón visible para cerrarlo.
  4. Mantén Escape, y decide si un clic fuera también lo cierra.
  5. Añade autofocus al control que se necesita primero.
  6. Devuelve el foco al botón que lo abrió cuando se cierre.
  7. Comprueba con el teclado y un lector de pantalla que no se llega a nada de detrás.

Nuestro aviso de cookies como diálogo

El 5 de noviembre de 2026 leímos en el árbol de accesibilidad de Chrome nuestro aviso de cookies, en la página de inicio y en una guía de cada idioma. Es un div con role="dialog" que toma el nombre de su título, «Tus opciones de privacidad». El aviso compacto no es modal: no toma el foco y la página se puede seguir usando.

Las preferencias, que se abren desde el enlace del pie, sí son modales. El foco pasa al primer control de dentro, y doce pulsaciones de Tab no salieron de ellas. Escape las cierra y devuelve el foco al enlace del pie.

Esa mañana la página de detrás seguía respondiendo: en una guía, un clic en nuestro logo te sacaba de la página, y Chrome la mantenía en su árbol. Ahora la página de detrás queda inerte mientras las preferencias están abiertas, y un clic fuera las cierra igual que Escape.

Antes de publicar

  • El diálogo tiene un nombre que coincide con su título.
  • El foco entra en el diálogo al abrirse.
  • Tab y Mayús+Tab se quedan dentro de un diálogo modal.
  • Escape y un botón visible lo cierran.
  • El foco vuelve al control que lo abrió.
  • Nada de lo que hay detrás de un diálogo modal se puede pulsar ni leer.

RecuerdaUn diálogo modal es una promesa: hasta que se cierra, solo funciona lo de dentro. showModal() la cumple por ti; con un div, la tiene que cumplir tu script.

Nuestro servicio de diseño web hace diálogos que cumplen esa promesa.

Respuestas rápidas sobre el elemento dialog

¿Qué diferencia hay entre show() y showModal()?

showModal() abre el diálogo como modal: el resto de la página queda inerte, un fondo lo cubre y Escape lo cierra. show() lo abre como no modal, así que se puede seguir usando la página, y Escape no lo cierra, como explica web.dev.

¿Un diálogo necesita un botón para cerrarlo?

Tómalo como obligatorio. web.dev señala que la especificación no lo pide, pero un botón visible que recibe el foco ayuda a todo el mundo. MDN considera un botón explícito de cerrar, cancelar o confirmar la forma más segura de que cualquiera pueda cerrarlo.

¿Basta aria-modal para que un diálogo sea modal?

No. MDN dice que aria-modal="true" avisa a las tecnologías de apoyo de que el diálogo es modal, pero no lo vuelve modal. Tienes que mantener el foco dentro, cerrarlo con Escape y dejar inerte el resto de la página, que es lo que showModal() hace por ti.

¿Adónde va el foco cuando un diálogo se abre y se cierra?

Al abrirse, entra en el diálogo: showModal() lo pone en el primer elemento que puede recibirlo, y autofocus puede elegir otro. Al cerrarse, según web.dev, el foco vuelve al elemento que lo abrió.

¿Puede cerrarse un diálogo con un clic fuera?

Sí, si lo decides. MDN describe el atributo closedby: con closedby="any", un clic o un toque fuera cierra el diálogo, igual que Escape. Un diálogo modal abierto con showModal() no se cierra así salvo que lo indiques.

Fuentes

Consultadas el 5 de noviembre de 2026. web.dev: Cuadro de diálogo. En inglés: MDN Web Docs, <dialog> HTML dialog element, ARIA: aria-modal attribute e inert HTML global attribute; Iniciativa de Accesibilidad Web del W3C, Dialog (Modal) Pattern. Nuestro caso: nuestras propias páginas, leídas en un navegador el 5 de noviembre de 2026.

Pedro Galindez

Pedro Galindez

Fundador de Feedback Studios, estudio de crecimiento bilingüe en Miami.

Escuchar0:00 /7:15

Más guías

Revisada 5 de noviembre de 2026

aria-current: cómo marcar la página actual en la navegación

Qué hace aria-current, qué valor usar, cómo marcan la página actual los menús y las rutas de navegación, y por qué actual no es seleccionado.

Revisada 5 de noviembre de 2026

aria-live: cómo hacer que el lector de pantalla anuncie los cambios de la página

Qué hace aria-live, polite frente a assertive, por qué la región debe existir antes del mensaje, aria-atomic y los roles que ya son regiones vivas.

Revisada 5 de noviembre de 2026

aria-expanded: cómo decirle al lector de pantalla si un menú o una sección está abierto

Qué hace aria-expanded, dónde va, por qué los desplegables de navegación no son menús y qué teclas deben abrirlos y cerrarlos.

Revisada 3 de noviembre de 2026

First Contentful Paint (FCP): qué es y cómo acelerarlo

Qué cuenta como contenido para el FCP, en qué se diferencia del LCP, los umbrales, cómo acelerarlo y lo que muestran nuestras páginas.

Revisada 3 de noviembre de 2026

Errores soft 404: qué son y cómo corregirlos

Qué es un soft 404, las tres correcciones que da Google según la página, cómo corregirlo y lo que responde nuestro sitio.

Siguiente paso

Cuéntanos qué necesitas

Escríbenos por WhatsApp o envíanos un mensaje. Respondemos en español o en inglés.