HTML : <dialog>

Introduction Introduction

Pendant longtemps, lorque l’on souhaitait créer une boîte de dialogue en HTML, on avait recours à des librairies Javascript ou des plugins. Depuis HTML5, il est possible de créer des boîtes de dialogues en utilisant l’élément natif <dialog>.

L’usage est simple et permet de créer des boîtes de dialogues personnalisées et accessibles.

Voir la documentation officielle

Syntaxe Syntaxe

Pour créer une boîte de dialogue, on utilise l’élément HTML <dialog> et si on souhaite l’avoir ouverte par défaut, on ajoute l’attribut open.

<dialog open>
  <!-- votre contenu -->
</dialog>

Gestion de l’ouverture Gestion de l’ouverture

Pour gérer l’ouverture de la boîte de dialogue, on peut utiliser les méthodes show() ou showModal(). La différence entre les deux est que showModal() va bloquer l’interaction avec le reste de la page tant que celle-ci est ouverte contrairement à show().

const dialog = document.querySelector('dialog');
const showButton = dialog.querySelector('+ button');

showButton.addEventListener('click', () => {
  dialog.showModal();
});

Attention

Il est important de noter que lorsqu’un élément dialog est ouvert tout le reste de la page est inerte (non cliquable et non focusable)

Gestion de la fermeture Gestion de la fermeture

Pour gérer la fermeture de la boîte de dialogue, on peut utiliser la méthode close() mais on peut également le faire à l’aide des formulaires.

const dialog = document.querySelector('dialog');
const closeButton = document.querySelector('dialog button');

closeButton.addEventListener('click', () => {
  dialog.close();
});

Remarque

On peut également fermer la boîte de dialogue avec la touche Échap, ce qui est un plus pour l’accessibilité.

Démo Démo

Salutations, à toutes et à tous !

Don't

Il est déconseillé de gérer l’ouverture et la fermeture avec l’attribut open

Avec les formulaires Avec les formulaires

Nous avons dû utiliser du Javascript pour gérer la fermeture du formulaire mais cela n’est pas forcément nécessaire si notre boîte de dialogue est conçue avec un formulaire qui possède l’attribut method="dialog".

Salutations, à toutes et à tous !

Remarque

Généralement, on affecte l’attribut autofocus sur lequel l’utilisateur est censé effectuer la première action.

l’attribut formmethod l’attribut formmethod

On peut également utiliser l’attribut formmethod="dialog" sur le bouton de fermeture

<dialog>
  <form>
    <button formmethod="dialog">Fermer</button>
  </form>
</dialog>

Valeur de retour Valeur de retour

Lors de la fermeture d’une boîte de dialogue contenant un formulaire, si celui-ci contient un champ et un bouton de type submit, sa valeur est retournée grâce à la propriété returnValue .

Nom saisi :

Customisation CSS Customisation CSS

L’élément <dialog> est personnalisable avec le CSS, il existe quelques pseudo-classes :

On peut par exemple :

Dialog with fadein appear and backdrop blurred

dialog {
  
  &::backdrop {
    background-color: rgba(0, 0, 0, 0.5);
    backdrop-filter: blur(5px);
  }

  &[open],
  &[open]::backdrop {
      animation: fadein 500ms linear forwards;
  }
  
}

@keyframes fadein {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

Remarque

On pourra améliorer les effets d’apparition avec la propriété @starting-style que nous verrons dans un autre article.

Fermeture sur le backdrop Fermeture sur le backdrop

Nativement, il n’est pas possible de fermer une boîte de dialogue en cliquant sur l’arrière-plan. Pourtant, on avait l’habitude de fermer une boîte de dialogue en cliquant en dehors de celle-ci.

Voici un exemple de code pour fermer une boîte de dialogue en cliquant sur l’arrière-plan.

<dialog id="monid" onclick="document.querySelector(`#monid`).close()">
  <div class="dialog-inner" onclick="event.stopPropagation();">
    <!-- le contenu -->
  </div>
</dialog>

L’astuce consiste à empêcher la propagation de l’événement click sur le contenu de la boîte de dialogue en ajoutant un élément intermédiaire.

Retour à la liste des articles
Github de Samuel Gomez Linkedin de Samuel Gomez Twitter de Samuel Gomez Instagram de Samuel Gomez
Allez en haut