Navigation✨ Premium

Morphing Hamburger

Trois traits CSS pivotent vers un X avec inertie back-ease — l'indicateur d'état ouvert/fermé le plus reconnu de l'UI mobile.

CSSMorph

Vous aurez accès à la démo interactive avec un compte gratuit.

Cet effet fait partie d'Effect.Labs — 811 effets vanilla, une partie gratuite, une partie premium. Navigation comprend 36 effets, dont 4 gratuits. Découvrir la catégorie →

3 exemples d'usage

Header mobile — Navigation principale d'une appli — Morphing Hamburger exemple 1

① Header mobile — Navigation principale d'une appli

QuandL'utilisateur visite l'appli sur mobile et doit accéder au menu principal masqué derrière le hamburger.
PourquoiLe morphing vers X communique clairement que tapper à nouveau fermera le menu — meilleur retour d'état que n'importe quelle icône statique.
RéglagesTraits blancs 24×2 px sur header sombre, zone de clic 44×44 px pour le confort tactile, transition à 0,35 s — légèrement plus rapide que le défaut pour un ressenti mobile réactif.
Dashboard — Bouton de bascule du panneau latéral — Morphing Hamburger exemple 2

② Dashboard — Bouton de bascule du panneau latéral

QuandSur un dashboard avec sidebar rétractable, l'utilisateur veut masquer ou afficher le panneau de navigation pour libérer de l'espace de travail.
PourquoiL'hamburger est immédiatement reconnaissable comme bascule de panneau ; le X confirme que la sidebar est ouverte et peut être refermée d'un nouveau clic.
RéglagesTraits gris clair #94a3b8 de 20×2 px, conteneur 32×32 px, transition à 0,25 s pour un ressenti desktop plus réactif.
Panneau de filtres — Tiroir de paramètres d'un catalogue — Morphing Hamburger exemple 3

③ Panneau de filtres — Tiroir de paramètres d'un catalogue

