Cartes✨ Premium

Responsive Bento

Grille CSS auto-fit/dense : les cellules à empans multiples se réorganisent élégamment quand le conteneur rétrécit — zéro JavaScript.

CSSResponsiveAuto-fit

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 analytique — Vue KPI multi-formats — Responsive Bento exemple 1

① Dashboard analytique — Vue KPI multi-formats

QuandUn tableau de bord admin ou SaaS doit afficher des métriques de tailles variées — grande tuile graphique, métriques larges et indicateurs compacts — sur n'importe quelle résolution d'écran.
Pourquoiauto-fit/dense garantit qu'aucune tuile ne reste orpheline dans une ligne vide : le layout reste structuré de 1 200 px à 320 px sans une seule media query explicite.
Réglagesminmax(80px, 1fr) pour les colonnes, grid-auto-rows: 60px, gap: 12px. Tuile principale en cell-large avec un grand chiffre clé ; métriques secondaires en cell-small. Désactivez resize: horizontal en production.
Galerie de projets — Portfolio créatif asynchrone — Responsive Bento exemple 2

② Galerie de projets — Portfolio créatif asynchrone

QuandUn portfolio ou une galerie e-commerce où certains projets méritent une tuile en vedette (large) et d'autres une tuile standard, sans définir de media queries par projet.
PourquoiL'algorithme dense recalcule l'ordre optimal à chaque saut de colonne : le projet vedette reste dominant à toutes les largeurs, et les tuiles secondaires comblent les cases libres automatiquement.
Réglagesminmax(120px, 1fr) pour des tuiles un peu plus grandes, grid-auto-rows: 80px, background-size: cover sur chaque cell. Couleurs de gradient distinctes par catégorie.
Landing page — Grille de fonctionnalités produit — Responsive Bento exemple 3

③ Landing page — Grille de fonctionnalités produit

QuandUne section Features sur une landing page SaaS présente 8 fonctionnalités avec une feature hero large, deux features secondaires wide/tall et quatre features simples.
PourquoiÀ pleine largeur (5-6 colonnes), la hiérarchie visuelle est immédiate ; sur mobile à 2 colonnes, l'algorithme dense remonte les petites tuiles sous la grande sans laisser de vide visible.
Réglagesminmax(100px, 1fr), grid-auto-rows: 70px. Gradient différent par famille de feature. Icône + label courts dans chaque cell-small.

Comment ça marche

La propriété centrale est grid-template-columns: repeat(auto-fit, minmax(80px, 1fr)) sur .bento-responsive. Le moteur CSS calcule lui-même combien de colonnes de 80 px tiennent dans la largeur disponible : quand la place d'une colonne disparaît, toutes les colonnes s'élargissent d'un coup et chaque cellule recalcule sa position — sans JavaScript, sans media query.

grid-auto-flow: dense active l'algorithme de remplissage dense : quand une cellule multi-empan (2×2, 2×1 ou 1×2) laisse un trou, le navigateur y glisse la première cellule plus petite qui suit dans le DOM. Le layout reste compact à toutes les largeurs.

Trois classes de span déclarent la taille de chaque tuile : .cell-large avec grid-area: span 2 / span 2, .cell-wide avec grid-column: span 2 et .cell-tall avec grid-row: span 2. La transition: .5s cubic-bezier(.16, 1, .3, 1) rend visible le saut de position au moment du changement de nombre de colonnes.

Le conteneur porte resize: horizontal et overflow: auto pour la démo : l'utilisateur tire la poignée bas-droite et observe la réorganisation en temps réel. En production, supprimez ces deux propriétés — la grille s'adapte seule à la largeur de son parent.

