aria-modal
Indica a la tecnología asistiva que trate el resto de la página como inerte mientras un diálogo está abierto. Se establece en "true" sobre role="dialog" o role="alertdialog". No convierte el fondo en inerte por sí solo — combínelo con el atributo inert o una trampa de foco.
Cuándo utilizarlo
En un elemento role="dialog" o role="alertdialog" que deba bloquear la interacción con el resto de la página mientras está abierto. Establezca aria-modal="true" para que el lector de pantalla confine su cursor virtual al diálogo y anuncie el contenido de fondo como inaccesible.
Un diálogo modal tiene tres responsabilidades:
aria-modal="true"— informa a la tecnología asistiva que el diálogo es modal.- Fondo inerte — aplicado mediante el atributo
inertsobre el contenido circundante, o mediante una trampa de foco gestionada con JavaScript. Sin esto, los usuarios de teclado pueden salir del diálogo con Tab. - Foco inicial — mueve el foco al interior del diálogo cuando se abre, y lo devuelve al disparador cuando se cierra.
aria-modal solo cubre el aspecto del lector de pantalla; no impide que un usuario de teclado pase por encima del diálogo con Tab. La compatibilidad del navegador para inferir la inercia a partir de aria-modal es inconsistente, por lo que conviene combinar siempre ambas técnicas.
El elemento nativo HTML <dialog> con .showModal() gestiona las tres responsabilidades de forma automática. Prefiera esta opción cuando sea viable.
Cómo mantenerlo sincronizado
Los valores válidos son "true" y "false". Renderice "true" mientras el diálogo está abierto; elimine el atributo o establézcalo en "false" mientras está cerrado (habitualmente el diálogo cerrado ni siquiera está en el DOM, por lo que el atributo carece de relevancia).
aria-modal se combina con dos atributos de etiquetado:
aria-labelledby="<id-del-título-del-diálogo>"— apunta al encabezado visible.aria-describedby="<id-del-cuerpo-del-diálogo>"— opcional, para una descripción breve.
Juntos proporcionan al lector de pantalla un anuncio de apertura coherente: «Diálogo, ¿Eliminar cuenta?, Esta acción no se puede deshacer.»
Errores frecuentes
aria-modal="true"sin ninguna trampa de foco — los usuarios de teclado llegan hasta el fondo.- Usar
aria-modalen un popover o tooltip no modal. Userole="dialog"solo para diálogos modales auténticos; un popover no es un diálogo. - Falta
aria-labelledby— el lector de pantalla anuncia «Diálogo» sin nombre. - No mover el foco al interior del diálogo cuando se abre.
- No restaurar el foco al disparador original cuando se cierra.
- Marcar el fondo con
aria-hidden="true"en lugar deinert— el foco del teclado sigue escapando; solo el cursor del lector de pantalla queda confinado. - Dos modales abiertos simultáneamente con
aria-modal="true". El árbol de accesibilidad se confunde; muestre uno a la vez.
Ejemplo
<div
role="dialog"
aria-modal="true"
aria-labelledby="confirm-title"
aria-describedby="confirm-body"
>
<h2 id="confirm-title">¿Eliminar cuenta?</h2>
<p id="confirm-body">Esta acción no se puede deshacer.</p>
<button type="button" autofocus>Cancelar</button>
<button type="button">Eliminar</button>
</div>