Essayer de coder ← Retour aux sujets

Définir une grille

display: grid

Grid dispose les éléments en lignes et en colonnes. On décrit les colonnes (et au besoin les lignes) sur le conteneur ; les enfants se rangent dans les cases.

display: grid;
Active Grid sur le conteneur
grid-template-columns: 1fr 1fr 1fr;
Trois colonnes de même largeur
grid-template-columns: 200px 1fr;
Une colonne fixe + une colonne qui prend tout le reste
grid-template-columns: repeat(3, 1fr);
Même résultat qu'en répétant 1fr trois fois
grid-template-rows: auto 1fr auto;
Trois lignes : en-tête, contenu flexible, pied
gap: 1rem;
Espace entre les lignes et les colonnes
galerie.css
.galerie {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}
Rendu
Les éléments de la galerie se rangent par trois sur chaque ligne, à largeur égale, avec 1 rem d'écart.

Placer et s'adapter

areas · auto-fit

On peut nommer les zones d'une page (grid-template-areas) ou laisser Grid créer autant de colonnes que la place le permet (auto-fit + minmax).

grid-column: span 2;
L'élément occupe 2 colonnes
grid-column: 1 / 3;
De la ligne de grille 1 à la ligne 3
grid-area: entete;
Place l'élément dans la zone nommée entete
repeat(auto-fit, minmax(14rem, 1fr))
Autant de colonnes d'au moins 14rem que la largeur le permet
place-items: center;
Centre le contenu de chaque case
align-items justify-items
Alignement vertical / horizontal dans la case
page.css
.page {
  display: grid;
  grid-template-columns: 220px 1fr;
  grid-template-areas:
    "entete entete"
    "menu   contenu"
    "pied   pied";
  min-height: 100vh;
}

.entete  { grid-area: entete; }
.menu    { grid-area: menu; }
.contenu { grid-area: contenu; }
.pied    { grid-area: pied; }
Rendu
Un en-tête sur toute la largeur, un menu de 220 pixels à gauche et le contenu à droite, puis un pied de page sur toute la largeur.

🧩 Le cours : la mise en page à deux dimensions

Grid est le système de mise en page à deux dimensions de CSS : on dessine une grille de lignes et de colonnes, puis on place les éléments dedans. Là où Flexbox aligne sur un seul axe, Grid contrôle à la fois la largeur des colonnes et la hauteur des lignes.

Colonnes, lignes et l'unité fr

L'unité fr (*fraction*) représente une part de l'espace disponible. Dans 1fr 2fr 1fr, la deuxième colonne est deux fois plus large que les autres, et l'ensemble remplit exactement le conteneur. On peut mélanger les unités : 200px 1fr (une colonne fixe, une colonne souple) ou auto 1fr (la première colonne prend la taille de son contenu).

grid-template-columns: 1fr 2fr 1fr

┌────────┬──────────────────┬────────┐
│   1    │        2         │   3    │
├────────┼──────────────────┼────────┤
│   4    │        5         │   6    │
└────────┴──────────────────┴────────┘
  25 %           50 %           25 %

Les éléments sont placés automatiquement, de gauche à droite puis de haut en bas : il suffit de définir les colonnes, les lignes se créent toutes seules selon le nombre d'éléments (on peut régler leur hauteur avec grid-auto-rows).

repeat() et minmax()

repeat(3, 1fr) évite de recopier 1fr trois fois. minmax(min, max) fixe une plage de largeur pour une colonne : minmax(14rem, 1fr) signifie « au moins 14rem, au plus une part de l'espace libre ».

Une grille qui s'adapte seule : auto-fit

En combinant repeat(auto-fit, minmax(…)), Grid crée autant de colonnes que la largeur le permet : sur un grand écran 4 colonnes, sur un téléphone une seule, sans aucune media query. C'est l'une des constructions les plus utiles de CSS.

cartes-auto.css
.cartes {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: 1rem;
}
Rendu
Quatre cartes côte à côte sur un grand écran, deux par ligne sur une tablette, une seule en colonne sur un téléphone.

Placer un élément précisément

