Adloun

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-shrink et flex-basis ; lire le raccourci flex.
  • Éviter les pièges : order et l'accessibilité, min-width: auto et 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;
}

Illustration

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.

Définition 7.1Conteneur et éléments flex

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.

Proposition 7.2Ce qui change pour les enfants

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.

Définition 7.3Axe principal, axe secondaire

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) ;
  • column vertical, de haut en bas ;
  • row-reverse, column-reverse les 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;
}

Illustration

Les abscisses des trois éléments, mesurées dans Chromium par rapport au bord gauche du conteneur, confirment les calculs :

valeurrépartition des 260 pixels libresabscisses
flex-starttout à la fin0, 80, 160
center130 avant, 130 après130, 210, 290
flex-endtout au début260, 340, 420
space-between2 intervalles de 1300, 210, 420
space-around43,33 de chaque côté de chaque élément43,33, 210, 376,67
space-evenly4 intervalles égaux de 6565, 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 :

Illustration

Définition 7.4Valeurs de align-items
  • stretch (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-end l'élément garde sa hauteur et se place en haut, au milieu, en bas ; « Un », de 26 pixels, est à 32 pixels du haut en center () et à 64 en flex-end ;
  • baseline les é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 cours

En accès libre, sans inscription.

Exercices corrigés de ce chapitre

Lire la suite du cours →