CSS Flexbox est le systeme de mise en page le plus utilise dans le developpement web moderne. Il offre un moyen puissant d'aligner, distribuer et reorganiser les elements. Ce memento complet CSS Flexbox explique chaque propriete avec des exemples pratiques.
Construisez des mises en page flexbox visuellement avec notre Generateur Flexbox →
Proprietes du conteneur
Flexbox commence avec un conteneur flex. Definissez display: flex sur un element parent.
display: flex | inline-flex
Definit un conteneur flex. flex cree un conteneur bloc ; inline-flex cree un conteneur en ligne.
.flex-container {
display: flex; /* block-level flex container */
}
.inline-flex-container {
display: inline-flex; /* inline-level flex container */
}flex-direction
Etablit la direction de l'axe principal.
.container {
/* Main axis: left to right (default) */
flex-direction: row;
/* Main axis: right to left */
flex-direction: row-reverse;
/* Main axis: top to bottom */
flex-direction: column;
/* Main axis: bottom to top */
flex-direction: column-reverse;
}| Value | Main Axis | Visual Layout |
|---|---|---|
row | Horizontal (left to right) | [1] [2] [3] |
row-reverse | Horizontal (right to left) | [3] [2] [1] |
column | Vertical (top to bottom) | [1] / [2] / [3] |
column-reverse | Vertical (bottom to top) | [3] / [2] / [1] |
justify-content
Controle la distribution des elements le long de l'axe principal.
.container {
display: flex;
/* Pack items to the start (default) */
justify-content: flex-start;
/* Result: [1][2][3] */
/* Center items */
justify-content: center;
/* Result: [1][2][3] */
/* Pack items to the end */
justify-content: flex-end;
/* Result: [1][2][3] */
/* Equal space between items */
justify-content: space-between;
/* Result: [1] [2] [3] */
/* Equal space around items */
justify-content: space-around;
/* Result: [1] [2] [3] */
/* Equal space between and around items */
justify-content: space-evenly;
/* Result: [1] [2] [3] */
}align-items
Controle l'alignement des elements le long de l'axe transversal.
.container {
display: flex;
height: 200px;
/* Stretch to fill container (default) */
align-items: stretch;
/* Align to the top */
align-items: flex-start;
/* Align to the center */
align-items: center;
/* Align to the bottom */
align-items: flex-end;
/* Align by text baseline */
align-items: baseline;
}| Value | Behavior |
|---|---|
stretch | Items stretch to fill the container height (default) |
flex-start | Items align to the top of the container |
center | Items are vertically centered |
flex-end | Items align to the bottom of the container |
baseline | Items align by their text baseline |
flex-wrap
Controle si les elements restent sur une seule ligne ou passent a la ligne.
.container {
display: flex;
/* All items on one line (default) — may overflow */
flex-wrap: nowrap;
/* Items wrap to next line when needed */
flex-wrap: wrap;
/* Items wrap in reverse order */
flex-wrap: wrap-reverse;
}
/* Shorthand: flex-flow combines direction + wrap */
.container {
flex-flow: row wrap; /* same as flex-direction: row + flex-wrap: wrap */
flex-flow: column nowrap; /* column direction, no wrapping */
}align-content
Controle l'espacement entre les lignes quand les elements passent a la ligne.
.container {
display: flex;
flex-wrap: wrap;
height: 400px;
/* Pack lines to the start */
align-content: flex-start;
/* Center lines */
align-content: center;
/* Pack lines to the end */
align-content: flex-end;
/* Equal space between lines */
align-content: space-between;
/* Equal space around lines */
align-content: space-around;
/* Lines stretch to fill container (default) */
align-content: stretch;
}gap, row-gap, column-gap
Controle l'espacement entre les elements flex.
.container {
display: flex;
flex-wrap: wrap;
/* Equal gap in both directions */
gap: 16px;
/* Different row and column gaps */
gap: 20px 12px; /* row-gap: 20px, column-gap: 12px */
/* Individual properties */
row-gap: 20px;
column-gap: 12px;
}
/* Example: card grid with gap */
.card-grid {
display: flex;
flex-wrap: wrap;
gap: 24px;
}
.card-grid > .card {
flex: 1 1 300px; /* grow, shrink, min 300px */
}Proprietes des elements
Ces proprietes s'appliquent aux elements flex individuels.
order
Controle l'ordre visuel des elements. Par defaut 0.
.item-a { order: 2; } /* appears third */
.item-b { order: -1; } /* appears first */
.item-c { order: 0; } /* appears second (default) */
/* Visual result: [B] [C] [A]
DOM order: A B C
Sorted order: -1 0 2 */flex-grow
Definit comment un element grandit. Par defaut 0.
/* All items same size — share space equally */
.item { flex-grow: 1; }
/* Item B takes twice the extra space */
.item-a { flex-grow: 1; }
.item-b { flex-grow: 2; }
.item-c { flex-grow: 1; }
/* If 200px extra: A gets 50px, B gets 100px, C gets 50px */
/* Only item B grows to fill remaining space */
.item-a { flex-grow: 0; width: 100px; }
.item-b { flex-grow: 1; }
.item-c { flex-grow: 0; width: 100px; }
/* Result: [100px][ fill ][100px] */flex-shrink
Definit comment un element retrecit. Par defaut 1.
/* Default: all items shrink equally */
.item { flex-shrink: 1; }
/* Prevent an item from shrinking */
.sidebar {
flex-shrink: 0;
width: 250px; /* stays at 250px even when container is small */
}
/* Item A shrinks twice as fast */
.item-a { flex-shrink: 2; width: 300px; }
.item-b { flex-shrink: 1; width: 300px; }
/* If 100px must be removed: A loses ~67px, B loses ~33px */flex-basis
Definit la taille initiale d'un element avant la distribution de l'espace.
.item {
/* Use item's content size (default) */
flex-basis: auto;
/* Fixed starting size */
flex-basis: 200px;
/* Percentage of container */
flex-basis: 25%;
/* Use content's intrinsic size */
flex-basis: content;
/* Zero basis — ignore content size for space distribution */
flex-basis: 0;
}
/* flex-basis vs width:
- flex-basis sets the initial size BEFORE grow/shrink
- width sets a fixed size
- flex-basis is relative to the main axis
- If both are set, flex-basis wins */flex (raccourci)
Raccourci pour flex-grow, flex-shrink et flex-basis.
/* flex: <grow> <shrink> <basis> */
.item { flex: 0 1 auto; } /* default: don't grow, can shrink, auto basis */
.item { flex: 1; } /* same as flex: 1 1 0% — grow equally */
.item { flex: auto; } /* same as flex: 1 1 auto — grow based on content */
.item { flex: none; } /* same as flex: 0 0 auto — fully inflexible */
.item { flex: 2; } /* same as flex: 2 1 0% — grows 2x */
.item { flex: 1 0 300px; } /* grow, don't shrink, start at 300px */| Shorthand | Equivalent | Use Case |
|---|---|---|
flex: 1 | flex: 1 1 0% | Equal-width items |
flex: auto | flex: 1 1 auto | Items size by content then share space |
flex: none | flex: 0 0 auto | Fixed-size item (no grow or shrink) |
flex: 0 1 auto | default | Default behavior |
flex: 1 0 300px | grow from 300px, never shrink | Responsive card with min-width |
align-self
Remplace align-items du conteneur pour un element specifique.
.container {
display: flex;
align-items: flex-start; /* all items at top */
height: 200px;
}
.special-item {
align-self: center; /* this item centered vertically */
}
/* Values: auto | flex-start | flex-end | center | baseline | stretch */
.item-a { align-self: flex-start; } /* top */
.item-b { align-self: center; } /* middle */
.item-c { align-self: flex-end; } /* bottom */
.item-d { align-self: stretch; } /* full height */Modeles de mise en page courants
Les modeles flexbox les plus utilises dans les projets reels.
Centrage des elements
Flexbox rend le centrage trivial.
/* Horizontal centering */
.center-horizontal {
display: flex;
justify-content: center;
}
/* Vertical centering */
.center-vertical {
display: flex;
align-items: center;
height: 100vh;
}
/* Perfect centering (both axes) */
.center-both {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
/* Alternative: center with margin auto */
.center-auto {
display: flex;
height: 100vh;
}
.center-auto > .child {
margin: auto; /* centers in both axes */
}Barre de navigation
Une navbar responsive classique.
/* Basic navbar: logo left, links right */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 24px;
height: 64px;
}
.navbar .logo {
flex-shrink: 0;
}
.navbar .nav-links {
display: flex;
gap: 24px;
list-style: none;
}
/* Navbar with center section */
.navbar-3 {
display: flex;
align-items: center;
padding: 0 24px;
}
.navbar-3 .left { flex: 1; }
.navbar-3 .center { flex: 0; white-space: nowrap; }
.navbar-3 .right { flex: 1; display: flex; justify-content: flex-end; }Grille de cartes
Une mise en page de cartes responsive avec retour a la ligne.
/* Responsive card grid */
.card-grid {
display: flex;
flex-wrap: wrap;
gap: 24px;
}
.card {
flex: 1 1 300px; /* grow, shrink, min 300px */
max-width: 400px;
}
/* Cards with equal height */
.card-grid-equal {
display: flex;
flex-wrap: wrap;
gap: 24px;
}
.card-equal {
flex: 1 1 300px;
display: flex;
flex-direction: column;
}
.card-equal .card-body {
flex: 1; /* body fills remaining height */
}
.card-equal .card-footer {
margin-top: auto; /* footer pushed to bottom */
}Pied de page fixe
Le pied de page reste en bas meme avec peu de contenu.
/* Sticky footer layout */
body {
display: flex;
flex-direction: column;
min-height: 100vh;
margin: 0;
}
header {
flex-shrink: 0; /* fixed height header */
}
main {
flex: 1; /* takes all remaining space */
}
footer {
flex-shrink: 0; /* fixed height footer */
}
/* HTML structure:
<body>
<header>...</header>
<main>...</main>
<footer>...</footer>
</body>
*/Mise en page Saint Graal
La classique mise en page a trois colonnes.
/* Holy grail layout */
.page {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.page > header,
.page > footer {
flex-shrink: 0;
}
.page > .content {
flex: 1;
display: flex;
}
.page .sidebar-left {
flex: 0 0 200px; /* fixed 200px left sidebar */
order: -1; /* appears first visually */
}
.page .main {
flex: 1; /* main content fills remaining space */
min-width: 0; /* prevent overflow */
}
.page .sidebar-right {
flex: 0 0 200px; /* fixed 200px right sidebar */
}
/* HTML structure:
<div class="page">
<header>Header</header>
<div class="content">
<main class="main">Main Content</main>
<aside class="sidebar-left">Left</aside>
<aside class="sidebar-right">Right</aside>
</div>
<footer>Footer</footer>
</div>
*/Flexbox vs Grid : quand utiliser chacun
Flexbox et CSS Grid resolvent des problemes differents.
Flexbox est ideal pour :
- One-dimensional layouts (a single row or column)
- Content-driven sizing (items determine their own width)
- Dynamic, unknown number of items
- Navigation bars and toolbars
- Centering elements
- Components where items should wrap naturally
CSS Grid est ideal pour :
- Two-dimensional layouts (rows and columns together)
- Layout-driven sizing (the layout dictates item sizes)
- Complex page layouts with header, sidebar, content, footer
- Overlapping elements in a grid
- When you need precise control over both axes simultaneously
- Dashboard-style layouts with varying card sizes
/* Combining Flexbox and Grid */
.page {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
/* Use Flexbox inside grid areas */
.page header {
grid-area: header;
display: flex;
justify-content: space-between;
align-items: center;
}
.page main {
grid-area: main;
display: flex;
flex-wrap: wrap;
gap: 16px;
align-content: flex-start;
}Support navigateurs
Flexbox a un excellent support dans tous les navigateurs modernes.
| Feature | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| Basic Flexbox | 29+ | 28+ | 9+ | 12+ |
| flex-wrap | 29+ | 28+ | 9+ | 12+ |
| gap (in Flexbox) | 84+ | 63+ | 14.1+ | 84+ |
| row-gap / column-gap | 84+ | 63+ | 14.1+ | 84+ |
Flexbox has over 99% global browser support. The only consideration is the gap property in flex contexts, which requires slightly newer browsers. For older browser support, use margins as a fallback:
/* Fallback for gap */
.container {
display: flex;
flex-wrap: wrap;
margin: -8px; /* negative margin to offset item margins */
}
.container > .item {
margin: 8px; /* acts like gap: 16px */
}
/* Modern approach with @supports */
@supports (gap: 16px) {
.container {
gap: 16px;
margin: 0;
}
.container > .item {
margin: 0;
}
}Questions frequentes
Quelle difference entre justify-content et align-items ?
justify-content controle l'axe principal, align-items controle l'axe transversal. Si flex-direction change, les axes s'inversent.
Quand utiliser Flexbox plutot que Grid ?
Flexbox pour les mises en page 1D, Grid pour les mises en page 2D. Combinez-les pour de meilleurs resultats.
Comment rendre les elements flex egaux en largeur ?
Utilisez flex: 1 sur tous les elements et min-width: 0 si necessaire.
Pourquoi mon element flex ne retrecit pas ?
Par defaut min-width: auto empeche le retrecissement. Ajoutez min-width: 0.
Peut-on utiliser gap avec Flexbox ?
Oui, gap fonctionne avec Flexbox dans tous les navigateurs modernes.
CSS Flexbox est un outil essentiel pour les mises en page modernes. Pratiquez avec notre outil interactif.