Cartes✨ Premium

Animated Bento

Six cellules d'une grille CSS asymétrique 4×3 surgissent en cascade au chargement — stagger pur CSS, easing spring, rejouable à la demande.

CSSAnimationStagger

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

Tableau de bord SaaS — Métriques clés animées à la connexion — Animated Bento exemple 1

① Tableau de bord SaaS — Métriques clés animées à la connexion

QuandL'utilisateur ouvre son dashboard après connexion ou rafraîchit la page d'accueil de l'application.
PourquoiLe stagger retient l'attention sur chaque indicateur l'un après l'autre plutôt que de tout révéler en bloc — l'œil suit naturellement la cascade et perçoit chaque chiffre individuellement.
RéglagesDélais par défaut (0,1 s × 6 cellules), durée 0,6 s. Cellule cell-1 (2 colonnes) pour le KPI principal, les cinq autres pour les métriques secondaires.
Grille de services d'agence — Chaque offre révélée en cascade — Animated Bento exemple 2

② Grille de services d'agence — Chaque offre révélée en cascade

QuandLe visiteur arrive sur la section « Nos services » d'un site d'agence créative ou d'un portfolio freelance, au premier chargement ou à chaque entrée dans le viewport.
PourquoiL'apparition progressive valorise chaque service comme un élément à part entière et donne une impression de soin et de maîtrise — caractéristiques d'une agence premium.
RéglagesGradient thématique par cellule (indigo = design, cyan = dev, vert = SEO…), délai réduit à 0,08 s par cellule pour un rythme plus vif, durée 0,5 s.
Grille éditoriale — Articles qui se révèlent au chargement de la page — Animated Bento exemple 3

③ Grille éditoriale — Articles qui se révèlent au chargement de la page

QuandLa page d'accueil d'un média, d'un blog ou d'une newsletter affiche sa grille d'articles à la première visite ou après un changement de rubrique.
PourquoiLa cascade crée une sensation de « chargement progressif » qui rend l'interface perçue comme plus rapide — même quand les données sont déjà disponibles, l'entrée animée suggère une livraison en temps réel et maintient l'attention.
Réglagescell-1 (2 colonnes) pour l'article principal, cell-2 et cell-3 (2 lignes) pour les secondaires. Durée 0,5 s, délai 0,08 s pour un rythme journalistique.

Comment ça marche

La grille repose sur un template 4 colonnes × 3 lignes avec des grid-area explicites sur chaque cellule (spans 1×2, 2×1 ou 2×2 selon la cellule), ce qui garantit une disposition asymétrique précise indépendamment du contenu.

Chaque cellule part de opacity: 0; transform: translateY(30px) scale(0.9) et rejoint son état final via le keyframe bentoFadeIn en 600 ms avec l'easing cubic-bezier(.16, 1, .3, 1) — une courbe « spring » sous-amortic qui produit une légère surtension à l'arrivée. L'animation-fill-mode: forwards maintient la cellule invisible avant son délai, supprimant tout flash d'affichage non sollicité.

Le stagger est créé par de simples animation-delay croissants dans le CSS : 0,1 s pour .cell-1, 0,2 s pour .cell-2… jusqu'à 0,6 s pour .cell-6. Aucun JavaScript ne pilote l'entrée — le moteur CSS séquence les animations nativement.

La rejouabilité est assurée par replayAnimation() : la fonction retire le style animation inline sur chaque cellule, lit element.offsetHeight pour forcer un reflow (flush du moteur de style du navigateur), puis restitue le style vide — le navigateur relance alors la CSS animation depuis le début avec tous ses délais.

Accessibilité

  • ⚠️ prefers-reduced-motion absent : le code ne détecte pas la préférence système. Les cellules s'animent même si l'utilisateur a activé « réduire les animations » dans l'OS — à ajouter manuellement avec @media (prefers-reduced-motion: reduce) { .bento-cell { animation: none; opacity: 1; transform: none; } }.
  • Le contenu textuel des cellules (balises <span>) est accessible aux lecteurs d'écran indépendamment de l'animation CSS.
  • Le bouton « Rejouer » est un <button> natif, focusable au clavier et activable par Espace ou Entrée.
  • Les cellules colorées de l'effet de base ne superposent pas de texte sur les gradients — le contraste n'est pas un enjeu pour l'effet nu. À vérifier lors de l'intégration si du contenu textuel est ajouté.
  • Aucun attribut aria n'est présent sur la grille — à enrichir selon le contexte : role="list" si les cellules constituent une navigation, aria-label sur le conteneur si la grille est décorative.

