La Etiqueta DIALOG

Permite crear ventanas modales y diálogos interactivos nativos en HTML, sin necesidad de librerías externas.

La etiqueta <dialog> permite crear ventanas modales y diálogos interactivos nativos en HTML, sin necesidad de librerías externas. Es ideal para formularios, alertas, confirmaciones o contenido emergente, con soporte para accesibilidad y gestión de enfoque automático.

Sintaxis básica

<dialog id="miDialogo">
  <h2>¡Hola! Soy un diálogo</h2>
  <button onclick="document.getElementById('miDialogo').close()">Cerrar</button>
</dialog>

<button onclick="document.getElementById('miDialogo').showModal()">Abrir diálogo</button>

Atributos y métodos clave

Atributo/Método Descripción
open Muestra el diálogo (sin backdrop, no modal)
showModal() Abre el diálogo como modal (con backdrop)
close() Cierra el diálogo
returnValue Valor devuelto al cerrar el diálogo (útil para formularios)

Casos de uso comunes

Diálogo de confirmación

<dialog id="confirmacion">
  <p>¿Guardar cambios?</p>
  <form method="dialog">
    <button value="cancelar">Cancelar</button>
    <button value="confirmar">Confirmar</button>
  </form>
</dialog>

<script>
  const dialog = document.getElementById('confirmacion');
  dialog.addEventListener('close', () => {
    if (dialog.returnValue === 'confirmar') {
      console.log('Cambios guardados');
    }
  });
</script>

Formulario en modal

<dialog id="formulario">
  <form method="dialog">
    <label>Nombre: <input type="text" required></label>
    <button type="submit">Enviar</button>
  </form>
</dialog>

Diálogo con backdrop personalizado

dialog::backdrop {
  background: rgba(0, 0, 0, 0.8);
}

Accesibilidad

  • Enfoque automático: El primer elemento interactivo recibe el foco al abrirse.

  • Cierre con Esc: Los modales se cierran con la tecla Esc por defecto.

  • ARIA: No requiere roles adicionales (ya incluye role="dialog").

Estilización con CSS

Personaliza la apariencia del diálogo y su fondo:

dialog {
  border: none;
  border-radius: 8px;
  padding: 2rem;
  box-shadow: 0 0 20px rgba(0,0,0,0.3);
  width: 90%;
  max-width: 500px;
}

dialog::backdrop {
  background: rgba(0, 128, 0, 0.5);
}

Errores comunes

Olvidar cerrar el diálogo

// Incorrecto: Abrir sin opción de cierre
document.getElementById('dialogo').showModal();

Usar para contenido no modal

<!-- Incorrecto: Usar <dialog> como tooltip -->
<dialog open>Información adicional</dialog>

Ignorar la compatibilidad

  • Algunos navegadores antiguos no soportan <dialog> (ver Can I use).

Ejemplos avanzados

Diálogo con resultado personalizado

<dialog id="personalizado">
  <p>Elige una opción:</p>
  <button onclick="this.closest('dialog').close('opcion1')">Opción 1</button>
  <button onclick="this.closest('dialog').close('opcion2')">Opción 2</button>
</dialog>

<script>
  document.getElementById('personalizado').addEventListener('close', function() {
    console.log('Opción seleccionada:', this.returnValue);
  });
</script>

Animación de entrada/salida

dialog {
  animation: slideIn 0.3s ease-out;
}

@keyframes slideIn {
  from { transform: translateY(-100%); }
  to { transform: translateY(0); }
}

Buenas prácticas

  1. Usar method="dialog" en formularios: Cierra automáticamente el diálogo al enviar.

  2. Manejar el evento close: Para procesar datos después de cerrar.

  3. Polyfill para compatibilidad: Usa dialog-polyfill si es necesario.

  4. Semántica clara: Incluir encabezados (<h2>) y etiquetas accesibles.

Conclusión:

La etiqueta <dialog> simplifica la creación de ventanas modales:

  • Nativa y accesible: Soporte integrado para teclado y lectores de pantalla.
  • Personalizable: Estilos CSS y animaciones.
  • Versátil: Ideal para formularios, confirmaciones o contenido emergente.

¡Reemplaza tus modales customizados por la solución nativa de HTML! ????