Navigation✨ Premium

Dropdown Animated

Menu déroulant à apparition en cascade : chaque item glisse de la gauche avec un délai CSS échelonné de 50 ms — basculement de classe unique, zéro dépendance.

CSSJSStagger

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

Entête SaaS — Menu de compte utilisateur — Dropdown Animated exemple 1

① Entête SaaS — Menu de compte utilisateur

QuandDans la barre de navigation d'une application web, quand l'utilisateur clique sur son avatar ou son prénom pour accéder à son profil, ses paramètres ou se déconnecter.
PourquoiLes items glissent en cascade depuis la gauche en 200 ms au total — retour immédiat et fluide sans alourdir le reste de l'interface, le menu se referme au premier clic extérieur.
Réglages4 items (Profil, Paramètres, Aide, Déconnexion), délais par défaut (0,05 s / 0,10 s / 0,15 s / 0,20 s), hover rgba(99,102,241,.2) remplacé par la couleur primaire brand.
Tableau de bord — Sélecteur de vue ou filtre rapide — Dropdown Animated exemple 2

② Tableau de bord — Sélecteur de vue ou filtre rapide

QuandDans une interface analytique ou de gestion, quand l'utilisateur change de mode d'affichage (Liste, Grille, Chronologie) ou applique un filtre rapide sur un widget ou une table.
PourquoiLe stagger de 50 ms attire l'œil sur les options sans animation intrusive — les items arrivent proprement, et la cascade signale visuellement qu'il y a plusieurs choix à scanner.
Réglages3 à 5 items, transition-delay à 0,05 s par palier, fond menu ajusté à la charte dark (background: rgba(18,18,30,.98)), min-width: 180px.
Site agence / portfolio — Méga-menu avec 8 rubriques en cascade — Dropdown Animated exemple 3

③ Site agence / portfolio — Méga-menu avec 8 rubriques en cascade

QuandSur un site d'agence ou de portfolio, quand l'utilisateur ouvre le menu de navigation principale pour parcourir toutes les rubriques disponibles (Design web, Branding, Motion, SEO, E-commerce, Apps, UX, Audit…) au clic.
PourquoiAvec 8 items sur une grande surface, le stagger de 50 ms met en scène la densité de l'offre : chaque rubrique arrive à son tour, guidant l'œil et rendant l'animation staggered pleinement perceptible — sans que le menu ne paraisse lent à s'ouvrir.
Réglages8 items, transition-delay de 0,05 s par palier (dernier item à 0,40 s), min-width: 240px, fond menu rgba(255,255,255,.98) avec texte sombre — montre que l'animation fonctionne indépendamment du thème.

Comment ça marche

L'ouverture repose sur un basculement de classe CSS : la fonction JS toggleDropdown() ajoute ou retire la classe active sur le conteneur .anim-dropdown-container. Aucune librairie d'animation n'est impliquée — tout le rendu est piloté par les transition du navigateur.

Le panneau .anim-dropdown-menu passe simultanément de opacity: 0 à 1, de visibility: hidden à visible et de transform: translateY(-10px) à translateY(0) en 0,3 s. L'utilisation de visibility (et non de display: none) préserve la continuité de la transition tout en bloquant les clics et le focus quand le menu est invisible.

L'effet de stagger est entièrement déclaratif en CSS : chaque .anim-dropdown-item part de opacity: 0; transform: translateX(-10px) et transite vers opacity: 1; translateX(0). Les règles :nth-child(1…4) lui assignent des transition-delay de 0,05 s / 0,10 s / 0,15 s / 0,20 s respectivement — le dernier item arrive 200 ms après le début de l'ouverture. Ajouter des items supplémentaires ne demande qu'une règle :nth-child(N) de plus.

La fermeture se déclenche de trois façons : re-clic sur le bouton déclencheur, clic en dehors du conteneur (écouteur document click qui vérifie contains(e.target)), ou pression de la touche Échap. L'icône chevron tourne de 180° via transform: rotate(180deg) sur .anim-dropdown-container.active .anim-dropdown-icon.