QuandSur une page de résultats ou un catalogue, l'utilisateur déclenche un panneau de filtres latéral via le bouton hamburger dans la barre d'outils.
PourquoiLe morphing en X signale que le panneau est actif et peut être fermé d'un nouveau clic — comportement attendu et cohérent avec le pattern drawer.
RéglagesTraits en couleur accent (#6366f1) de 22×2,5 px pour contraster avec la barre d'outils neutre, back-ease conservé pour la même inertie reconnaissable.

Comment ça marche

L'effet repose sur trois <span class="line"> positionnés en absolu au centre d'un conteneur 36×36 px en flexbox. À l'état hamburger, les traits 1 et 3 sont écartés verticalement via translateY(±8px) ; le trait 2 est délibérément plus court (18 px contre 24 px) — une asymétrie discrète qui donne du caractère à l'icône au repos.

La transformation est entièrement pilotée par CSS : quand la classe .morphed est posée sur le conteneur, les traits 1 et 3 reviennent à Y=0 puis rotate(±45deg) pour former un X, tandis que le trait 2 s'efface via width: 0 et opacity: 0. Aucun calcul JS n'est impliqué dans le rendu.

La courbe de transition cubic-bezier(.68, -.55, .27, 1.55) est un back ease-out : les traits dépassent légèrement l'angle cible (overshoot) avant de revenir à la position finale. Cet effet d'inertie mécanique — invisible sur une transition linéaire — renforce la perception de poids et de réponse sans recourir à JS. La durée de 0,4 s laisse l'œil suivre le mouvement sans latence perçue.

Le JavaScript se limite à un unique classList.toggle('morphed') déclenché au clic sur l'élément. Si l'utilisateur clique avant la fin de la transition, le navigateur reprend l'animation depuis l'état intermédiaire courant et l'inverse — comportement natif, aucune gestion d'état manuelle requise.

Accessibilité

  • prefers-reduced-motion absent : aucune règle @media (prefers-reduced-motion: reduce) n'est présente dans le code. La transition s'exécute toujours, quel que soit le paramètre OS. À ajouter si nécessaire : .morphing-hamburger .line { transition: none; } dans la media query.
  • L'élément déclencheur est un <div> avec handler JS, pas un <button> natif — non focusable au clavier par défaut. Ajouter tabindex="0" et un gestionnaire keydown (Entrée/Espace) pour la conformité WCAG 2.1.
  • Aucun aria-expanded présent : les lecteurs d'écran ne peuvent pas connaître l'état ouvert/fermé. Alterner aria-expanded="false" / "true" au clic dans le handler.
  • Aucun aria-label : le contrôle n'a pas de nom accessible. Ajouter aria-label="Ouvrir le menu" mis à jour dynamiquement à chaque toggle.
  • Contraste des traits (#fff sur fond #0a0a0f) : ratio > 21:1 — conforme WCAG AA et AAA sans condition.

Compatibilité navigateur

Nécessite CSS Transitions et classList.toggle — disponibles dans tout navigateur moderne depuis 2014.

Chrome 57+✓ Complet
Firefox 36+✓ Complet
Safari 9+✓ Complet
Edge 16+✓ Complet
Mobile iOS✓ Touch OK
Android Chrome✓ Complet

Sans JavaScript, l'icône reste figée en état hamburger — aucun style cassé, aucune erreur. Sans support des transitions CSS (IE9 et antérieurs), le passage hamburger → X s'effectue instantanément sans animation.

Le code

Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :

index.html — structure
<div class="morphing-hamburger" id="morphingHamburger">
  <span class="line"></span>
  <span class="line"></span>
  <span class="line"></span>
</div>
🔒 Débloquer le code complet — à partir de 2,99 € le 1er mois

HTML + CSS + JS complet, prêt à coller — avec des centaines d'effets premium.

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
background (sur .morphing-hamburger .line) #fff Couleur des traits. Passez en couleur brand ou en currentColor pour hériter de la couleur de texte du parent.
width (sur .line) 24px Largeur des traits 1 et 3. Ajustez en parallèle le trait 2 (.line:nth-child(2), 18 px) pour conserver le ratio asymétrique — ex. 20 px / 15 px pour une icône compacte.
height (sur .line) 2px Épaisseur des traits. 3 px pour un look bold, 1 px pour un style ultra-fin.
transition (sur .line) .4s cubic-bezier(.68,-.55,.27,1.55) Durée et courbe d'animation. Réduisez à .2s pour une réponse vive, ou remplacez la courbe par ease-in-out pour supprimer l'overshoot et obtenir une transition sobre.
translateY (lignes 1 et 3) ±8px Écart vertical entre les traits en état hamburger. Réduisez à ±6 px pour une icône compacte, augmentez à ±10 px pour une icône plus aérée.
width / height (sur .morphing-hamburger) 36px / 36px Taille du conteneur et de la zone cliquable. Passez à 44 px minimum pour respecter les recommandations WCAG sur la taille de cible tactile (2,75 rem).
border-radius (sur .line) 2px Arrondi des extrémités. 0 pour des traits carrés nets, 4 px pour un look doux et arrondi.

FAQ

Oui — remplacez <div class="morphing-hamburger" id="morphingHamburger"> par un <button> avec les mêmes classe et id. Ajoutez background: none; border: none; padding: 0; cursor: pointer; dans le CSS pour neutraliser les styles par défaut. Le JS toggle reste identique ; mettez à jour aria-label et aria-expanded au clic pour la conformité WCAG.
Le classList.toggle('morphed') gère l'état graphique de l'icône. Dans le même handler, déclenchez l'ouverture de votre menu : nav.classList.toggle('open'), une transition de hauteur ou un transform: translateX. L'icône et le menu partagent le même toggle et restent toujours synchronisés sans état supplémentaire.
Non — les transitions CSS sont reprises depuis l'état intermédiaire en cours. Si l'utilisateur clique avant la fin de la transition, le navigateur inverse l'animation depuis la position actuelle des traits. Aucune gestion manuelle d'état n'est nécessaire, et le résultat visuel reste cohérent.