Essayer de coder ← Retour aux sujets

La propriété position

position

position décide comment un élément est placé par rapport au flux normal. top, right, bottom et left n'ont d'effet que si position n'est pas static.

position: static;
Par défaut : l'élément reste dans le flux normal
position: relative;
Décalé depuis sa place normale (qui reste réservée) ; sert de repère aux enfants
position: absolute;
Sorti du flux ; placé par rapport au plus proche ancêtre positionné
position: fixed;
Placé par rapport à la fenêtre ; ne bouge pas quand on défile
position: sticky;
Normal, puis collé au bord pendant le défilement
z-index: 10;
Ordre d'empilement des éléments qui se chevauchent
badge.css
.carte {
  position: relative;
}

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

.entete {
  position: sticky;
  top: 0;
  z-index: 10;
}
Rendu
Un petit badge accroché au coin supérieur droit de la carte ; l'en-tête reste collé en haut de l'écran quand on fait défiler la page.

Flux normal, centrage et float

flux

Sans règle particulière, les blocs s'empilent de haut en bas et les éléments en ligne se suivent de gauche à droite : c'est le flux normal.

display: block; display: inline-block;
Comportement de la boîte dans le flux
margin: 0 auto;
Centre un bloc de largeur fixe
text-align: center;
Centre le texte et les éléments en ligne
top: 50%; left: 50%; transform: translate(-50%, -50%);
Centre un élément positionné
float: left;
Fait flotter à gauche (le texte l'entoure)
clear: both;
Se place sous les éléments flottants
modale.css
.modale {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);   /* recentre sur son propre milieu */
  z-index: 100;
}

.photo {
  float: left;
  margin: 0 1rem 1rem 0;
}
Rendu
Une fenêtre centrée au milieu de l'écran, au-dessus du reste. Une photo à gauche dont le texte suivant épouse le contour.

📍 Le cours : placer les éléments

Aujourd'hui, pour disposer les éléments d'une page on utilise Flexbox et Grid. La propriété position sert aux cas particuliers : badge accroché à un coin, menu déroulant, en-tête qui reste visible, fenêtre modale, bouton « retour en haut ». Pour bien l'utiliser, il faut d'abord comprendre le flux normal.

Le flux normal

Les éléments de bloc (div, p, h1…) s'empilent verticalement, chacun sur sa ligne ; les éléments en ligne (span, a, strong…) se suivent dans la ligne de texte et passent à la ligne quand il n'y a plus de place. La position de chaque élément dépend de ceux qui le précèdent. Un élément retiré du flux (absolute, fixed, float) ne laisse plus de place : les autres se resserrent.

position: relative

L'élément est décalé depuis sa place normale par top, right, bottom ou left, mais sa place d'origine reste réservée : les voisins ne bougent pas. Il sert surtout de repère pour des enfants positionnés en absolute.

relatif.css
.decale {
  position: relative;
  top: 10px;     /* descend de 10px depuis sa place normale */
  left: 20px;    /* décalé de 20px vers la droite */
}

position: absolute

L'élément sort du flux et se place par rapport à son plus proche ancêtre positionné (c'est-à-dire dont position n'est pas static). S'il n'y en a aucun, il se place par rapport à la page entière. Le schéma classique est donc un parent relative et un enfant absolute. inset: 0 est un raccourci de top: 0; right: 0; bottom: 0; left: 0 : l'enfant remplit tout le parent.

voile.css
.conteneur {
  position: relative;       /* le repère */
}

.voile {
  position: absolute;
  inset: 0;                 /* top, right, bottom, left : 0 */
  background: rgb(0 0 0 / 50%);
}

position: fixed et sticky

Un élément fixed est placé par rapport à la fenêtre et reste là au défilement (bouton flottant, bandeau de cookies). Un élément sticky se comporte normalement jusqu'à atteindre le seuil donné par top, puis reste collé : c'est la bonne méthode pour un en-tête ou un sommaire qui suit la lecture.

fixe.css
.retour-haut {
  position: fixed;
  right: 1rem;
  bottom: 1rem;
}

