CSS · LEÇON 12 SUR 12

Affichage et positionnement

Comprenez le flux, Flexbox, Grid et le positionnement.

Débutant25 min de lecture · estimationMis à jour le 1 nov. 2026
Dans cette leçonFlux normaldisplayLe modèle de boîtepositionz-index & stackingFlexboxGridCenteringTasks: how do I…?Common problemsUnits & sizingCheat sheet

1Le flux normal

Même sans CSS, le navigateur place les éléments selon le flux normal : les éléments block (div, p, h1, section, nav) s’empilent verticalement et occupent la largeur disponible. Les éléments inline (a, span, strong, img) restent sur la même ligne et passent à la suivante si besoin.

Les éléments block s’empilent, les éléments inline partagent une ligne.
div (block)
div (block)
Du texte avec span et a link in one line.
L’essentiel : chaque outil change la façon dont les éléments participent au flux normal (display, flex, grid) ou les en retire (position). Choisissez votre objectif avant d’écrire du CSS.

2display

La propriété display détermine le type de boîte d’un élément et la façon dont ses enfants sont organisés.

ValeurComportement
blockCommence à la ligne et occupe la largeur disponible. Largeur, hauteur et espacements s’appliquent.
inlineReste dans une ligne de texte. Width et height ne s’appliquent pas à la plupart des éléments inline ; les marges verticales non plus.
inline-blockReste sur une ligne, tout en acceptant width, height, margin et padding.
noneTotalement retiré : invisible, sans espace et non annoncé par les lecteurs d’écran.
flexAligne les enfants en ligne ou colonne, avec un contrôle des espacements (section 6).
gridOrganise les enfants en lignes et colonnes en même temps (section 7).
contentsLa boîte du parent disparaît ; ses enfants se comportent comme s’ils étaient dans le grand-parent.
inline / inline-block / block avec width: 120px
inline inline-block block

display: none vs visibility: hidden vs opacity: 0

Prend de la placeCliquableÀ utiliser pour
display:noneNonNonMenus, onglets, panneaux cachés
visibility:hiddenOuiNonMasquer sans modifier la mise en page
opacity:0OuiOuiAnimations de fondu

3Le modèle de boîte

Chaque élément est une boîte avec quatre couches, de l’intérieur vers l’extérieur : content, padding (espace intérieur), border, puis margin (espace extérieur).

margin
border → padding
content (width × height)

Pensez à box-sizing: border-box

Par défaut, une largeur de 300px et un padding de 20px de chaque côté donnent une boîte de 340px, ce qui provoque souvent des débordements. Avec border-box, les bordures et le padding font partie de la largeur déclarée.

*, *::before, *::after { box-sizing: border-box; }

Raccourcis de margin

margin: 10px;              /* all four sides */
margin: 10px 20px;         /* vertical | horizontal */
margin: 10px 20px 30px;    /* top | horizontal | bottom */
margin: 10px 20px 30px 40px; /* top right bottom left (clockwise) */
margin: 0 auto;            /* centers a block that has a width */
margin-left: auto;         /* pushes an element to the far right */
Fusion des marges : les marges verticales de deux blocs s’additionnent rarement ; seule la plus grande reste (20px et 30px donnent 30px). Ce phénomène n’arrive pas avec Flexbox ou Grid, ni avec le padding.

4position

La propriété position définit si un élément reste dans le flux normal. Les propriétés top, right, bottom et left servent ensuite à le déplacer ou le fixer.

ValeurDans le flux ?Décalage mesuré depuis…Utilisation courante
staticOuiLes décalages sont ignorés (défaut)Mise en page normale
relativeOui (conserve sa place)Sa position d’originePetit décalage ou référence pour ses enfants
absoluteNonParent de positionnement le plus procheBadges, boutons en coin, menus déroulants
fixedNonLa fenêtre du navigateurBoutons flottants et barres toujours visibles
stickyOuiLe conteneur de défilement, après le seuilEn-têtes, titres de tableaux, menus latéraux
Règle pratique : un élément absolute se place par rapport au parent positionné le plus proche. Sinon, il peut se référer à la page entière. Ajoutez position: relative au parent voulu.

Essayez

