Navigation✨ Premium

Stagger Menu Reveal

La classe .revealed déclenche chaque item depuis la gauche avec 50 ms de délai progressif — spring cubic-bezier, zéro boucle d'animation.

CSSStaggerReveal

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

Sidebar de tableau de bord — révélation à l'ouverture du panneau — Stagger Menu Reveal exemple 1

① Sidebar de tableau de bord — révélation à l'ouverture du panneau

QuandLe panneau latéral s'ouvre à la connexion ou au clic sur le bouton hamburger d'une application.
PourquoiLa cascade gauche→droite suit le sens naturel de lecture et donne l'impression que le panneau se construit progressivement — plus dynamique qu'une apparition globale en fondu.
RéglagesDélai 50 ms par item (défaut), translateX(-20px), duration 400 ms — adapté à 5–7 items avant que le dernier perçoive trop d'attente.
Menu dropdown de navigation — apparition au survol du parent — Stagger Menu Reveal exemple 2

② Menu dropdown de navigation — apparition au survol du parent

QuandL'utilisateur survole un item de navigation principal et un sous-menu de 3–5 liens apparaît en dessous.
PourquoiLe stagger différencie visuellement chaque lien du groupe et guide l'œil vers le bas — plus lisible qu'un bloc qui pop instantanément à l'unisson.
RéglagesDélai réduit à 40 ms (plus vif en dropdown), translateX(-12px) pour une entrée plus subtile, duration 300 ms.
Panneau d'onboarding — liste d'étapes en cascade — Stagger Menu Reveal exemple 3

③ Panneau d'onboarding — liste d'étapes en cascade

QuandUn panneau « Premiers pas » s'ouvre pour la première fois sur un nouvel utilisateur.
PourquoiLe stagger progressif attire l'attention sur chaque étape individuellement, évitant la surcharge cognitive d'un bloc de 4–5 items apparu d'un coup.
RéglagesDélai 80 ms entre étapes pour un rythme plus lent et pédagogique, translateX(-24px) pour une entrée plus marquée, duration 450 ms.

Comment ça marche

L'effet repose entièrement sur le CSS. Chaque .stagger-menu-item démarre à opacity: 0 et transform: translateX(-20px). L'ajout de la classe .revealed sur le conteneur parent déclenche simultanément la transition vers opacity: 1 et translateX(0) pour tous les items en une seule opération DOM.

Le décalage temporel (stagger) est produit par des règles :nth-child : premier item à 0 s, deuxième à 50 ms, troisième à 100 ms, quatrième à 150 ms. Chaque item attend son délai avant de démarrer sa propre transition de 400 ms — la cascade visuelle est entièrement pilotée par le CSS, sans calendrier JavaScript.

La courbe cubic-bezier(.34, 1.56, .64, 1) est une courbe spring : elle dépasse légèrement la valeur cible (overshoot) avant de se stabiliser, produisant un rebond élastique caractéristique. Cet overshoot est plus expressif qu'un simple ease-out pour des éléments d'interface et renforce l'impression de réactivité.

Le JavaScript se limite à écouter mouseenter et mouseleave sur le parent pour basculer la classe .revealed, plus un setTimeout(500 ms) qui révèle automatiquement les items au chargement. Aucun requestAnimationFrame, aucune boucle d'animation.

Accessibilité

  • prefers-reduced-motion absent : le code ne gère pas prefers-reduced-motion — les animations se déclenchent quelle que soit la préférence OS. Correctif recommandé : envelopper la règle transition de .stagger-menu-item dans un @media (prefers-reduced-motion: no-preference).
  • Les items sont des <span> — non focusables au clavier par défaut. Pour une navigation réelle, remplacer par des <a> ou ajouter tabindex="0" + gestionnaire keydown (Entrée / Espace).
  • Le déclencheur est mouseenter uniquement — inaccessible sur écran tactile et au clavier. Le setTimeout(500 ms) qui révèle les items au chargement atténue le problème pour l'affichage, mais n'apporte pas d'interaction clavier.
  • Aucun rôle ARIA ni aria-label sur le conteneur. Pour une nav accessible : ajouter role="navigation" et un aria-label descriptif sur le .stagger-menu.
  • Contrastes couleurs : texte par défaut #a1a1aa sur #0a0a0f ≈ 8:1 — passe WCAG AA ✓ ; texte hover #6366f1 ≈ 4,5:1 — passe WCAG AA (limite) ✓.

