Écrit par Rob O'Leary✏️
Les
Lorsque l'utilisateur clique sur le widget ou se concentre dessus et appuie sur la barre d'espace, il s'ouvre et révèle des informations supplémentaires. Le marqueur triangulaire pointe vers le bas pour indiquer qu'il est dans un état ouvert :
Le widget de divulgation a une étiquette qui est toujours affichée et est fournie par le
Vous pouvez également fournir plusieurs éléments après le
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
Il y a quelques problèmes d'interopérabilité qui doivent être pris en compte lors du style des éléments
Le
Le widget de divulgation comporte deux pseudo-éléments pour styliser ses éléments constitutifs :
Dans les sections suivantes, je présenterai certaines des façons les plus récentes et les moins connues de personnaliser un widget de divulgation.
Lorsque vous ouvrez un widget de divulgation, il s'ouvre instantanément. Clignez des yeux, et vous le manquerez !
Il est préférable de passer d'un état à un autre de manière plus progressive pour montrer à l'utilisateur l'impact de son action. Pouvons-nous ajouter une animation de transition aux actions d'ouverture et de fermeture d'un widget de divulgation ? Bref, oui !
Pour animer cela, nous voulons que la hauteur du contenu caché passe de zéro à sa hauteur finale. La valeur par défaut de la propriété height est auto, ce qui laisse au navigateur le soin de calculer la hauteur en fonction du contenu. L'animation sur une valeur auto n'était pas possible en CSS jusqu'à l'ajout de la propriété [interpolate-size](https://nerdy.dev/interpolate-size). Bien que la prise en charge du navigateur soit un peu limitée pour les nouvelles fonctionnalités CSS que nous devons utiliser (principalement interpolate-size et ::details-content), il s'agit d'un excellent exemple d'amélioration progressive. Cela fonctionnera actuellement dans Chrome !
Voici un exemple CodePen de l'animation.
Tout d'abord, nous ajoutons une taille d'interpolation afin de pouvoir passer à une hauteur automatique :
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
Ensuite, nous voulons décrire le style fermé. Nous voulons que le contenu « informations supplémentaires » ait une hauteur de zéro et garantisse qu'aucun contenu n'est visible, c'est-à-dire que nous voulons éviter tout débordement.
Nous utilisons le pseudo-élément ::details-content pour cibler le contenu caché. J'utilise la propriété block-size plutôt que la propriété height car c'est une bonne habitude d'utiliser des propriétés logiques. Nous devons inclure la visibilité du contenu dans la transition car le navigateur définit la visibilité du contenu : caché sur le contenu lorsqu'il est dans un état fermé — l'animation de fermeture ne fonctionnera pas sans l'inclure :
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
L'animation ne fonctionnera toujours pas comme prévu car la propriété content-visibility est une propriété animée discrète. Cela signifie qu'il n'y a pas d'interpolation ; le navigateur basculera entre les deux valeurs afin que le contenu en transition soit affiché pendant toute la durée de l'animation. Nous ne voulons pas de cela.
Si nous incluons transition-behavior:allow-discrete;, la valeur s'inverse à la toute fin de l'animation, nous obtenons donc notre transition progressive.
De plus, nous obtenons un débordement de contenu en définissant la taille du bloc sur 0 lorsque le widget de divulgation est dans un état intermédiaire. Nous montrons la plupart du contenu dès son ouverture. Pour éviter que cela ne se produise, nous ajoutons overflow: Hidden.
Enfin, nous ajoutons le style pour l'état ouvert. Nous voulons que l'état final ait une taille auto :
details { interpolate-size: allow-keywords; }
Ce sont les grandes lignes. Si vous préférez une explication vidéo plus détaillée, consultez la procédure pas à pas de Kevin Powell pour savoir comment animer
Le widget de divulgation peut s'agrandir horizontalement si le contenu des « informations supplémentaires » est plus large que le
Comme toute animation, vous devez prendre en compte les utilisateurs sensibles au mouvement. Vous pouvez utiliser la requête multimédia préfère-réduire le mouvement pour répondre à ce scénario :
/* closed state */ details::details-content { block-size: 0; transition: content-visibility, block-size; transition-duration: 750ms; transition-behavior: allow-discrete; overflow: hidden; }
Un modèle d'interface utilisateur courant est un composant accordéon. Il consiste en une pile de widgets de divulgation qui peuvent être étendus pour révéler leur contenu. Pour implémenter ce modèle, vous avez juste besoin de plusieurs
/* open state */ details[open]::details-content { block-size: auto; }
Le style par défaut est assez simple :
Chaque
Une variante de ce modèle consiste à rendre l'accordéon exclusif afin qu'un seul des widgets de divulgation puisse être ouvert à la fois. Dès que l’un est ouvert, le navigateur ferme l’autre. Vous pouvez créer des groupes exclusifs via l'attribut de nom
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
Avant d'utiliser des accordéons exclusifs, déterminez si cela est utile aux utilisateurs. Si les utilisateurs sont susceptibles de vouloir consommer davantage d’informations, cela les obligera à ouvrir souvent les éléments, ce qui peut s’avérer frustrant.
Cette fonctionnalité est actuellement prise en charge dans tous les navigateurs modernes, vous pouvez donc l'utiliser immédiatement.
Un widget de divulgation est généralement présenté avec un petit marqueur triangulaire à côté. Dans cette section, nous aborderons le processus de style de ce marqueur.
Le marqueur est associé au
Comme mentionné précédemment,
Avant de passer aux exemples, un petit mot sur la prise en charge des navigateurs. Au moment de la rédaction, Safari est le seul navigateur majeur qui ne prend pas entièrement en charge le style du marqueur :
Disons que nous voulions changer la couleur du marqueur triangulaire en rouge et l'agrandir de 50 %. Nous pouvons faire ce qui suit :
details { interpolate-size: allow-keywords; }
Cela devrait fonctionner sur tous les navigateurs. Voici l'exemple de CodePen.
Par défaut, le marqueur se trouve à côté du contenu du texte
Si nous définissons list-style-position sur outside, le marqueur se trouve à l'extérieur du
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
Vous pouvez le voir dans le deuxième cas dans la capture d'écran ci-dessus.
Voici un CodePen de cet exemple :
Si vous souhaitez modifier le contenu du marqueur, vous pouvez utiliser la propriété content du pseudo-élément ::marker. En fonction de vos préférences, vous pouvez le définir sur du texte. Pour mon exemple, j'ai utilisé l'emoji bouche zippée pour l'état fermé et l'emoji bouche ouverte pour l'état ouvert :
details { interpolate-size: allow-keywords; }
Pour utiliser une image pour le marqueur, vous pouvez utiliser la propriété content du pseudo-élément ::marker, ou la propriété list-style-image de
/* closed state */ details::details-content { block-size: 0; transition: content-visibility, block-size; transition-duration: 750ms; transition-behavior: allow-discrete; overflow: hidden; }
Dans l'exemple suivant, nous utilisons deux icônes de flèche provenant des symboles matériels pour le marqueur. La flèche orientée vers la droite correspond à l'état fermé et la flèche orientée vers le bas correspond à l'état ouvert :
Ces exemples fonctionneront comme prévu dans Chrome et Firefox, mais Safari ignorera les styles. Vous pouvez aborder cela comme une amélioration progressive et mettre fin à cela. Mais si vous souhaitez la même apparence dans tous les navigateurs, vous pouvez masquer le marqueur, puis ajouter votre propre image en remplacement. Cela vous donne plus de liberté :
/* open state */ details[open]::details-content { block-size: auto; }
Vous pouvez indiquer visuellement l'état à l'aide d'une nouvelle icône de marqueur, comme une image en ligne ou via des pseudo-éléments. Le
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
Vous pouvez également choisir de positionner le marqueur à la fin du
details { interpolate-size: allow-keywords; }
Cependant, il est important de noter que masquer le marqueur entraîne des problèmes d'accessibilité avec les lecteurs d'écran. Firefox, VoiceOver, JAWS et NVDA ont tous un problème pour annoncer systématiquement l'état basculé du widget de divulgation si le marqueur est supprimé. Malheureusement, le style est lié à l’État. Il est préférable d'éviter de faire cela.
Vous souhaiterez peut-être styliser la section « informations supplémentaires » du widget de divulgation sans divulguer de styles dans le
/* closed state */ details::details-content { block-size: 0; transition: content-visibility, block-size; transition-duration: 750ms; transition-behavior: allow-discrete; overflow: hidden; }
Mon choix est d'exclure le
/* open state */ details[open]::details-content { block-size: auto; }
Vous pouvez également utiliser le pseudo-élément ::details-content, qui cible la section entière. C'est pourquoi vous souhaitez l'utiliser pour animer les transitions d'état d'ouverture et de fermeture :
>@media (prefers-reduced-motion) { /* styles to apply if a user's device settings are set to reduced motion */ details::details-content { transition-duration: 0.8s; /* slower speed */ } }
Vous remarquez la différence ? Il n'y a qu'une seule marge au début de la section. Le
et
<details> <summary>Payment Options</summary> <p>...</p> </details> <details> <summary>Personalise your PIN</summary> <p>...</p> </details> <details> <summary>How can I add an additional cardholder to my Platinum Mastercard</summary> <p>...</p> </details>
Parce que le dans un
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
Masquer le marqueur entraîne des problèmes d'accessibilité avec certains lecteurs d'écran. Firefox, VoiceOver, JAWS et NVDA ont tous un problème pour annoncer systématiquement l'état basculé du widget de divulgation si le marqueur est supprimé
Récemment, il y a eu une grande proposition pour aider à faire des
La nouvelle intéressante est que les éléments 1 et 3 de la liste ci-dessus ont été livrés dans Chrome 131 (en novembre 2024). La prochaine phase devrait consister à améliorer le style du marqueur. De plus, il existe un ensemble de changements connexes qui contribueront à améliorer la capacité d'animer ces éléments.
Les
Le talon d'Achille de
À mesure que les interfaces Web deviennent de plus en plus complexes, les fonctionnalités gourmandes en ressources exigent de plus en plus du navigateur. Si vous souhaitez surveiller et suivre l'utilisation du processeur côté client, l'utilisation de la mémoire et bien plus encore pour tous vos utilisateurs en production, essayez LogRocket.
LogRocket est comme un DVR pour les applications Web et mobiles, enregistrant tout ce qui se passe dans votre application Web, votre application mobile ou votre site Web. Au lieu de deviner pourquoi les problèmes surviennent, vous pouvez regrouper et créer des rapports sur les principales mesures de performances du front-end, rejouer les sessions utilisateur avec l'état de l'application, enregistrer les requêtes réseau et faire apparaître automatiquement toutes les erreurs.
Modernisez la façon dont vous déboguez les applications Web et mobiles : démarrez la surveillance gratuitement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!