Page (extérieur, toujours positionné)
Parent
Élément avant
Cible
Élément après

Passez le parent en static : le bloc se positionne par rapport à la page extérieure. Choisissez relative : les éléments voisins restent à leur place. En absolute, ils comblent l’espace laissé libre.

Raccourcis de positionnement

inset: 0;                 /* top, right, bottom, left all 0: stretch to fill the parent */
position: absolute; top: 0; right: 0;     /* pin to top-right corner */
position: absolute; inset: 0; margin: auto; width: 200px; height: 100px; /* centered */

fixed

.chat-button { position: fixed; right: 20px; bottom: 20px; }

L’élément reste visible pendant le défilement. Attention : certaines propriétés d’un parent, comme transform, filter ou perspective, peuvent modifier son repère.

sticky

Un élément sticky a besoin d’un seuil (comme top: 0) et de suffisamment d’espace pour se déplacer. Faites défiler la boîte ci-dessous.

En-tête fixe (top: 0)

Ligne 1

Ligne 2

Ligne 3

Ligne 4

Ligne 5

Ligne 6

Ligne 7

Ligne 8

header { position: sticky; top: 0; z-index: 10; background: #fff; }
Sticky ne fonctionne pas ? Vérifiez top, les propriétés overflow des parents et l’espace disponible dans le conteneur.

5z-index et superposition

z-index détermine quel élément recouvre les autres. Une valeur supérieure passe devant, mais seulement pour les éléments positionnés ou les enfants de Flexbox/Grid.

z-index: 2
z-index: 1
Pourquoi un grand z-index perd-il ? À l’intérieur d’un même contexte de superposition, la valeur élevée gagne. Mais transform, opacity, filter et certaines positions créent leurs propres contextes : un enfant ne peut pas sortir de celui de son parent.
/* a simple scale that avoids chaos */
--z-dropdown: 100;
--z-sticky: 200;
--z-modal: 300;
--z-toast: 400;

6Flexbox

Flexbox organise les éléments dans une direction : navigation, groupes de boutons ou cartes côte à côte. Appliquez display: flex au parent pour transformer ses enfants en éléments flexibles.

.row { display: flex; gap: 16px; }

Il existe deux axes : l’axe principal suit la direction des éléments, et l’axe transversal lui est perpendiculaire. justify-content agit sur l’axe principal, align-items sur l’autre. Avec flex-direction: column, ils s’inversent.

Essayez

1
2
3

Propriétés du conteneur

PropriétéEffet
flex-directionrow | column | row-reverse | column-reverse
justify-contentRépartit les éléments sur l’axe principal
align-itemsAligne les éléments sur l’axe transversal
flex-wrapAutorise le retour à la ligne
gapEspace entre éléments (préférez-le aux marges)
align-contentEspace entre lignes après retour

Propriétés des éléments enfants

PropriétéEffet
flex: 1L’élément occupe l’espace libre ; deux éléments flex: 1 le partagent.
flex: 0 0 200pxNe grandit pas et ne rétrécit pas : largeur de base 200px.
flex-shrink: 0Empêche le rétrécissement (logos et icônes).
align-selfChange l’alignement d’un seul enfant.
orderModifie l’ordre visuel sans changer le HTML.
margin-left: autoPrend l’espace libre et pousse l’élément à l’extrémité.
Texte qui dépasse dans Flexbox ? Un élément flex n’aime pas devenir plus petit que son contenu. Ajoutez min-width: 0.

7Grid

Grid sert aux mises en page qui utilisent lignes et colonnes ensemble : galeries, tableaux de bord et formulaires. Appliquez display: grid au parent et définissez les colonnes.

1fr
2fr
1fr
spans 2 columns
1fr
.grid {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;   /* three columns, middle twice as wide */
  gap: 16px;
}
.wide { grid-column: 1 / 3; }           /* from line 1 to line 3 = 2 columns */

Cartes responsive sans media query

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 20px;
}

Chaque carte mesure au moins 240px, et le navigateur en place autant que possible sur chaque ligne.

Mise en page avec zones nommées