Compatibilité navigateur

Nécessite CSS Grid et CSS Animations — supportés nativement dans tous les navigateurs modernes depuis 2017. Zéro dépendance externe.

Chrome 57+✓ Complet
Firefox 52+✓ Complet
Safari 10.1+✓ Complet
Edge 16+✓ Complet
Mobile iOS✓ Complet
Android Chrome✓ Complet

Sur IE 11 et antérieurs (sans support CSS Grid), les cellules s'affichent en bloc vertical sans mise en forme bento — aucune erreur JS, le contenu reste lisible. L'animation CSS est ignorée silencieusement.

Le code

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

index.html — structure
<div class="bento-container">
  <div class="bento-grid bento-animated" id="animatedBento">
    <div class="bento-cell cell-1"><span>Contenu</span></div>
    <div class="bento-cell cell-2"><span>Contenu</span></div>
    <div class="bento-cell cell-3"><span>Contenu</span></div>
    <div class="bento-cell cell-4"><span>Contenu</span></div>
    <div class="bento-cell cell-5"><span>Contenu</span></div>
    <div class="bento-cell cell-6"><span>Contenu</span></div>
  </div>
  <!-- Bouton optionnel de rejeu -->
  <button class="replay-btn" onclick="replayAnimation()">Rejouer</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
animation-delay (CSS par .cell-N) 0,1 s → 0,6 s (pas de 0,1 s) Intervalle du stagger. Réduisez à 0,05 s par cellule pour un effet rapide ou augmentez à 0,2 s pour un rythme cinématique.
animation: .6s … (CSS .bento-animated .bento-cell) 0.6s Durée de l'animation par cellule. De 0,3 s (dynamique) à 1 s (dramatique).
cubic-bezier(.16, 1, .3, 1) (CSS easing) spring sous-amorti Courbe d'accélération. Remplacez par ease-out pour une sortie fluide sans rebond, ou cubic-bezier(.34, 1.56, .64, 1) pour un rebond plus marqué.
translateY(30px) scale(.9) (CSS départ .bento-animated .bento-cell) 30 px / 90 % Décalage initial de chaque cellule avant l'animation. Augmentez la translation pour un effet « fondu depuis le bas » plus prononcé.
gap: 12px (CSS .bento-grid) 12px Espacement entre les cellules. De 4 px (compact) à 24 px (aéré).
background: linear-gradient(…) (CSS .cell-N) 6 dégradés colorés distincts Couleur de fond de chaque cellule. Remplacez par votre palette brand ou une couleur unie — le stagger reste visible quelle que soit la couleur.
--radius-lg (:root) 0.75rem Rayon des coins des cellules. 0 = rectangles nets, 1rem = coins bien arrondis.
replayAnimation() (JS, appel externe) Appeler depuis n'importe quel événement JS pour rejouer la cascade — après un rechargement de données, un changement de vue ou un tutoriel interactif.

FAQ

En CSS pur : chaque cellule reçoit un animation-delay croissant directement dans la feuille de style. JavaScript intervient uniquement pour le bouton « Rejouer » (qui force un reflow afin de redémarrer l'animation CSS), pas pour l'entrée initiale.
Appelez replayAnimation() depuis n'importe quel écouteur JS. La fonction cible #animatedBento, retire le style animation inline sur chaque cellule, lit element.offsetHeight pour forcer un reflow, puis restitue — le navigateur redémarre la CSS animation depuis le début avec tous ses délais.
Oui. Les règles grid-area: span N / span N sur chaque .cell-N définissent la disposition. Changez grid-template-columns et grid-template-rows sur .bento-animated et adaptez les spans en conséquence — la CSS animation s'applique automatiquement à toutes les cellules sans modification du JavaScript.