Cartes✨ Premium

Sidebar to Overlay

Sidebar fixe qui se dilate en overlay plein écran avec transition cubic-bezier, backdrop blur et reflow automatique du contenu — une seule classe CSS déclenche tout.

CSSJSLayout

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. Cartes comprend 41 effets, dont 6 gratuits. Découvrir la catégorie →

3 exemples d'usage

🎈

① Navigation d'app — Sidebar icônes qui révèle le menu complet

QuandSur desktop compact ou tablette, l'utilisateur ouvre le menu principal pour accéder à une section moins fréquente — la sidebar de 70 px est trop étroite pour afficher les libellés.
PourquoiLa sidebar économise l'espace en permanence ; l'overlay révèle les labels complets et une grille plus aérée sans naviguer vers une autre page ni ouvrir un drawer externe.
RéglagesTransition 0,6 s, backdrop blur(4px), icônes 28 → 50 px, libellés visibles uniquement en mode overlay. Fond dégradé indigo → violet pour la cohérence brand.
🎊

② Filtres e-commerce — Panneau de critères qui s'étend en overlay

QuandL'utilisateur clique « Filtres » depuis une liste de produits sur tablette — la sidebar est trop étroite pour les sliders de prix et les grilles de couleurs.
PourquoiL'overlay offre suffisamment de place pour des contrôles détaillés (plages de prix, couleurs, tailles, marques) sans quitter la page ni ouvrir une modale séparée.
RéglagesFond teinté de la couleur brand, backdrop blur(4px), icônes remplacés par des pictogrammes de catégorie de filtre. Même transition 0,6 s.

③ Éditeur créatif — Barre d'outils qui s'ouvre en palette plein écran

QuandDans un outil de design ou éditeur, l'utilisateur active la palette complète pour choisir un outil ou un brush parmi une collection étendue.
PourquoiLa sidebar compacte expose les outils récents ; l'overlay affiche toute la bibliothèque en grille avec labels visibles, sans perdre le contexte du canevas visible derrière grâce au backdrop blur.
Réglagesblur(4px) sur le canevas derrière, gap 12 px entre items, icônes 50 × 50 px pour la précision au toucher. Délai label 0,2 s pour un dévoilement progressif.

Comment ça marche

L'effet repose sur un basculement de position CSS relative → absolute piloté par la classe .overlay-mode. En mode normal, .sidebar-panel a width: 70px; position: relative; flex-shrink: 0 et occupe sa place dans le conteneur display: flex. Dès que .overlay-mode est ajouté, la propriété bascule en position: absolute; inset: 0; width: 100%; height: 100% — le panneau est arraché du flux et couvre toute la surface. .sidebar-main, régi par flex: 1 1 0%, récupère instantanément toute la largeur libérée et s'efface via transition: opacity .3s.

La transition .6s cubic-bezier(.4, 0, .2, 1) (Material Design easeInOut) s'applique aux propriétés interpolables uniquement : background, padding, et les dimensions des icônes (28 → 50 px, border-radius 6 → 10 px). En revanche, position et inset ne s'animent pas — ils sautent immédiatement à l'état cible, tandis que les couleurs et tailles glissent, créant l'impression d'une expansion organique.

.overlay-mode ajoute backdrop-filter: blur(4px) sur un fond rgba(99,102,241,0.15) semi-transparent. Le flou vitrifie le contenu derrière sans le masquer. Attention : backdrop-filter crée un stacking context qui isole les z-index des enfants de l'overlay du reste de la page.

Les étiquettes (.sidebar-label) utilisent transition: .4s .2s — durée 0,4 s avec un délai de 0,2 s. Elles attendent que l'expansion du panneau soit amorcée avant d'apparaître (font-size: 0; opacity: 0font-size: .55rem; opacity: 1), évitant le chevauchement visuel pendant le redimensionnement.