.page {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header header"
    "side   main"
    "footer footer";
  min-height: 100vh;
}
header { grid-area: header; }
aside  { grid-area: side; }
main   { grid-area: main; }
footer { grid-area: footer; }
Flex ou Grid ? Pour une direction guidée par le contenu, préférez Flex. Pour lignes et colonnes définies par la mise en page, préférez Grid. Ils fonctionnent très bien ensemble.

8Centrer des éléments

/* 1. Center anything, horizontally and vertically (best default) */
.parent { display: grid; place-items: center; }

/* 2. Same with flex */
.parent { display: flex; justify-content: center; align-items: center; }

/* 3. Center a block horizontally only */
.box { width: 600px; max-width: 100%; margin: 0 auto; }

/* 4. Center text */
.text { text-align: center; }

/* 5. Center an absolutely positioned element */
.box { position: absolute; inset: 0; margin: auto; width: 200px; height: 100px; }

/* 6. Center on the full screen */
.parent { min-height: 100vh; display: grid; place-items: center; }
Le centrage vertical demande un parent qui possède une hauteur. Sinon, il n’y a pas d’espace dans lequel centrer l’élément.

9Comment faire pour… ?

Logo à gauche et liens à droite (navigation)

Appliquez Flexbox à la navigation, puis utilisez l’espace entre les éléments.

<nav class="nav"><a class="logo">DECT</a><ul class="links">…</ul></nav>

.nav   { display: flex; justify-content: space-between; align-items: center; padding: 16px 32px; }
.links { display: flex; gap: 24px; list-style: none; margin: 0; padding: 0; }

Logo à gauche, liens au centre et bouton à droite

Utilisez une grille à trois colonnes pour garder le groupe central parfaitement centré.

.nav { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; }
.nav .cta { justify-self: end; }

Garder la navigation en haut pendant le défilement

