Cartes✨ Premium

Interactive Bento

Cliquez une cellule pour l'agrandir en 2×2 dans la grille — CSS Grid natif, transition back-ease en 500 ms, une seule cellule active à la fois.

JSClickExpand

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

Dashboard produit — Tuiles KPI expandables — Interactive Bento exemple 1

① Dashboard produit — Tuiles KPI expandables

QuandL'utilisateur explore ses indicateurs de performance (revenus, utilisateurs actifs, taux de conversion) depuis un tableau de bord sans quitter la page.
PourquoiL'expansion 2×2 donne à la tuile l'espace pour afficher un mini-graphique ou des détails, en remplacement d'une navigation ou d'une modale supplémentaire.
RéglagesGap 8 px pour la densité, transition réduite à 0,3 s pour une UI réactive, couleurs brand (#6366f1/#8b5cf6 → vos couleurs).
Landing SaaS — Grille de fonctionnalités interactive — Interactive Bento exemple 2

② Landing SaaS — Grille de fonctionnalités interactive

QuandLa section Fonctionnalités d'un produit : les blocs résument les capacités ; un clic agrandit pour révéler la description complète ou un screenshot.
PourquoiLa grille interactive invite à l'exploration là où des listes à puces sont passives — chaque clic renforce l'engagement et allonge le temps passé sur la page.
Réglages`--radius-lg: 1rem` pour un look cartes premium, couleur accent distincte par catégorie (design / dev / ops), gap 16 px pour la respiration.
Portfolio créatif — Galerie de projets cliquables — Interactive Bento exemple 3

③ Portfolio créatif — Galerie de projets cliquables

QuandUn designer ou une agence présente ses réalisations : chaque cellule est un aperçu miniature, l'expansion révèle titre, discipline et lien.
PourquoiLe bento remplace un slider ou un masonry complexe — CSS Grid pur, sans librairie de lightbox, chaque projet bénéficie d'un plan focal au clic.
RéglagesFond de cellule = `background-image` (miniature CSS), cellule agrandie = overlay semi-transparent + métadonnées, gap 8 px, grille `repeat(3, 1fr)` pour des projets larges.

Comment ça marche

L'expansion repose sur une seule règle CSS : quand la classe expanded est ajoutée à une cellule, grid-area: span 2/span 2 !important lui fait occuper deux colonnes et deux lignes. CSS Grid redistribue les cellules restantes en flux automatique — aucun calcul de position en JS, aucun positionnement absolu.

La transition .5s cubic-bezier(.175, .885, .32, 1.275) produit un léger rebond back-ease-out à l'arrivée : la cellule dépasse brièvement sa taille cible avant de se stabiliser. L'ombre portée colorée et le dégradé indigo-violet (linear-gradient(135deg, #6366f1 0, #8b5cf6 100%)) s'animent dans la même passe.

La fonction expandCell(e) gère le toggle : si la cellule cliquée porte déjà expanded, elle la retire (réduction) ; sinon elle balaye toutes les cellules du même parent via e.parentElement.querySelectorAll('.bento-cell') pour supprimer expanded partout, puis l'ajoute à la cellule cliquée. Une seule cellule agrandie à la fois, sans état global — plusieurs grilles coexistent sur la même page sans conflit.

Accessibilité

  • prefers-reduced-motion absent : l'effet ne détecte pas cette préférence système — les transitions de 500 ms jouent même si l'OS demande moins de mouvement. Ajoutez @media (prefers-reduced-motion: reduce) { .bento-interactive .bento-cell { transition: none } } si votre usage le requiert.
  • Les cellules utilisent onclick sur des <div>, pas des <button>non accessibles au clavier sans tabindex ni gestionnaire keydown. Remplacez les div par des <button type="button"> pour un comportement natif (tab + Entrée/Espace).
  • Aucun attribut aria-expanded ni role n'est déclaré sur les cellules — un lecteur d'écran ne signale pas l'état agrandi/réduit.
  • Contraste du texte secondaire (#a1a1aa à 70 % d'opacité) sur fond #1a1a24 est inférieur au seuil WCAG AA 4,5:1 pour les petits textes ; la cellule agrandie (blanc sur indigo) passe le test AA.
  • L'icône SVG dans chaque cellule manque d'aria-hidden="true" — les lecteurs d'écran peuvent l'annoncer comme texte vide. Ajoutez l'attribut pour la masquer.

Compatibilité navigateur

Nécessite CSS Grid avec `grid-area: span N/span N` et les transitions CSS — supporté dans tous les navigateurs modernes depuis 2018.

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

Sans JS, les cellules s'affichent normalement dans la grille sans expansion — la page reste lisible. Sans CSS Grid (IE 11), la grille n'est pas rendue ; utilisez un layout flexbox ou tableau en fallback.

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-interactive" id="interactiveBento">

    <div class="bento-cell" onclick="expandCell(this)">
      <div class="cell-content">
        <div class="expand-icon">
          <svg width="16" height="16" viewBox="0 0 24 24" fill="none"
               stroke="currentColor" stroke-width="2" aria-hidden="true">
            <path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"></path>
          </svg>
        </div>
        <span>Label</span>
      </div>
    </div>

    <!-- × 6 cellules au total (grille 4 colonnes × 3 lignes) -->

  </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
--bg-elevated #1a1a24 Couleur de fond des cellules interactives au repos. Remplacez par votre couleur de surface.
--bg-card #12121a Couleur de fond du conteneur général. À aligner sur votre fond de page.
--border rgba(255,255,255,0.08) Bordure des cellules. Montez l'opacité (0.15–0.25) pour un grid plus marqué sur fond clair.
--radius-lg 0.75rem Rayon des coins de chaque cellule. 0 pour des tuiles carrées, 1rem pour un look cartes arrondies.
gradient .bento-cell.expanded linear-gradient(135deg, #6366f1 0, #8b5cf6 100%) Dégradé de la cellule agrandie. Remplacez les deux hex par vos couleurs brand, ou supprimez le dégradé pour un fond uni.
gap .bento-grid 12px Espacement entre les cellules. 8 px pour la densité d'information, 16 px pour un rendu aéré type cartes premium.
grid-template-columns .bento-interactive repeat(4, 1fr) Nombre de colonnes. Passez à repeat(3, 1fr) pour des cellules plus grandes ou un contenu plus riche par tuile.
transition .bento-interactive .bento-cell .5s cubic-bezier(.175, .885, .32, 1.275) Durée et courbe de l'expansion. Réduisez à .25s ease-out pour une UI de gestion, augmentez à .8s pour un rendu plus cinématique.

FAQ

expandCell scopes sa sélection à e.parentElement.querySelectorAll('.bento-cell') — chaque grille gère ses propres cellules sans état global. Deux div.bento-grid.bento-interactive côte à côte fonctionnent sans conflit.
Remplacez chaque <div class="bento-cell" onclick="expandCell(this)"> par un <button type="button" class="bento-cell" onclick="expandCell(this)"> : les boutons sont nativement focusables et activables avec Entrée/Espace. Ajoutez aria-expanded dynamiquement dans expandCell pour informer les lecteurs d'écran.
Ajoutez dans chaque cellule un bloc masqué (display:none ou opacity:0; height:0) et dévoilez-le via CSS : .bento-cell.expanded .extra { display:block } — aucune modification du JS. Le contenu s'affiche automatiquement à l'expansion et se masque à la réduction.