.sommaire {
  position: sticky;
  top: 1rem;               /* se colle à 1rem du haut en défilant */
}

z-index : qui est au-dessus ?

Quand des éléments se chevauchent, le dernier dans le code passe devant, sauf si z-index en décide autrement : le plus grand nombre est au-dessus. z-index ne s'applique qu'aux éléments positionnés (et aux enfants d'un conteneur flex ou grid). Attention : certains éléments créent un contexte d'empilement (position avec z-index, opacity inférieure à 1, transform…), et à l'intérieur d'un tel contexte, un z-index élevé ne permet pas de passer devant un voisin du contexte parent. Si un z-index: 9999 ne suffit pas, cherche le parent qui crée le contexte.

Centrer un élément

BesoinSolution
centrer du texte ou des éléments en lignetext-align: center; sur le parent
centrer un bloc de largeur connuemargin: 0 auto; (ou margin-inline: auto)
centrer dans les deux sensFlexbox : display: flex; justify-content: center; align-items: center; sur le parent
même chose avec Griddisplay: grid; place-items: center; sur le parent
centrer un élément positionné (fenêtre modale)top: 50%; left: 50%; transform: translate(-50%, -50%);

float : à connaître, pas à utiliser pour la mise en page

float retire un élément du flux et le pousse à gauche ou à droite en faisant contourner son texte : son seul usage actuel est d'insérer une image dans un paragraphe. Dans les années 2000, on s'en servait pour faire des colonnes ; Flexbox et Grid ont remplacé cette technique. Un parent qui ne contient que des éléments flottants s'effondre (hauteur nulle) : overflow: auto ou display: flow-root sur le parent règle le problème.

Déboguer une mise en page

  • Ouvre les outils de développement (F12) et inspecte l'élément : le panneau montre sa boîte, sa position et les règles qui s'appliquent.
  • Dessine tous les contours pour voir les boîtes : * { outline: 1px solid red; } (à retirer ensuite).
  • Teste un changement à la fois, directement dans le panneau de styles.

⚠️ Erreurs fréquentes

top, left… sans position

À éviter
faux.css
.boite { top: 20px; left: 20px; }   /* position: static : sans effet */
Correct
correct.css
.boite { position: relative; top: 20px; left: 20px; }

Un absolute sans parent positionné

L'élément s'accroche alors à la page entière et se retrouve loin du parent voulu. Ajoute position: relative au parent qui doit servir de repère.

z-index sans position

Un z-index sur un élément static est ignoré. Donne-lui position: relative (sans décalage) pour qu'il compte.

Un en-tête fixe qui cache le début du contenu

Un élément fixed sort du flux : le contenu remonte et passe dessous. Ajoute un padding-top égal à la hauteur de l'en-tête, ou préfère sticky qui garde sa place.

sticky qui ne colle pas

Il faut un seuil (top: 0) et aucun ancêtre avec overflow: hidden ou auto, qui devient alors le conteneur de défilement. Vérifie aussi que le parent est plus haut que l'élément.

Tout placer en absolute

Une page où chaque élément a des coordonnées fixes casse au moindre changement de texte ou d'écran. Réserve absolute aux éléments qui flottent au-dessus du contenu, et utilise Flexbox ou Grid pour la disposition.

📋 Aide-mémoire

  • static (défaut), relative (décalé, place gardée), absolute (hors flux, repère = ancêtre positionné), fixed (repère = fenêtre), sticky (se colle).
  • top, right, bottom, left, inset : sans effet sur static ; schéma classique : parent relative + enfant absolute.
  • z-index : seulement sur les éléments positionnés ; attention aux contextes d'empilement.
  • Centrer : text-align: center (texte), margin: 0 auto (bloc), Flexbox ou place-items: center (Grid), translate(-50%, -50%) (positionné).
  • float : uniquement pour entourer une image de texte ; la mise en page se fait avec Flexbox et Grid.
  • Inspecter avec F12 et dessiner les contours (outline) pour comprendre.