Les lignes de la grille sont numérotées à partir de 1 : une grille de 3 colonnes a 4 lignes verticales (1 à 4). Un élément peut occuper plusieurs cases : grid-column: 1 / 3 (de la ligne 1 à la ligne 3, donc 2 colonnes), grid-column: span 2 (2 colonnes à partir de sa position), grid-row: span 2. -1 désigne la dernière ligne : grid-column: 1 / -1 couvre toute la largeur.

placement.css
.grille {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0.5rem;
}

.titre {
  grid-column: 1 / -1;       /* toute la largeur */
}

.vedette {
  grid-column: span 2;       /* 2 colonnes... */
  grid-row: span 2;          /* ...et 2 lignes */
}

Nommer les zones d'une page

grid-template-areas dessine la page avec des noms : chaque chaîne est une ligne, chaque mot une colonne, et un nom répété fusionne les cases. Les enfants rejoignent leur zone avec grid-area. La mise en page se lit directement dans le CSS (voir la deuxième carte), et on la réorganise en changeant simplement le dessin.

Aligner dans la grille

PropriétéRôle
justify-items, align-itemsalignement de chaque élément dans sa case (horizontal, vertical)
place-items: centerraccourci des deux : centre tout
justify-self, align-self, place-selfalignement d'un seul élément dans sa case
justify-content, align-contentpositionnement de toute la grille dans le conteneur quand elle est plus petite

Adapter une grille aux écrans

On part d'une seule colonne (mobile), puis on ajoute des colonnes aux écrans plus larges avec une media query (voir Responsive).

adaptatif.css
.page {
  display: grid;
  gap: 1rem;
  grid-template-columns: 1fr;
}

@media (min-width: 768px) {
  .page {
    grid-template-columns: 220px 1fr;
  }
}

Grid et Flexbox ensemble

Les deux ne s'opposent pas : on utilise Grid pour le squelette de la page ou d'un composant (zones, colonnes), et Flexbox pour aligner le contenu d'une zone (barre de boutons, ligne d'étiquettes).

⚠️ Erreurs fréquentes

Oublier display: grid

grid-template-columns et gap n'ont aucun effet tant que le conteneur n'est pas en display: grid. Si ta grille ne s'affiche pas, vérifie d'abord cette ligne, sur le parent.

Se tromper dans la numérotation des lignes

Avec 3 colonnes, il y a 4 lignes de grille. grid-column: 1 / 3 couvre donc 2 colonnes, pas 3. Pour couvrir toute la largeur quel que soit le nombre de colonnes : 1 / -1.

Un contenu long qui élargit une colonne 1fr

À éviter
faux.css
.grille { grid-template-columns: 1fr 1fr; }                /* un long mot peut forcer une colonne à s'élargir */
Correct
correct.css
.grille { grid-template-columns: repeat(2, minmax(0, 1fr)); }   /* colonnes strictement égales */

1fr vaut en réalité minmax(auto, 1fr) : une colonne ne descend pas sous la taille de son contenu. minmax(0, 1fr) autorise le rétrécissement et coupe ou fait défiler le contenu trop large.

Mélanger pourcentages et gap

Trois colonnes à 33% plus un gap dépassent 100 % de la largeur. Utilise fr, qui répartit l'espace après avoir retiré les écarts.

Des zones nommées incohérentes

Chaque nom de zone doit former un rectangle (pas de forme en L), toutes les lignes de grid-template-areas doivent avoir le même nombre de mots, et un point . désigne une case vide.

Placer un élément et en recouvrir un autre

Deux éléments placés explicitement dans la même case se chevauchent sans avertissement. Laisse le placement automatique faire le travail, sauf pour les quelques éléments qui ont besoin d'une position précise.

📋 Aide-mémoire

  • Conteneur : display: grid; + grid-template-columns (et -rows) + gap.
  • fr = part de l'espace libre ; repeat(n, 1fr) ; minmax(min, max) ; repeat(auto-fit, minmax(14rem, 1fr)) = colonnes qui s'adaptent seules.
  • Placement : grid-column: 1 / 3, span 2, 1 / -1 (toute la largeur), grid-row, grid-area.
  • Zones nommées : grid-template-areas (une chaîne par ligne) et grid-area sur les enfants.
  • Alignement : place-items: center (dans les cases), place-self (un élément), justify-content (toute la grille).
  • Grid pour le squelette en 2D, Flexbox pour aligner sur un axe ; minmax(0, 1fr) si le contenu élargit trop une colonne.