Navigation✨ Premium

Modal Slide

Panneau modal qui glisse depuis le bas de l'écran en 0,4 s — overlay semi-transparent à backdrop-filter: blur, transition cubic-bezier, zéro dépendance.

CSSJSOverlay

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

Fiche produit mobile — Sélecteur de taille — Modal Slide exemple 1

① Fiche produit mobile — Sélecteur de taille

QuandSur une page produit mobile-first, quand l'utilisateur clique sur « Choisir la taille » avant d'ajouter l'article au panier.
PourquoiLe panneau glissant depuis le bas reproduit le pattern natif iOS/Android (bottom sheet), réduisant la friction cognitive sur mobile sans quitter la page produit.
RéglagesPanneau à 50–55 % de la hauteur fenêtre, grille display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px pour les tailles, bouton « Ajouter au panier » full-width en bas du panneau.
Fil de contenu — Menu d'actions contextuel — Modal Slide exemple 2

② Fil de contenu — Menu d'actions contextuel

QuandSur un fil d'actualité ou une liste de contenu, quand l'utilisateur tape le bouton « ··· » d'un élément pour accéder à ses actions (partager, enregistrer, signaler).
PourquoiLe menu bas contextuel perturbe moins qu'une modal centrée : il reste proche du contenu qui a déclenché l'action et laisse le contexte visible derrière l'overlay semi-transparent.
RéglagesHauteur auto (4–6 actions en liste verticale), animation 0,35 s, overlay rgba(0,0,0,0.5) pour laisser transparaître le contexte.
Application cartographique mobile — Fiche de lieu — Modal Slide exemple 3

③ Application cartographique mobile — Fiche de lieu

QuandDans une application cartographique mobile, quand l'utilisateur tape sur un marqueur (café, musée, restaurant) pour consulter les détails du lieu sans quitter la carte.
PourquoiLe bottom-sheet remontant depuis le bas est le pattern canonique des apps cartographiques (Google Maps, Apple Plans) : il révèle photos, horaires et boutons d'action tout en laissant la carte visible derrière l'overlay, préservant le contexte géographique.
RéglagesPanneau à 55–65 % de la hauteur fenêtre, vignette photo + nom + étoiles, badge « Ouvert », deux boutons côte à côte (Itinéraire / Appeler), transition 0,4 s cubic-bezier(0.4, 0, 0.2, 1), overlay rgba(0,0,0,0.55).

Comment ça marche

Le déclencheur est un <button class="modal-trigger"> qui appelle openModal() via onclick. La fonction ajoute la classe .active sur deux éléments statiques du DOM : #modalOverlay (l'overlay plein écran) et #modal (le panneau glissant), puis bloque le défilement de la page avec document.body.style.overflow = 'hidden'.

#modalOverlay est un <div> en position: fixed couvrant tout le viewport. Par défaut il est invisible (opacity: 0; visibility: hidden). La classe .active le rend visible via une transition CSS de 0,3 s en ease. backdrop-filter: blur(4px) applique un flou gaussien sur tout le contenu derrière l'overlay, sans modifier les éléments sous-jacents — c'est un filtre GPU sur la couche compositing.

#modal est positionné en bas de l'écran (position: fixed; bottom: 0), centré avec left: 50%; transform: translateX(-50%). Un second translateY(100%) le cache sous le bord inférieur du viewport au repos. La classe .active le fait passer à translateY(0) — le panneau remonte sur 0,4 s avec la courbe cubic-bezier(0.4, 0, 0.2, 1), rapide au départ et lente en fin, imitant la physique d'un tiroir mécanique.

La poignée .modal-handle (40 × 4 px, semi-transparente) est purement décorative — aucun comportement de swipe natif n'est inclus. La fonction closeModal() n'est pas définie dans le code fourni : c'est au développeur de l'implémenter (retirer .active sur les deux éléments, restituer body.overflow = '').

