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 avecaria-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
displaypour masquer le contenu. Basculez plutôtopen; 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
nameque 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.