Quand un conteneur flex aligne trois boutons sur une barre de navigation, il ne sait rien de la grille de douze colonnes qui structure le reste de la page. Flexbox gère une ligne, CSS Grid gère un plan. Combiner les deux dans un même projet, c’est ce que signifie concrètement flex extend avec flexbox et grid : étendre la flexibilité de chaque module en choisissant le bon outil au bon endroit.
Quand flex extend remplace les media queries
Vous avez déjà remarqué qu’un layout responsive peut accumuler cinq ou six breakpoints pour un résultat moyen ? La propriété flex-wrap combinée à des valeurs flex-grow et flex-basis permet aux éléments de passer à la ligne sans aucune media query. Le conteneur décide seul du moment où un élément n’a plus assez de place.
Grid propose un mécanisme similaire avec auto-fit et minmax(). En définissant grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)), les colonnes se créent ou disparaissent selon la largeur disponible. Là non plus, aucune media query.
La différence entre les deux approches tient à la nature du contrôle. Flex laisse les éléments décider de leur taille, tandis que Grid impose une structure dans laquelle les éléments se placent. Sur un composant de type liste de cartes produit, combiner les deux donne un résultat plus prévisible qu’un seul des deux outils utilisé en force.

Subgrid en production : aligner des composants flex sur la grille parente
Un problème classique revient dans presque tous les projets front : deux cartes côte à côte dont les titres, les images et les boutons ne s’alignent pas verticalement. Chaque carte est un conteneur flex indépendant, et la hauteur de chaque zone varie selon le contenu.
CSS subgrid résout ce problème d’alignement entre composants imbriqués. Avec subgrid, une grille enfant hérite des lignes et des colonnes de la grille parente. Les éléments à l’intérieur de chaque carte se calent alors sur les mêmes rangées, sans dupliquer manuellement les valeurs de grid-template-rows.
Subgrid a atteint le statut Baseline dans les principaux moteurs de rendu (Chromium, Firefox, WebKit). Un projet ciblant les navigateurs des deux ou trois dernières années peut l’utiliser en production sans fallback complexe. Avant ce support généralisé, la seule solution était de fixer des hauteurs en pixels ou d’utiliser du JavaScript pour égaliser les blocs.
Cas concret : grille de cartes avec en-tête, contenu et pied alignés
La grille parente définit trois rangées : une pour l’en-tête, une pour le corps, une pour le bouton d’action. Chaque carte est un élément de grille qui utilise display: grid; grid-template-rows: subgrid; grid-row: span 3;. À l’intérieur, chaque zone flex (texte du titre, paragraphe, bouton) s’aligne sur la rangée correspondante du parent.
Le flex interne garde son rôle : centrer un pictogramme à côté du titre, espacer les tags dans le pied de carte. Grid structure les rangées, flex ajuste le contenu de chaque rangée. C’est cette répartition qui rend l’approche flex extend efficace.
Gap decorations CSS : décorer les espaces entre éléments flex et grid
Jusqu’à récemment, ajouter un séparateur visuel entre deux colonnes ou deux rangées demandait des bordures conditionnelles, des pseudo-éléments ::after, ou des éléments HTML dédiés. La spécification gap decorations change la donne pour les layouts flex et grid.
Les propriétés column-rule, row-rule et le raccourci rule s’appliquent directement aux espaces définis par gap. Des variantes comme row-rule-inset, column-rule-inset ou rule-overlap permettent de contrôler la position et le chevauchement des décorations avec précision.
Cette fonctionnalité, disponible dans Chrome et Edge (Chromium 149), supprime une couche entière de CSS bricolé. Pour un tableau de bord ou une page de données, les séparateurs visuels entre les widgets se déclarent en une ligne au lieu de dix.
column-rule: trace un trait vertical entre les colonnes, comme dans un layout multi-colonnes classique, mais applicable aux grilles et aux conteneurs flex.row-rule: même principe sur l’axe horizontal, entre les rangées d’une grille ou les lignes d’un conteneur flex avec retour à la ligne.rule-visibility-items: masque la décoration lorsque la rangée ou la colonne ne contient qu’un seul élément, ce qui évite les traits orphelins sur les dernières lignes incomplètes.

Flex extend en pratique : choisir le bon outil par composant
Le réflexe courant est de choisir flexbox ou grid pour l’ensemble d’un projet. Cette logique binaire produit des compromis inutiles. Chaque composant gagne à être évalué séparément.
Un formulaire de contact à trois champs par ligne profite de grid : les labels et les champs s’alignent sur des colonnes fixes. En revanche, une barre d’outils avec un nombre variable de boutons fonctionne mieux en flex, parce que les éléments s’adaptent naturellement à l’espace restant.
Critères de choix entre flex et grid par composant
- Le composant a un nombre fixe de colonnes et de rangées : grid est le choix direct. La structure est connue à l’avance, le contenu se place dans des zones nommées.
- Le composant contient un nombre variable d’éléments qui doivent s’adapter en ligne : flex avec
flex-wrapdonne un résultat fluide sans calcul de colonnes. - Le composant imbrique des sous-éléments qui doivent s’aligner sur la grille parente : subgrid évite de dupliquer les templates, et flex gère l’agencement local à l’intérieur de chaque cellule.
- Le composant nécessite des séparateurs visuels entre les zones : les gap decorations évitent les pseudo-éléments et les bordures conditionnelles.
Sur un projet de taille moyenne, la majorité des composants utilise flex pour le contenu interne et grid pour la structure globale. Les cas où grid descend au niveau d’un bouton ou d’un badge sont rares. Les cas où flex pilote un layout de page entière le sont tout autant.
Associer flexbox et grid dans un même projet n’a rien d’un choix théorique. C’est une question de lisibilité du code et de prévisibilité du rendu. Avec le support de subgrid en Baseline et l’arrivée des gap decorations dans Chromium, les raisons de forcer un seul modèle de layout sur l’ensemble d’une interface continuent de diminuer.