Accessibilité

  • prefers-reduced-motion : absent du code — la transition de glissement se déclenche quelle que soit la préférence OS. À ajouter manuellement : @media (prefers-reduced-motion: reduce) { .modal, .modal-overlay { transition: none; } }.
  • Le panneau #modal n'a ni role="dialog", ni aria-modal="true", ni aria-labelledby — les lecteurs d'écran n'annoncent pas l'ouverture d'une boîte de dialogue.
  • Aucune gestion du focus : le focus clavier n'est ni déplacé dans le modal à l'ouverture, ni renvoyé au bouton déclencheur à la fermeture. À implémenter avec panel.querySelector('[autofocus], button, input').focus() dans openModal().
  • Pas de listener sur la touche Escape pour fermer le modal — navigation clavier seule incomplète.
  • Le bouton déclencheur est un <button> natif : focusable et activable au clavier par défaut, sans modification nécessaire.

Compatibilité navigateur

Nécessite position: fixed, backdrop-filter, transform, CSS transitions et l'API classList — disponibles dans tous les navigateurs modernes.

Chrome 88+✓ Complet
Firefox 103+✓ Complet
Safari 15+✓ Complet
Edge 88+✓ Complet
Mobile iOS✓ Touch OK
Android Chrome✓ Complet

Sans support <code>backdrop-filter</code> (Firefox &lt; 103) : l'overlay s'affiche en fond uni <code>rgba(0,0,0,0.7)</code> sans flou — l'animation de glissement du panneau reste intacte.

Le code

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

index.html — structure
<button class="modal-trigger" onclick="openModal()">
  Ouvrir Modal
</button>

<!-- Overlay flouté (plein écran, fixe) -->
<div class="modal-overlay" id="modalOverlay"></div>

<!-- Panneau modal (glisse depuis le bas) -->
<div class="modal" id="modal">
  <div class="modal-handle"></div>
  <h3 class="modal-title">Titre du modal</h3>
  <p class="modal-content">Contenu personnalisable.</p>
  <button class="modal-close" onclick="closeModal()">Fermer</button>
</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 du .modal 0.4s cubic-bezier(0.4, 0, 0.2, 1) Durée et courbe de glissement. Exemples : 0,25 s pour une réponse vive ; cubic-bezier(0.34, 1.56, 0.64, 1) pour un ressort avec overshoot.
backdrop-filter du .modal-overlay blur(4px) Intensité du flou gaussien sur le fond. 8–12 px pour un effet prononcé ; supprimer la propriété pour un overlay plat sans flou.
background du .modal-overlay rgba(0, 0, 0, 0.7) Couleur et opacité de l'overlay. Réduire à 0,4–0,5 pour un voile léger ; monter à 0,85 pour isoler le panneau du contexte.
border-radius du .modal 20px 20px 0 0 Arrondi des coins supérieurs du panneau. 28 px pour un look iOS prononcé ; 0 pour un panneau pleine largeur sans arrondis.
max-width du .modal 500px Largeur maximale du panneau. 100 % pour pleine largeur desktop ; 640 px pour un formulaire plus spacieux.
background du .modal linear-gradient(180deg, #1a1a2e 0%, #16162a 100%) Fond du panneau. Remplacer par une couleur brand plate ou un dégradé avec votre palette.
closeModal() non fourni Fermeture à implémenter par le développeur : retirer .active sur #modalOverlay et #modal, puis document.body.style.overflow = ''.

FAQ

Le code fourni ne définit que openModal(). Implémentation minimale : function closeModal() { document.getElementById('modalOverlay').classList.remove('active'); document.getElementById('modal').classList.remove('active'); document.body.style.overflow = ''; }. Pour fermer aussi en cliquant sur l'overlay, ajouter : document.getElementById('modalOverlay').addEventListener('click', closeModal).
L'implémentation de base cible des IDs fixes. Pour plusieurs instances, paramétrer les fonctions : function openModal(ovId, panId) { var ov = document.getElementById(ovId || 'modalOverlay'); var p = document.getElementById(panId || 'modal'); if (ov && p) { ov.classList.add('active'); p.classList.add('active'); } }. Chaque paire overlay/panneau reçoit ses propres IDs.
Oui — la transition s'appuie sur transform: translateY(), une propriété accélérée par GPU sur tous les navigateurs mobiles modernes. Le swipe-to-close n'est pas inclus ; il s'ajoute avec un listener touchstart/touchmove/touchend sur le panneau, en déclenchant closeModal() si le delta Y dépasse ~80 px vers le bas.