Cartes✨ Premium

Card Expand to Full

Anime la carte depuis sa position dans le layout jusqu'au plein écran grâce à la technique FLIP — aucun calcul manuel de coordonnées CSS.

CSSJSFLIP

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

Grille tarifaire — Carte de pricing qui révèle ses fonctionnalités — Card Expand to Full exemple 1

① Grille tarifaire — Carte de pricing qui révèle ses fonctionnalités

QuandL'utilisateur clique sur une carte dans la grille de tarifs pour voir le détail des fonctionnalités sans quitter la page.
PourquoiLa transition FLIP depuis la position exacte de la carte crée une continuité spatiale — l'utilisateur perçoit que la fiche complète est ancrée à cet emplacement dans la grille, pas qu'elle surgit d'ailleurs.
RéglagesDurée 0,5 s, cubic-bezier(0.4, 0, 0.2, 1), gradient brand dans .expand-card, .card-detail avec liste de fonctionnalités + CTA, border-radius initial 12 px.
Galerie portfolio — Vignette qui s'ouvre en plein écran sans modale — Card Expand to Full exemple 2

② Galerie portfolio — Vignette qui s'ouvre en plein écran sans modale

QuandDans une galerie photo ou portfolio, l'utilisateur clique une vignette pour l'afficher en grand format en place, sans fenêtre modale.
PourquoiLe zoom par FLIP depuis la vignette préserve le repère spatial : le visiteur perçoit d'où vient l'image et où elle retourne à la fermeture — sans rupture du contexte de la galerie.
RéglagesDurée 0,4 s, .expand-card avec overflow: hidden, border-radius initial 6 px, contenu image en object-fit: cover.
Feed d'actualités — Article développable sans changement de page — Card Expand to Full exemple 3

③ Feed d'actualités — Article développable sans changement de page

QuandDans un feed de contenu (blog, newsletter web, agrégateur), l'utilisateur développe l'aperçu d'un article pour lire le teaser sans naviguer vers une autre URL.
PourquoiL'expansion depuis la position de la carte évite tout saut de layout — le contexte du feed reste perceptible autour de l'article ouvert, l'utilisateur ne perd pas sa place de lecture.
RéglagesDurée 0,6 s, fond neutre dans .expand-card, .card-detail avec teaser texte + lien « Lire la suite », border-radius initial 8 px.

Comment ça marche

L'animation repose sur la technique FLIP (First, Last, Invert, Play). Avant tout changement visuel, toggleCardExpand() capture le getBoundingClientRect() de la carte (First), applique ou retire la classe CSS .expanded — ce qui recalcule instantanément la mise en page — puis capture de nouveau le rect (Last).

La fonction calcule l'écart entre les deux états : décalage dx/dy en pixels et ratio scaleX/scaleY entre les dimensions. Elle applique immédiatement un transform: translate(…) scale(…) avec transition: none, ce qui repositionne visuellement la carte à son état initial sans animation (Invert).

Un requestAnimationFrame laisse le navigateur committer ce transform, puis la fonction réactive la transition all 0.6s cubic-bezier(0.4, 0, 0.2, 1) et efface le transform (Play). Le navigateur anime naturellement de l'état inversé jusqu'au zéro — la position CSS finale définie par .expanded — sans qu'aucune coordonnée n'ait été calculée manuellement.

En parallèle, la classe .expanded pilote deux animations CSS indépendantes : le .card-label monte de 20 px via transform: translateY(-20px), et le .card-detail passe de opacity: 0 à 1 avec un délai de 0,3 s — il n'apparaît qu'une fois la carte arrivée en position finale.

Accessibilité

  • prefers-reduced-motion absent : la transition de 0,6 s se déclenche même si l'OS signale une préférence pour réduire le mouvement. En production, ajouter @media (prefers-reduced-motion: reduce) { .expand-card { transition: none !important; } }.
  • Les boutons Réduire/Développer sont des <button> natifs — activables au clavier (Espace, Entrée) et exposés aux lecteurs d'écran.
  • Aucun attribut aria-expanded sur les boutons : l'état ouvert/fermé de la carte n'est pas signalé aux technologies d'assistance. Recommandé : synchroniser aria-expanded="true/false" dans le callback.
  • Contraste texte/fond : texte blanc sur dégradé indigo–fuchsia — ratio ≥ 4,5:1, conforme WCAG AA.
  • Aucun role ni aria-label sur .card-expand-wrapper — il est purement positionnel, ce qui est correct ; le contenu textuel reste accessible via les éléments enfants.

Compatibilité navigateur

Nécessite getBoundingClientRect(), requestAnimationFrame et les transitions CSS — disponibles dans tous les navigateurs modernes depuis 2016.

Chrome 60+✓ Complet
Firefox 55+✓ Complet
Safari 11+✓ Complet
Edge 79+✓ Complet
Mobile iOS✓ Complet
Android Chrome✓ Complet

Sans support des transitions CSS ou de requestAnimationFrame, la classe .expanded change directement les dimensions CSS — la carte se redimensionne instantanément, sans animation.

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="toggleCardExpand(false, this)">Réduire</button>
    <button class="morph-toggle" onclick="toggleCardExpand(true, this)">Développer</button>
  </div>
  <div class="card-expand-wrapper">
    <div class="expand-card" id="expandCard">
      <span class="card-label">Titre de la carte</span>
      <span class="card-detail">Contenu détaillé visible après expansion.</span>
    </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
.expand-card background linear-gradient(135deg, #6366f1, #d946ef) Couleur ou image de fond de la carte. Remplacez par votre palette brand ou une image avec background-size: cover.
.expand-card transition (CSS) + chaîne JS "all 0.6s…" 0.6s cubic-bezier(0.4, 0, 0.2, 1) Durée et easing. À modifier en deux endroits : propriété transition sur .expand-card en CSS, et la chaîne "all 0.6s…" dans le JS — ils doivent rester synchronisés.
.expand-card width / height (état compact) 80px / 60px Dimensions de la carte compacte avant expansion. Mettez-les à l'échelle de votre vignette dans le layout existant.
.expand-card top / left (état compact) 50px / calc(50% − 40px) Position initiale dans le conteneur .card-expand-wrapper. Ajustez pour coller à la position de l'élément source dans votre grille.
.expand-card border-radius 10px compact → 8px expanded Rayon des coins compact (.expand-card) et étendu (.expand-card.expanded). Modifiez-les en cohérence pour conserver un arrondi cohérent.
.expand-card .card-detail transition-delay 0.3s (dans opacity .4s .3s) Délai avant l'apparition du contenu détaillé. Réduire à 0s pour un affichage immédiat ; augmenter si la durée FLIP est plus longue.
--primary #6366f1 Variable CSS de couleur primaire utilisée pour les boutons toggle et leur focus ring. Définissez-la au niveau :root ou sur le conteneur de l'effet.

FAQ

En l'état, toggleCardExpand() cible l'id expandCard codé en dur. Pour plusieurs instances, extrayez la logique en passant l'élément directement : function flipCard(el, expand, btn) { var a = el.getBoundingClientRect(); … } et câblez chaque bouton avec sa propre référence d'élément.
getBoundingClientRect() retourne les coordonnées relatives au viewport — le scroll est déjà pris en compte, le calcul reste correct. Attention : si un ancêtre direct de .expand-card possède un transform CSS, il crée un nouveau référentiel de positionnement et décale les calculs d'offset.
Ajoutez une classe sur le <body> ou le conteneur au même moment : document.body.classList.toggle('card-open', expand). Pilotez un overlay, un backdrop-filter ou un background-color via cette classe — le timing s'aligne naturellement avec la transition FLIP.