Menu

details et summary en HTML : sections repliables

Les éléments <details> et <summary> créent une section repliable sans JavaScript : le summary reste toujours visible et un clic dessus affiche ou masque le reste. Découvrez le balisage, les attributs open et name, les accordéons, le style de la flèche et l'événement toggle.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Du contenu repliable avec details et summary

Entourez le contenu de <details> et placez un <summary> en premier. Le summary reste visible ; tout le reste est masqué jusqu'à ce que le lecteur clique dessus :

Cliquez sur la question pour l'ouvrir, puis de nouveau pour la fermer. Le navigateur ajoute le marqueur triangulaire, rend le summary focalisable, le fait basculer avec Entrée ou Espace, et indique aux lecteurs d'écran s'il est déplié ou replié. Aucun JavaScript n'intervient.

Si vous omettez <summary>, le navigateur affiche à la place un libellé par défaut (« Détails » en français).

Ouvert par défaut

L'attribut booléen open affiche le contenu dès le départ. Le navigateur ajoute et retire open au fil des bascules du lecteur, c'est donc aussi la prise pour le style :

La boîte ouverte a une bordure bleue grâce à details[open]. Ouvrez « Returns » et elle devient bleue aussi ; les deux peuvent être ouvertes en même temps.

Accordéon : un seul ouvert à la fois

Donnez le même name à plusieurs éléments <details> et ils forment un groupe exclusif : en ouvrir un ferme les autres. Cela demandait autrefois du JavaScript et fonctionne désormais avec le seul attribut dans les versions actuelles de Chrome, Edge, Firefox et Safari :

Ouvrez la deuxième question et la première se ferme. Retirez les attributs name et elles s'ouvrent de nouveau indépendamment. Un accordéon exclusif masque un contenu que le lecteur voudrait peut-être comparer, donc utilisez-le quand les sections sont des alternatives, et des <details> simples quand on peut vouloir en ouvrir plusieurs.

Styliser le marqueur

Le triangle est un marqueur de liste sur le summary. list-style: none le retire (la règle ::-webkit-details-marker couvre Safari), et un pseudo-élément peut dessiner votre propre indicateur :

Le signe plus pivote de 45 degrés pour devenir une croix quand la section s'ouvre. Gardez un style de focus visible comme le contour :focus-visible ici : une fois le marqueur par défaut retiré, c'est sur l'anneau de focus que comptent les utilisateurs au clavier.

L'événement toggle et la propriété open

Le JavaScript peut lire et définir details.open, et l'événement toggle se déclenche après chaque changement, qu'il vienne d'un clic, d'une touche ou d'un script :

« Expand all » définit open sur les deux, et le journal affiche le dernier événement toggle. L'événement ne remonte pas, donc écoutez chaque élément <details> plutôt qu'un parent.

Que mettre dans un summary

Un summary contient du texte, des éléments inline, ou un titre quand le titre de la section appartient au plan de la page :

<details>
  <summary><h3>Refund policy</h3></summary>
  <p>...</p>
</details>

Évitez les liens, les boutons et les champs de formulaire dans <summary> : le summary est déjà un contrôle, donc un contrôle à l'intérieur passe facilement inaperçu ou se déclenche par erreur, et les lecteurs d'écran annoncent mal les contrôles imbriqués. Placez plutôt le contenu interactif dans le corps du <details>.

Erreurs fréquentes

  • Construire une bascule avec une <div> et du JavaScript. <details> gère déjà les clics, les touches et l'état pour les lecteurs d'écran. Quand vous avez vraiment besoin d'une bascule personnalisée, utilisez un bouton avec aria-expanded.
  • Placer <summary> ailleurs qu'en premier. Il doit être le premier enfant de <details>.
  • Masquer le marqueur sans le remplacer. Donnez aux lecteurs un signe que le summary s'ouvre, comme le signe plus ci-dessus.
  • Utiliser display pour masquer le contenu. Basculez plutôt open ; un CSS qui force le contenu visible ou masqué lutte contre l'état du navigateur.
  • Des groupes exclusifs pour un contenu que les gens comparent. N'utilisez name que lorsqu'une seule section ouverte à la fois a du sens.

Questions fréquentes

À quoi servent details et summary en HTML ?

<details> crée un widget de divulgation : une section qui peut s'ouvrir et se fermer. Son premier enfant, <summary>, est le libellé toujours visible ; un clic dessus (ou Entrée ou Espace quand il a le focus) affiche ou masque tout le reste du <details>.

Comment ouvrir un élément details par défaut ?

Ajoutez l'attribut booléen open : <details open>. Le navigateur ajoute et retire cet attribut au fil des ouvertures et fermetures, donc le CSS peut styliser details[open].

Comment faire un accordéon où une seule section est ouverte ?

Donnez à chaque <details> du groupe le même attribut name, par exemple name="faq". En ouvrir un ferme les autres du groupe, sans JavaScript.

Comment retirer ou changer la flèche d'un details summary ?

Définissez list-style: none sur summary et ajoutez summary::-webkit-details-marker { display: none; } pour Safari. Dessinez ensuite votre propre indicateur, par exemple avec summary::after, et changez-le avec details[open] summary::after.

Peut-on détecter l'ouverture d'un élément details ?

Oui. Écoutez l'événement toggle sur l'élément <details> et lisez sa propriété open. Définir details.open = true en JavaScript l'ouvre.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER