Essayer de coder ← Retour aux sujets

Le conteneur flex

display: flex

Flexbox répartit des éléments sur un axe principal (ligne ou colonne). On règle le conteneur (le parent) ; ses enfants directs deviennent des éléments flex.

display: flex;
Active Flexbox : les enfants se placent en ligne
flex-direction: row | column;
Axe principal : horizontal (défaut) ou vertical
justify-content: space-between;
Répartition sur l'axe principal
align-items: center;
Alignement sur l'axe secondaire
gap: 1rem;
Espace entre les éléments
flex-wrap: wrap;
Passe à la ligne quand il n'y a plus de place
barre.css
.barre {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
}
Rendu
Les éléments de la barre sont répartis sur toute la largeur, centrés verticalement et séparés d'au moins 1 rem.

Les éléments flex

flex: 1

Chaque enfant peut grandir, rétrécir ou avoir une taille de départ : c'est la propriété flex (raccourci de flex-grow, flex-shrink et flex-basis).

flex: 1;
L'élément prend sa part de l'espace libre
flex: 0 0 200px;
Largeur fixe de 200px : ne grandit pas, ne rétrécit pas
flex-grow: 2;
Prend deux fois plus d'espace libre que les autres
align-self: flex-end;
Aligne cet élément seul sur l'axe secondaire
order: -1;
Change l'ordre d'affichage (sans toucher au HTML)
margin-left: auto;
Pousse l'élément (et les suivants) à l'extrémité droite
colonnes.css
.page {
  display: flex;
  gap: 1rem;
}

.menu {
  flex: 0 0 200px;
}

.contenu {
  flex: 1;
}
Rendu
Un menu de 200 pixels à gauche et un contenu qui occupe tout le reste de la largeur.

📐 Le cours : la mise en page sur un axe

Avant Flexbox, aligner des éléments demandait des contournements. display: flex règle en quelques lignes ce qui était pénible : centrer, répartir l'espace, mettre côte à côte, inverser l'ordre, s'adapter à la place disponible. Flexbox travaille sur une dimension à la fois (une ligne ou une colonne) ; pour une grille à deux dimensions, voir Grid.

Les deux axes

flex-direction: row (par défaut)        axe principal →
  ┌──────┐ ┌──────┐ ┌──────┐
  │  1   │ │  2   │ │  3   │       ↕ axe secondaire
  └──────┘ └──────┘ └──────┘

flex-direction: column                  axe principal ↓
  ┌──────────────┐
  │      1       │
  ├──────────────┤                 ↔ axe secondaire
  │      2       │
  └──────────────┘

justify-content agit toujours sur l'axe principal, align-items sur l'axe secondaire. Quand tu passes en column, les deux s'échangent : justify-content devient vertical.

Répartir sur l'axe principal : justify-content

flex-start     |[1][2][3]            |
center         |      [1][2][3]      |
flex-end       |            [1][2][3]|
space-between  |[1]      [2]      [3]|
space-around   | [1]    [2]    [3]   |
space-evenly   |  [1]   [2]   [3]    |

Aligner sur l'axe secondaire : align-items

ValeurEffet (conteneur en ligne)
stretch (défaut)les éléments s'étirent sur toute la hauteur du conteneur
flex-startalignés en haut
centercentrés verticalement
flex-endalignés en bas
baselinealignés sur la ligne de base de leur texte

Schémas à connaître

Centrer un élément dans l'écran :

centrer.css
.centre {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

Barre de navigation : logo à gauche, lien de connexion à droite. Une marge automatique absorbe tout l'espace libre et pousse l'élément à l'extrémité :

navbar.css
.navbar {
  display: flex;
  align-items: center;
  gap: 1rem;
}

.navbar .connexion {
  margin-left: auto;
}

Cartes qui passent à la ligne selon la place disponible :

cartes.css
.cartes {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}

.cartes > .carte {
  flex: 1 1 16rem;     /* grandit, rétrécit, base de 16rem */
}

Pied de page en bas de l'écran, même quand le contenu est court :

pied-de-page.css
body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

main {
  flex: 1;             /* occupe toute la place restante */
}

flex : grow, shrink, basis

flex: <grow> <shrink> <basis> règle comment un élément partage la place. flex-basis est sa taille de départ, flex-grow sa part de l'espace libre quand il y en a, flex-shrink sa part de réduction quand il en manque.

ÉcritureÉquivaut àEffet
flex: 11 1 0tous les éléments flex: 1 ont la même largeur, quel que soit leur contenu
flex: auto1 1 autopart de la taille du contenu, puis se partage l'espace libre
flex: none0 0 autotaille du contenu, ne bouge jamais
flex: 0 0 200px—exactement 200 px

Flexbox imbriqué

Un élément flex peut lui-même être un conteneur flex : c'est ainsi qu'on construit une carte (image à gauche, texte à droite, bouton en bas) dans une rangée de cartes. Chaque niveau résout une dimension.

Flexbox ou Grid ?

Flexbox est idéal quand c'est le contenu qui dicte la disposition (barres, boutons côte à côte, centrage, ligne d'étiquettes). Grid est préférable quand tu veux définir la grille d'ensemble de la page ou d'un composant, en lignes et en colonnes. Les deux se combinent très bien.

⚠️ Erreurs fréquentes

Mettre display: flex sur le mauvais élément

À éviter
faux.css
.carte {
  display: flex;            /* ne concerne que les enfants de .carte */
}
.barre-de-menu a {
  justify-content: center;  /* sur les liens eux-mêmes : sans effet */
}
Correct
correct.css
.barre-de-menu {
  display: flex;            /* sur le PARENT des éléments à aligner */
  justify-content: center;
}

display: flex se met sur le parent ; seuls ses enfants directs deviennent des éléments flex (les petits-enfants ne le sont pas).

Oublier que les axes s'échangent en column

Avec flex-direction: column, centrer horizontalement se fait avec align-items: center (et non justify-content). Si un centrage ne marche pas, vérifie d'abord l'axe principal.

Du texte long qui fait déborder un élément flex

Un élément flex ne rétrécit pas en dessous de la taille de son contenu. Un long mot ou une image large déborde alors du conteneur. Ajoute min-width: 0 (ou overflow: hidden) à l'élément pour l'autoriser à rétrécir.

Des éléments qui rétrécissent quand on ne le veut pas

Par défaut flex-shrink vaut 1 : un bouton à width: 200px peut être écrasé s'il manque de place. Utilise flex: 0 0 200px ou flex-shrink: 0 pour le préserver.

Croire que width fixe la largeur d'un élément flex

C'est flex-basis qui fixe la taille de départ ; width est utilisé seulement si flex-basis vaut auto. L'élément peut ensuite grandir ou rétrécir : pour une taille exacte, écris flex: 0 0 <taille>.

Un conteneur sans hauteur pour align-items

align-items: center centre dans la hauteur du conteneur. S'il n'a pas plus de hauteur que son contenu, il n'y a rien à centrer : donne-lui une height ou une min-height (par exemple 100vh).

📋 Aide-mémoire

  • Sur le parent : display: flex, flex-direction, flex-wrap, gap, justify-content (axe principal), align-items (axe secondaire).
  • Sur les enfants : flex (1 partage l'espace, 0 0 200px fixe), align-self, order, margin-left: auto.
  • justify-content : flex-start, center, flex-end, space-between, space-around, space-evenly.
  • Centrer : display: flex; justify-content: center; align-items: center; (avec une hauteur au conteneur).
  • min-width: 0 autorise un élément flex à rétrécir ; flex-wrap: wrap fait passer à la ligne.
  • Une dimension (ligne ou colonne) : Flexbox ; deux dimensions : Grid.