Flexbox
Cours · CSS : mettre en forme le Web (école d'ingénieur), chapitre 7 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun
Au chapitre 5, nous avons rangé les cartes de la Librairie du Campus côte à côte avec inline-block, et noté deux défauts : un espace parasite entre les cartes, et des hauteurs inégales. Au chapitre 6, l'en-tête est devenu collant, mais son menu s'aligne mal sous le nom de la librairie. Ces trois problèmes ont la même cause : ni le flux normal ni le positionnement ne savent répartir des boîtes sur une ligne, ni les aligner entre elles.
Flexbox (le « module de boîtes flexibles ») est fait pour cela. On déclare un conteneur, et ses enfants directs se rangent sur un axe, se partagent la place disponible, s'alignent, passent à la ligne si on le permet. C'est l'outil des mises en page à une dimension : une barre de navigation, une rangée de boutons, une liste de cartes, une colonne qui pousse le pied de page en bas. Les grilles à deux dimensions seront l'affaire du chapitre 8.
Objectifs du chapitre
- Créer un conteneur flex ; identifier ses deux axes, que fixe
flex-direction. - Répartir les éléments (
justify-content,gap) et les aligner (align-items,align-self,align-content). - Calculer la taille de chaque élément à partir de
flex-grow,flex-shrinketflex-basis; lire le raccourciflex. - Éviter les pièges :
orderet l'accessibilité,min-width: autoet les mots longs. - Écrire les motifs courants : barre de navigation, objet média, pied de page en bas, cartes de même hauteur.
7.1 Un premier conteneur flex
<ul class="menu">
<li><a href="#">Accueil</a></li>
<li><a href="#">Catalogue</a></li>
<li><a href="#">Commander</a></li>
<li><a href="#">Contact</a></li>
</ul>
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 16px;
font-family: system-ui, sans-serif;
}
.menu {
display: flex;
gap: 1rem;
padding: 0.5rem;
margin: 0;
list-style: none;
background: #dbe4f0;
}
.menu li {
padding: 0.25rem 0.5rem;
background: #fff;
border: 1px solid #1f3a68;
}

Une seule déclaration, display: flex, a suffi : les éléments de liste, qui s'empilaient, sont alignés sur une ligne, séparés de 1 rem par gap. Les liens sont restés des liens, la liste une liste.
Un élément en display: flex est un conteneur flex. Ses enfants directs deviennent des éléments flex (les petits-enfants ne sont pas concernés). Le conteneur, lui, reste un bloc dans le flux de son parent ; display: inline-flex en ferait une boîte en ligne.
Dans un conteneur flex, les éléments ont tous un comportement de bloc, quel que soit leur display d'origine ; leurs marges ne fusionnent pas ; float et vertical-align sont sans effet ; les espaces entre les balises du HTML ne comptent plus.
7.2 Les deux axes
Tout Flexbox se raisonne sur deux axes perpendiculaires.
L'axe principal est celui sur lequel les éléments se suivent ; il est fixé par flex-direction :
row(valeur initiale) horizontal, dans le sens de lecture (de gauche à droite en français) ;columnvertical, de haut en bas ;row-reverse,column-reverseles mêmes, en sens inverse.
L'axe secondaire (cross axis) lui est perpendiculaire. justify-content agit sur l'axe principal, align-items sur l'axe secondaire.
Retenir ce couple est la clé de tout le chapitre : en flex-direction: column, justify-content devient vertical et align-items horizontal. Les mots start et end des valeurs désignent le début et la fin de l'axe, et non la gauche ou la droite.
Méthode — voir les axes dans les outils de développement
Dans l'onglet Elements de Chromium, un badge flex apparaît à côté de chaque conteneur flex : un clic dessus dessine le conteneur, ses éléments et les espaces (gap, espace libre) sur la page. Dans l'onglet Styles, une petite icône à côté de display: flex ouvre un éditeur visuel de flex-direction, justify-content et align-items. L'onglet Layout liste tous les conteneurs de la page.
7.3 Répartir sur l'axe principal : justify-content
Trois éléments de 80 pixels dans un conteneur de 500 : il reste 260 pixels d'espace libre. justify-content décide où le mettre.
.rangee {
display: flex;
width: 500px;
}
.space-between {
justify-content: space-between;
}

Les abscisses des trois éléments, mesurées dans Chromium par rapport au bord gauche du conteneur, confirment les calculs :
| valeur | répartition des 260 pixels libres | abscisses |
|---|---|---|
flex-start | tout à la fin | 0, 80, 160 |
center | 130 avant, 130 après | 130, 210, 290 |
flex-end | tout au début | 260, 340, 420 |
space-between | 2 intervalles de 130 | 0, 210, 420 |
space-around | 43,33 de chaque côté de chaque élément | 43,33, 210, 376,67 |
space-evenly | 4 intervalles égaux de 65 | 65, 210, 355 |
Avec space-around, chaque élément reçoit pixels, moitié à gauche, moitié à droite : les bords n'ont que 43,33 pixels, l'intervalle entre deux éléments le double.
7.3.1 gap
gap fixe un écart entre les éléments, jamais avant le premier ni après le dernier. Avec deux valeurs, la première est l'écart entre les lignes, la seconde entre les colonnes. C'est la bonne façon d'espacer des éléments flex : avec des marges, il faudrait retirer celle du dernier.
7.4 Aligner sur l'axe secondaire
align-items, sur le conteneur, place chaque élément dans la hauteur de sa ligne (pour une rangée). Ici, un conteneur de 90 pixels de haut et trois éléments de contenus différents :

align-itemsstretch(valeur initiale) l'élément s'étire sur toute la hauteur de la ligne, s'il n'a pas de hauteur fixée : les trois mesurent 90 pixels ;flex-start,center,flex-endl'élément garde sa hauteur et se place en haut, au milieu, en bas ; « Un », de 26 pixels, est à 32 pixels du haut encenter() et à 64 enflex-end;baselineles éléments sont alignés sur la ligne de base de leur première ligne de texte : le grand « Trois » reste en haut, les deux autres descendent de 10 pixels pour que leurs textes soient sur la même ligne.
La suite du cours est sur Adloun
Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.
Lire la suite du coursEn accès libre, sans inscription.