Adloun

Positionnement et empilement

Cours · CSS : mettre en forme le Web (école d'ingénieur), chapitre 6 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun

Les cartes de la Librairie du Campus sont prêtes, mais la page reste un empilement sage de boîtes, chacune sous la précédente. Un vrai site fait autrement : l'en-tête reste visible quand on fait défiler la page, une pastille « Nouveauté » est posée sur le coin d'une carte, une fenêtre de confirmation recouvre la page en l'assombrissant. Dans les trois cas, une boîte quitte sa place naturelle pour se poser ailleurs, parfois par-dessus les autres.

C'est le rôle de la propriété position, et de son inséparable compagne z-index, qui règle l'ordre d'empilement. Ce chapitre les explique avec des coordonnées mesurées, puis traite des flottants, à leur juste place : habiller une image de texte, et rien d'autre.

Objectifs du chapitre

  • Rappeler les règles du flux normal, que le positionnement permet de quitter.
  • Utiliser les cinq valeurs de position et les propriétés top, right, bottom, left et inset.
  • Trouver le bloc conteneur d'une boîte positionnée et calculer ses coordonnées.
  • Comprendre les contextes d'empilement, et pourquoi z-index: 9999 ne suffit pas toujours.
  • Habiller une image avec float et contenir le flottant avec display: flow-root.
  • Choisir une technique de centrage.

6.1 Le flux normal

Sans indication particulière, le navigateur place les boîtes selon le flux normal, que le chapitre 5 a décrit :

Le flux normal est le bon choix par défaut. Il s'adapte tout seul à la largeur de la fenêtre, à la taille du texte, à la longueur des traductions. Le positionnement sert à des cas précis ; Flexbox et Grid (chapitres suivants) servent à disposer des groupes de boîtes. Jamais on ne construit la mise en page d'un site en positionnant chaque boîte à des coordonnées fixes.

Définition 6.1Positionnement

La propriété position vaut static (valeur initiale : la boîte suit le flux normal), relative, absolute, fixed ou sticky. Une boîte dont la position n'est pas static est dite positionnée. Les propriétés de décalage top, right, bottom et left ne s'appliquent qu'aux boîtes positionnées ; inset est leur raccourci (haut, droite, bas, gauche, comme pour margin).

6.2 position: relative


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

body {
  margin: 16px;
  font-family: system-ui, sans-serif;
}

.boite {
  width: 200px;
  height: 50px;
  padding: 8px;
  margin-bottom: 10px;
  background: #dbe4f0;
  border: 2px solid #1f3a68;
}

.decalee {
  position: relative;
  top: 20px;
  left: 40px;
  background: #f3dcc4;
}

Illustration

La deuxième boîte devrait commencer, dans le flux normal, à l'abscisse 16 et à l'ordonnée . Chromium la place en : décalée de 40 pixels vers la droite et de 20 vers le bas. La troisième boîte, elle, commence à l'ordonnée 136, exactement comme si la deuxième n'avait pas bougé ; d'où le chevauchement.

Proposition 6.2Position relative

Une boîte en position: relative est d'abord placée dans le flux normal, où elle garde sa place, puis dessinée décalée de cette place : top: 20px l'éloigne de 20 pixels de son bord haut, donc la descend ; left: 40px la pousse vers la droite. Les autres boîtes ne voient pas le décalage.

On décale rarement une boîte de cette façon. L'usage principal de position: relative est ailleurs, sans aucun décalage : faire de la boîte la référence de ses descendants positionnés en absolu.

6.3 position: absolute et le bloc conteneur


<p>Un paragraphe avant le cadre.</p>
<div class="cadre">
  <p>Le cadre est positionné (relative) : il sert de référence.</p>
  <span class="pastille">Nouveau</span>
</div>
<span class="egaree">Sans ancêtre positionné</span>

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

body {
  margin: 16px;
  font-family: system-ui, sans-serif;
}

.cadre {
  position: relative;
  width: 400px;
  height: 120px;
  padding: 12px;
  margin-left: 40px;
  border: 4px solid #1f3a68;
}

.pastille {
  position: absolute;
  top: 10px;
  right: 10px;
  padding: 2px 8px;
  color: #fff;
  background: #1f3a68;
}

.egaree {
  position: absolute;
  right: 0;
  bottom: 0;
  padding: 2px 8px;
  background: #f3dcc4;
}

Illustration

Définition 6.3Bloc conteneur d'une boîte absolue

Une boîte en position: absolute est retirée du flux : elle n'occupe plus de place, les autres boîtes se placent comme si elle n'existait pas. Ses décalages se mesurent par rapport à son bloc conteneur, qui est la boîte de rembourrage (bordure exclue) de son plus proche ancêtre positionné. S'il n'y en a aucun, c'est le bloc conteneur initial, un rectangle de la taille de la fenêtre placé en haut de la page.

Vérifions les coordonnées dans Chromium, fenêtre de 800 sur 600 :

Remarquez que la pastille recouvre le texte du cadre : retirée du flux, elle ne réserve aucune place. C'est à l'auteur de prévoir l'espace, par exemple avec un rembourrage du cadre.

Proposition 6.4Taille d'une boîte absolue

Une boîte absolue sans largeur prend la largeur de son contenu (elle « rétrécit »). Si l'on fixe à la fois left et right (ou inset: 0), elle s'étire entre les deux. Une boîte inline devient un bloc dès qu'elle est positionnée en absolu : le <span> accepte alors padding et dimensions.

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 →