Bonjour à tous,
Pour les anciens qui se rappelleront éventuellement : il y a deux ans presque jours pour jour, après avoir codé un menu accordéon, je demandais des avis d'optimisation pour le JS (et un certain Ostara m'en avait mis plein la vue avec son refactoring de mon code).
Depuis j'ai amélioré ce menu accordéon et dernièrement je l'ai encore modifié sur le plan du CSS. Voir ce CodePen : Accordion details/summary
Le truc c'est que, pour ajouter une simple bordure sur les panneaux ouverts, il me faut faire tout un schmilblick afin qu'elle ne reste pas apparente à la fermeture du panneau et aussi afin qu'elle ne disparaisse pas d'un coup avant la fermeture complète :
Intuitivement j'ai assez rapidement codé cette solution (transition>border-color>cubic-bezier), mais je trouve que c'est un peu abusé quand même (sortir le bazooka pour une mouche) et pas terrible pour la maintenance du code. Quelqu'un voit-il une solution plus simple ? Quelque fois, quand on a la tête dans le guidon...
Nota bene : le choix des transition CSS plutôt que d'une animation CSS est un partit pris : l'accordéon est ainsi plus réactif, contrairement à celui de Bootstrap par exemple, qui doit finir son action avant d'être à nouveau cliquable. Ma solution n'est pas sans inconvénients, mais cela est le sujet d'un autre débat...
Modifié par Olivier C (21 May 2022 - 09:09)
Pour les anciens qui se rappelleront éventuellement : il y a deux ans presque jours pour jour, après avoir codé un menu accordéon, je demandais des avis d'optimisation pour le JS (et un certain Ostara m'en avait mis plein la vue avec son refactoring de mon code).
Depuis j'ai amélioré ce menu accordéon et dernièrement je l'ai encore modifié sur le plan du CSS. Voir ce CodePen : Accordion details/summary
Le truc c'est que, pour ajouter une simple bordure sur les panneaux ouverts, il me faut faire tout un schmilblick afin qu'elle ne reste pas apparente à la fermeture du panneau et aussi afin qu'elle ne disparaisse pas d'un coup avant la fermeture complète :
.accordion > * > :last-child {
overflow: hidden;
padding: 0 1em;
background-color: #444;
border: 1px solid rgba(255,255,255,0.1);
border-top: none;
border-radius: 0.2em;
box-shadow: 0 1rem 1rem rgba(0,0,0,0.1);
transition: max-height 0.5s ease-in-out;
}
.accordion > * > :last-child[aria-hidden=true] {
max-height: 0;
border-color: transparent; /* "Efface" la bordure, sinon elle apparaît encore lorsque le panneau est fermé. */
transition: max-height 0.5s ease-in-out, border-color 0.5s cubic-bezier(1, 0, 1, 0); /* @note Fait disparaître la bordure au dernier moment ; mais oblige aussi à répéter la propriété max-height sinon écrasement de cette propriété. */
}
Intuitivement j'ai assez rapidement codé cette solution (transition>border-color>cubic-bezier), mais je trouve que c'est un peu abusé quand même (sortir le bazooka pour une mouche) et pas terrible pour la maintenance du code. Quelqu'un voit-il une solution plus simple ? Quelque fois, quand on a la tête dans le guidon...
Nota bene : le choix des transition CSS plutôt que d'une animation CSS est un partit pris : l'accordéon est ainsi plus réactif, contrairement à celui de Bootstrap par exemple, qui doit finir son action avant d'être à nouveau cliquable. Ma solution n'est pas sans inconvénients, mais cela est le sujet d'un autre débat...
Modifié par Olivier C (21 May 2022 - 09:09)