Accessibilité

  • Pas de prefers-reduced-motion dans le code : la transition de 0,6 s joue même si l'OS demande à réduire le mouvement. À ajouter : @media (prefers-reduced-motion: reduce) { .sidebar-panel, .sidebar-panel .sidebar-icon, .sidebar-panel .sidebar-label { transition: none } }.
  • Les boutons de bascule sont des <button> natifs, focusables au clavier — mais aucun aria-expanded n'est mis à jour : l'état ouvert/fermé n'est pas annoncé aux lecteurs d'écran.
  • Le panneau et son wrapper ne portent ni role ni aria-label : les lecteurs d'écran traversent les <div class="sidebar-icon"> sans sémantique de navigation.
  • Contraste des étiquettes (color: #a5b4fc sur fond rgba(99,102,241,0.2)) : ratio estimé ~3,2:1 — en dessous de WCAG AA (4,5:1) pour texte normal de moins de 18 pt. Acceptable si les labels sont traités comme décoratifs.
  • Navigation clavier : les deux boutons sont dans le flux de tabulation, activables sans JS supplémentaire.

Compatibilité navigateur

Requiert CSS Transitions et backdrop-filter. Les transitions sont universelles ; backdrop-filter est disponible dans tous les navigateurs modernes depuis 2022.

Chrome 76+✓ Complet
Firefox 103+✓ Complet
Safari 15.4+✓ Complet
Edge 79+✓ Complet
Mobile iOS 15.4+✓ Complet
Android Chrome✓ Complet

Sans backdrop-filter (Firefox < 103), l'overlay s'affiche avec le fond semi-transparent sans flou — l'effet reste fonctionnel. Sans transitions CSS, la permutation est instantanée mais l'état final est identique.

Le code

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

index.html — structure
<div class="demo-preview">
  <div class="morph-toggle-group">
    <button class="morph-toggle active" onclick="setSidebarMode(this,'sidebar')">Sidebar</button>
    <button class="morph-toggle" onclick="setSidebarMode(this,'overlay')">Overlay</button>
  </div>
  <div class="sidebar-demo-wrapper">
    <div class="sidebar-panel" id="sidebarPanel">
      <div>
        <div class="sidebar-icon"></div>
        <span class="sidebar-label">Accueil</span>
      </div>
      <!-- Répétez pour chaque item -->
    </div>
    <div class="sidebar-main">
      <div class="main-line"></div>
      <!-- Contenu principal -->
    </div>
  </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
.sidebar-panel { width } 70px Largeur de la sidebar en mode compact. Augmentez pour afficher des icônes plus grandes ou un libellé court toujours visible.
.sidebar-panel { transition } .6s cubic-bezier(.4,0,.2,1) Durée et courbe de la transition d'expansion. Remplacez par .3s ease pour une permutation plus vive, ou .9s pour un morphing plus lent.
.sidebar-panel.overlay-mode { backdrop-filter } blur(4px) Intensité du flou de verre sur le contenu derrière l'overlay. Passez à blur(0) pour un fond opaque, ou blur(12px) pour un verre épais.
.sidebar-panel.overlay-mode { background } rgba(99,102,241,0.15) Couleur de fond en mode overlay — ajustez la teinte et l'opacité à votre palette brand.
.sidebar-panel .sidebar-icon { width, height } 28px Taille des icônes en mode sidebar compact. La valeur overlay (50 px) est dans .overlay-mode .sidebar-icon — modifiez les deux en cohérence.
.sidebar-panel .sidebar-label (overlay) font-size: .55rem Taille des labels en mode overlay (0 en sidebar). Passez à .7rem pour une meilleure lisibilité sur grand écran.
.sidebar-main { transition } opacity .3s Durée du fondu du contenu principal lors de l'ouverture de l'overlay. Mettez none pour une disparition instantanée.

FAQ

Pas nativement : setSidebarMode est codé en dur sur getElementById('sidebarPanel'). Pour plusieurs instances, ajoutez un paramètre panelId à la fonction et passez-le depuis onclick : onclick="setSidebarMode(this,'overlay','sidebarPanel2')" — la modification tient en trois lignes.
backdrop-filter: blur() est disponible dans Chrome 76+, Safari 9+, Edge 79+ et Firefox 103+. Sur Firefox antérieur à 103, l'overlay s'affiche avec le fond semi-transparent sans flou — toutes les transitions et le reflow fonctionnent normalement. Testez avec le flou désactivé pour vérifier la lisibilité du contenu derrière.
Manipulez directement la classe : document.getElementById('sidebarPanel').classList.add('overlay-mode') pour ouvrir, .classList.remove('overlay-mode') pour fermer. Synchronisez ensuite l'état actif des boutons via querySelectorAll('.morph-toggle') si l'UI doit le refléter.