Accessibilité

  • Pas de prefers-reduced-motion : le code ne contient aucun bloc @media (prefers-reduced-motion: reduce). La transition CSS se déclenche systématiquement lors du reflow. À neutraliser en production avec @media (prefers-reduced-motion: reduce) { .bento-responsive .bento-cell { transition: none } }.
  • Contraste texte : var(--text-secondary) (#a1a1aa) sur var(--bg-card) (#12121a) → ratio ≈ 7,5:1, conforme WCAG AA (seuil 4,5:1 pour le texte courant).
  • Aucun élément interactif dans la grille de base — pas de focus-trap, pas de problème de navigation au clavier pour ce composant statique.
  • La poignée resize: horizontal n'est accessible qu'à la souris, pas au clavier. En production, laissez le conteneur suivre son parent et testez avec les DevTools ou en redimensionnant la fenêtre.
  • Aucun role ni aria-label sur la grille. Pour un contenu sémantique, ajoutez role="list" sur .bento-grid et role="listitem" sur chaque .bento-cell.

Compatibilité navigateur

Nécessite CSS Grid avec auto-fit et minmax — disponible dans tous les navigateurs modernes depuis 2017.

Chrome 57+✓ Complet
Firefox 52+✓ Complet
Safari 10.1+✓ Complet (sans poignée resize)
Edge 16+✓ Complet
Mobile iOS✓ Complet (sans poignée)
Android Chrome✓ Complet (sans poignée)

Sans support CSS Grid, les cellules s'affichent en flux bloc normal — aucune erreur JS, la page reste lisible. La poignée resize: horizontal est ignorée par Safari et tous les appareils mobiles ; la grille s'adapte quand même par sa largeur naturelle.

Le code

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

index.html — structure
<div class="bento-responsive-container">
  <div class="bento-grid bento-responsive">
    <div class="bento-cell cell-large">…</div>
    <div class="bento-cell cell-wide">…</div>
    <div class="bento-cell cell-tall">…</div>
    <div class="bento-cell cell-small">…</div>
    <div class="bento-cell cell-small">…</div>
    <div class="bento-cell cell-wide">…</div>
    <div class="bento-cell cell-small">…</div>
    <div class="bento-cell cell-small">…</div>
  </div>
  <span class="resize-hint">Redimensionner</span>
</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
minmax(80px, 1fr) 80px Largeur minimale d'une colonne avant que auto-fit recalcule. Augmentez (ex. 120px) pour des tuiles plus larges et moins de colonnes ; réduisez pour un effet mosaïque plus dense. À modifier dans la règle .bento-responsive.
grid-auto-rows: 60px 60px Hauteur de chaque unité de rangée. Augmentez pour des tuiles plus hautes — les classes cell-large (2 rangs) et cell-tall (2 rangs) s'adaptent proportionnellement.
gap: 12px 12px Espacement entre les tuiles. Réduisez à 8px pour un rendu plus compact, augmentez à 20px pour un layout aéré premium.
transition: .5s cubic-bezier(.16, 1, .3, 1) .5s Durée et easing du déplacement lors du reflow. Raccourcissez à .2s pour un snap sec, supprimez la ligne pour un repositionnement instantané.
--bg-card #12121a Fond des tuiles neutres (cell-small sans gradient). Remplacez par votre couleur brand ou une teinte de fond page légèrement élevée.
--border rgba(255,255,255,0.08) Liseré des tuiles. Augmentez l'opacité (0.15–0.2) pour plus de définition, passez à une couleur unie pour un accent design.
grid-area: span 2 / span 2 cell-large Modifiez les spans dans .cell-large, .cell-wide et .cell-tall pour créer des formats custom (ex. span 3 / span 1 pour une tuile très haute sur 3 rangs).

FAQ

Non — resize: horizontal et overflow: auto sur le conteneur sont un gadget de démo pour observer le reflow en glissant la poignée. En production, supprimez ces deux propriétés et laissez le conteneur suivre la largeur de son parent : la grille auto-fit s'adapte seule. Pour tester, redimensionnez la fenêtre ou utilisez les DevTools (vue responsive).
auto-fit recalcule le nombre de colonnes d'un seul coup à chaque seuil : toutes les cellules se repositionnent simultanément. L'algorithme dense choisit ensuite le meilleur emplacement libre, pas nécessairement le même qu'à la largeur précédente. Pour fixer la position d'une tuile clé, donnez-lui une grid-area nommée (ex. grid-area: hero) au lieu d'un simple span.
Oui — chaque .bento-cell est un conteneur flex standard. Ajoutez background-image avec background-size: cover pour une photo, ou insérez n'importe quel composant (graphique, carte, vidéo). L'effet est 100 % CSS vanilla : il fonctionne dans React, Vue, Svelte ou Angular sans aucune modification.