Aller au contenu
M04 · C. Mettre en forme une page web avec les feuilles de style CSS

Positionner les éléments : position, float et Flexbox

Distinguer les éléments en bloc et en ligne, déplacer un élément avec position relative, absolute, fixed et sticky, faire flotter une image, et aligner des éléments en ligne ou en colonne avec Flexbox.

1Situer

Le site d'une agence de location de voitures à Agadir doit afficher trois offres côte à côte, un badge « Promo » collé dans le coin d'une carte, et un menu qui reste en haut de l'écran quand on descend. Par défaut, les blocs s'empilent les uns sous les autres. Pour les placer où l'on veut, il faut les outils de positionnement.

2Comprendre

Flexbox : ranger les éléments sur un axe
.offres (le conteneur) Citadine Berline 4x4 axe principal → display: block (par défaut)

Par défaut, les trois cartes sont des blocs : elles s'empilent les unes sous les autres.

1 / 5

Bloc ou en ligne

  • Un élément bloc (div, p, h1, section) commence sur une nouvelle ligne et prend toute la largeur.
  • Un élément en ligne (span, a, strong, img) reste dans le texte et ne prend que sa place.
  • display change ce comportement : block, inline, inline-block, none (caché), flex, grid.

La propriété position

ValeurComportement
staticpar défaut, dans le flux normal
relativedécalé par rapport à sa place normale, et sert de repère à ses enfants absolus
absolutesorti du flux, placé par top, right, bottom, left dans son repère
fixedfixé à l’écran, ne bouge pas quand on défile
stickydéfile normalement puis reste collé (top: 0)

z-index décide qui passe au-dessus quand deux éléments se superposent.

Le flottement

float: left ou right fait flotter une image : le texte l’entoure, comme dans un journal. On l’utilise encore pour cela, mais plus pour faire des mises en page en colonnes.

.article img { float: left; margin: 0 12px 8px 0; width: 150px; }

Flexbox

On déclare un conteneur flexible ; ses enfants directs se placent sur un axe.

.offres {
  display: flex;
  flex-direction: row;            /* row (ligne) ou column (colonne) */
  justify-content: space-between; /* axe principal : flex-start, center, space-between, space-around */
  align-items: center;            /* axe secondaire : stretch, flex-start, center, flex-end */
  flex-wrap: wrap;                /* retour à la ligne si besoin */
  gap: 16px;
}
.carte { flex: 1; }               /* chaque carte prend une part égale */

Flexbox est l’outil le plus utilisé aujourd’hui pour les menus, les rangées de cartes et le centrage.

Exemple simple

Les voitures sur le parking

Flexbox, c'est le gardien du parking : vous lui dites « garez-les en ligne », « laissez le même espace entre chacune », « centrez-les ». Il place les voitures sans que vous calculiez chaque position.

.offres {
  display: flex;
  justify-content: space-between; /* répartition sur la ligne */
  align-items: center;            /* alignement vertical */
  gap: 16px;                      /* espace entre les cartes */
}
Exemple simple

L'autocollant sur la vitre

Le badge « Promo » est collé à un endroit précis de la carte, quoi qu'il arrive au reste. La carte est le repère (position: relative), le badge est collé dessus (position: absolute).

.carte { position: relative; }
.badge { position: absolute; top: 8px; right: 8px; }

3Manipuler

Les trois offres s'empilent. Utilisez Flexbox pour les mettre côte à côte, puis collez le badge dans le coin de la première carte.
Ouvrir dans le lab ↗
  • Rendez .offres flexible (display: flex)
  • Ajoutez un espace entre les cartes (gap)
  • Faites de .carte le repère du badge (position: relative)
  • Collez le badge dans le coin (position: absolute)
  • Donnez la même largeur aux trois cartes (flex: 1)

4Pratiquer

Exercice 1 · Centrer dans une boîte

Écrivez le CSS qui centre un message horizontalement et verticalement dans une bannière de 300px de haut.

Voir le corrigé
.banniere {
  height: 300px;
  display: flex;
  justify-content: center; /* axe principal (horizontal) */
  align-items: center;     /* axe secondaire (vertical) */
}

Exercice 2 · Le menu qui reste en haut

Quelle valeur de position utiliser pour (1) un bouton WhatsApp toujours en bas à droite de l'écran ; (2) un menu qui défile avec la page puis reste collé en haut ?

Voir le corrigé
/* 1 */
.whatsapp { position: fixed; bottom: 16px; right: 16px; }
/* 2 */
nav { position: sticky; top: 0; }

Exercice 3 · Lignes ou colonnes

Sur mobile, les cartes de .offres doivent s'afficher les unes sous les autres, toujours avec Flexbox. Quelle propriété changer ? Et pour qu'elles passent à la ligne quand il n'y a plus de place ?

Voir le corrigé
.offres { flex-direction: column; }   /* en colonne */
/* ou bien, pour un retour à la ligne automatique : */
.offres { flex-wrap: wrap; }

5Vérifier

1. Par rapport à quoi se place un élément en position: absolute ?
2. Quelle propriété Flexbox répartit les éléments sur l'axe principal ?
3. Un <span> est un élément en ligne. Que se passe-t-il si on lui donne width: 200px ?