.nav { position: sticky; top: 0; z-index: 100; background: #fff; }

Pousser un lien à l’extrême droite

Une marge automatique pousse cet élément vers l’extrémité.

.links { display: flex; gap: 16px; }
.links .login { margin-left: auto; }

Bouton dans le coin supérieur droit d’une carte

La carte devient le repère avec relative, et le bouton est fixé avec absolute.

.card  { position: relative; padding: 24px; }
.close { position: absolute; top: 12px; right: 12px; }

Ajouter un badge de notification sur une icône

.icon  { position: relative; display: inline-block; }
.badge { position: absolute; top: -6px; right: -6px; }

Fixer un bouton flottant en bas à droite

.fab { position: fixed; right: 20px; bottom: 20px; z-index: 50; }

Afficher un menu déroulant sous un lien

Ce CSS montre seulement le positionnement. Un menu déroulant accessible doit gérer le clavier, le toucher, le focus et l’état ouvert.

.item     { position: relative; }
.dropdown { position: absolute; top: 100%; left: 0; display: none; min-width: 180px; z-index: 100; }
.item:hover .dropdown { display: block; }

Créer une fenêtre modale sur fond assombri

Ceci n’est qu’un exemple de mise en page. Une vraie modale doit gérer le focus, la fermeture et la touche Échap. Pensez à l’élément natif dialog.

.overlay { position: fixed; inset: 0; background: rgba(0,0,0,.5); display: grid; place-items: center; z-index: 300; }
.modal   { background: #fff; padding: 24px; width: min(480px, 92vw); border-radius: 8px; }

Garder le pied de page en bas d’une page courte

body { min-height: 100vh; display: flex; flex-direction: column; margin: 0; }
main { flex: 1; }   /* takes all leftover space, footer is pushed down */

Créer une barre latérale et un contenu principal

.layout  { display: grid; grid-template-columns: 260px 1fr; gap: 24px; }
.sidebar { position: sticky; top: 16px; align-self: start; }

Cartes de même hauteur avec bouton en bas

.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px; }
.card  { display: flex; flex-direction: column; }
.card .btn { margin-top: auto; }

Placer deux boutons côte à côte et espacés

.actions { display: flex; gap: 12px; }

Créer un hero plein écran avec texte centré

.hero { min-height: 100vh; display: grid; place-items: center; text-align: center; }

Empiler les colonnes sur mobile, côte à côte sur ordinateur

.row { display: flex; flex-direction: column; gap: 20px; }
@media (min-width: 768px) { .row { flex-direction: row; } .row > * { flex: 1; } }

Masquer le menu sur mobile et afficher un bouton hamburger

.burger { display: none; }
@media (max-width: 767px) { .links { display: none; } .burger { display: block; } }

Superposer un texte sur une image

.hero { position: relative; }
.hero img { width: 100%; display: block; }
.hero .text { position: absolute; left: 24px; bottom: 24px; color: #fff; }

10Problèmes fréquents

ProblèmeCauseSolution
Un élément absolute part au coin de la pageAucun parent positionnéposition: relative sur le parent
Le parent perd sa hauteurTous les enfants sont absolute ou flottantsDonnez une hauteur au parent ou gardez un enfant dans le flux
z-index ne fonctionne pasÉlément static ou autre contexte de superpositionAdd position: relative; augmentez le z-index du parent
Une barre de défilement horizontale apparaîtUn élément dépasse l’écran : padding, 100vw ou mot trop longbox-sizing: border-box; use width: 100%; overflow-wrap: anywhere
Width et height sans effetL’élément est inline (span, a)display: inline-block or block
La marge haute d’un enfant déplace le parentFusion des margesAjoutez du padding au parent ou utilisez display: flow-root
Petit espace sous une imageLes images inline suivent la ligne de base du texteimg { display: block; }
Sticky ne colle pasTop absent ou overflow défini sur un parentAdd top: 0; remove overflow from ancestors
Un élément flex déborde avec du texte longL’élément refuse de devenir plus petit que son contenumin-width: 0 sur l’élément
100vh trop grand sur téléphoneLa barre du navigateur est comptée dans 100vhUse 100dvh
Un élément fixed ne reste pas fixeUn parent possède transform ou filterDéplacez l’élément ou retirez le transform
Le centrage vertical échoueLe parent n’a pas de hauteurAjoutez min-height

Méthode de débogage

/* 1. Show every box */
* { outline: 1px solid rgba(255,0,0,.4); }

/* 2. In the browser: right-click → Inspect → hover the element
      The colors show margin, border, padding and content.
   3. Check the "Computed" tab for the real display and position. */

11Unités et dimensions

UnitéSensÀ utiliser pour
pxPixels fixesBordures, ombres et détails
%Pourcentage du parentLargeurs flexibles
remMultiple de la police racine (souvent 16px)Polices et espacements
emMultiple de la police de l’élémentPadding proportionnel au texte
vw / vh1 % de la largeur / hauteur de l’écranSections plein écran
dvhHauteur adaptée aux barres mobilesPlein écran sur mobile
frPart de l’espace libre dans GridColonnes Grid
width: min(1100px, 92%);               /* never wider than 1100px, never touching the edges */
font-size: clamp(1rem, 2.5vw, 1.5rem); /* min | preferred | max */
.container { max-width: 1100px; margin-inline: auto; padding-inline: 20px; }
img { max-width: 100%; height: auto; }  /* images never overflow */

12Aide-mémoire

Je veux…Utiliser
Ranger en ligne ou colonnedisplay: flex + gap
Créer des lignes et colonnesdisplay: grid
Centrer un élémentdisplay: grid; place-items: center
Centrer un bloc horizontalementmargin: 0 auto + a width
Espacer les élémentsgap (parent) rather than margins on children
Pousser un élément à l’extrémitémargin-left: auto (flex)
Fixer dans un coin du parentparent relative + child absolute
Fixer à l’écranposition: fixed
Coller pendant le défilementposition: sticky; top: 0
Recouvrir toute une zoneposition: absolute; inset: 0
Afficher ou masquerdisplay: none / block
Gérer les superpositionsz-index on a positioned element
Inclure le padding dans la largeurbox-sizing: border-box
Ordre à suivre : 1) Le flux normal suffit-il ? Ne touchez à rien. 2) Ligne ou grille ? Flexbox ou Grid sur le parent. 3) Besoin de superposition ou de fixation ? Utilisez position seulement alors.

Pour aller plus loin

Référence CSS de MDN · Ressources CSS du W3C

Votre progression est enregistrée uniquement dans ce navigateur.