Accessibilité

  • prefers-reduced-motion non pris en charge : le code ne contient aucun test matchMedia('(prefers-reduced-motion: reduce)') — les transitions CSS restent actives quel que soit le paramètre OS. Ajoutez manuellement @media (prefers-reduced-motion: reduce) { .anim-dropdown-menu, .anim-dropdown-item { transition: none } } pour les utilisateurs sensibles.
  • Le bouton déclencheur est un <button> natif : l'activation au clavier (Entrée / Espace) fonctionne sans code supplémentaire. La touche Échap ferme le menu (gérée dans le JS via écouteur keydown).
  • aria-expanded et aria-haspopup absents du code fourni : à ajouter manuellement sur le <button> (aria-expanded="false" basculé en "true" à l'ouverture, aria-haspopup="menu") pour que les lecteurs d'écran annoncent l'état du menu.
  • Les items du menu sont des <div> non focusables : ils ne sont pas accessibles à la tabulation ni aux touches fléchées. Pour une navigation clavier complète, remplacez-les par des <button> ou des <a>.
  • Contraste : texte rgba(255,255,255,.7) sur fond rgba(30,30,45,.98) — le rapport dépasse 4,5:1 WCAG AA. Le hover en indigo (rgba(99,102,241,.2)) ne dégrade pas le texte blanc.

Compatibilité navigateur

Utilise uniquement les CSS Transitions et classList — disponibles dans tous les navigateurs modernes sans préfixe vendor. Zéro dépendance externe.

Chrome 90+✓ Complet
Firefox 90+✓ Complet
Safari 14+✓ Complet
Edge 90+✓ Complet
Mobile iOS 14+✓ Touch OK
Android Chrome✓ Complet

Sans JS, le bouton est visible mais le menu ne s'ouvre pas. Repli HTML pur possible en remplaçant le conteneur par un <code>&lt;details&gt;</code>/<code>&lt;summary&gt;</code> natif — aucune animation, mais fonctionnel sans script.

Le code

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

index.html — structure
<div class="anim-dropdown-container" id="dropdown">
  <button class="anim-dropdown-trigger" onclick="toggleDropdown()">
    Libellé
    <svg class="anim-dropdown-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
      <path d="M6 9l6 6 6-6"></path>
    </svg>
  </button>
  <div class="anim-dropdown-menu">
    <div class="anim-dropdown-item">
      <svg class="anim-dropdown-item-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">…</svg>
      Item 1
    </div>
    <!-- Pour chaque item supplémentaire, ajouter dans le CSS :
         .anim-dropdown-container.active .anim-dropdown-item:nth-child(N) { transition-delay: Xs } -->
  </div>
</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(N) 0,05 s par item Délai échelonné par item — règles CSS .active .anim-dropdown-item:nth-child(1…4). Augmentez à 0,08 s pour un stagger plus marqué, réduisez à 0,02 s pour une apparition quasi-simultanée.
transition: opacity .3s … (menu) 0,3 s Durée d'ouverture du panneau entier — 0,2 s pour un menu vif, 0,45 s pour un rendu plus souple.
transform: translateY(-10px) (menu) -10px Décalage vertical du panneau à l'état fermé. Passez à -20 px pour un effet de chute plus prononcé, ou remplacez par scaleY(0.92) pour un effet de dépliage.
transform: translateX(-10px) (items) -10px Décalage horizontal de chaque item avant apparition. Remplacez par translateY(8px) pour une apparition de bas en haut.
.anim-dropdown-item:hover background rgba(99,102,241,.2) Couleur de survol des items (indigo par défaut) — remplacez par la teinte primaire de votre interface.
min-width sur .anim-dropdown-menu 200px Largeur minimale du panneau — portez à 260 px pour des labels longs ou un menu à deux colonnes.
Items supplémentaires 4 items Pour chaque item ajouté, déclarez .anim-dropdown-container.active .anim-dropdown-item:nth-child(N) { transition-delay: Xs } avec Xs = 0,05 × N.

FAQ

Le code fourni utilise getElementById('dropdown') et une fonction globale toggleDropdown() — une seule instance par page. Pour plusieurs menus, modifiez la fonction en lui passant l'id : function toggleDropdown(id) { document.getElementById(id).classList.toggle('active'); }, puis appelez onclick="toggleDropdown('menu-1')" sur chaque bouton avec l'id correspondant.
Oui — le code est vanilla JS pur. Dans React, gérez isOpen via useState et conditionnez className. Dans Vue, utilisez :class="{ active: isOpen }" sur le conteneur. Dans Svelte, class:active={isOpen} suffit. Le CSS stagger ne change pas — seul le pilotage de la classe diffère.
Les transitions CSS s'inversent automatiquement à la suppression de active. Pour une fermeture différente (ex. fondu rapide sans glissement), ajoutez temporairement une classe closing via JS avant de retirer active et définissez .closing .anim-dropdown-menu { transition: opacity .15s; } — puis retirez closing après le délai via setTimeout.