Compatibilité navigateur

Repose uniquement sur CSS transitions et sélecteurs :nth-child — aucune dépendance externe, supporté dans tous les navigateurs modernes depuis 2015.

Chrome 49+✓ Complet
Firefox 44+✓ Complet
Safari 9+✓ Complet
Edge 16+✓ Complet
Mobile iOS✓ Complet
Android Chrome✓ Complet

Sans support CSS transitions (IE 9 et inférieur), les items restent visibles statiquement à leur position finale — aucune erreur JS, la navigation reste fonctionnelle.

Le code

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

index.html — structure
<div class="stagger-menu" id="staggerMenu">
  <span class="stagger-menu-item">Item 1</span>
  <span class="stagger-menu-item">Item 2</span>
  <span class="stagger-menu-item">Item 3</span>
  <span class="stagger-menu-item">Item 4</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
transition-delay (nth-child) 0 / 50 / 100 / 150 ms Délai par item dans les règles :nth-child — augmentez le pas (ex. 80 ms) pour un stagger plus lent, réduisez (30 ms) pour un effet plus vif. Ajoutez une règle supplémentaire pour chaque item au-delà de 4.
transition duration (.4s) 400 ms Durée de chaque transition individuelle dans .stagger-menu-item. Raccourcir à 250 ms pour un dropdown rapide, allonger à 600 ms pour un effet cinématique.
cubic-bezier(.34, 1.56, .64, 1) spring / rebond Courbe spring avec overshoot. Remplacez par cubic-bezier(0, 0, 0.2, 1) pour un ease-out sans rebond, ou (.68, -0.55, .27, 1.55) pour un overshoot plus prononcé.
translateX(-20px) -20px Distance et direction de l'entrée dans .stagger-menu-item. translateX(20px) inverse le sens (droite vers gauche), translateY(10px) donne une entrée verticale vers le bas.
--text-secondary (#a1a1aa) #a1a1aa Couleur des items au repos — modifiez la variable CSS :root pour adapter l'ensemble au thème sans toucher aux règles individuelles.
hover background (rgba(99,102,241,.1)) indigo 10 % Fond de survol dans .stagger-menu-item:hover — remplacez par rgba de votre couleur brand (ex. rgba(16,185,129,.1) pour un vert emerald).
hover color (#6366f1) #6366f1 (indigo) Couleur du texte au survol dans .stagger-menu-item:hover — vérifiez un ratio ≥ 4,5:1 sur le fond sombre après modification.
setTimeout delay (500 ms) 500 ms Délai avant la révélation automatique au chargement dans le JS. Réduisez à 200 ms pour une apparition quasi-immédiate, augmentez à 1000 ms pour un effet différé volontaire.

FAQ

Ajoutez autant de <span class="stagger-menu-item"> que nécessaire dans le HTML, puis ajoutez une règle CSS .stagger-menu.revealed .stagger-menu-item:nth-child(N) { transition-delay: Nx0.05s } pour chaque item supplémentaire — par exemple item 5 → 0.20s, item 6 → 0.25s.
document.getElementById('staggerMenu').classList.add('revealed') pour révéler, .classList.remove('revealed') pour masquer. Branchez-le sur n'importe quel événement : ouverture de modal, fin de chargement, transition de route, réponse API.
Oui — le retrait de .revealed joue la transition en sens inverse via les mêmes règles CSS : les items glissent vers la gauche et disparaissent, le dernier item en premier (les délays s'inversent naturellement). Aucun code supplémentaire requis.