Chapitre 5 : Anatomie du Box Model : margin, border, padding et content
Calcul des dimensions réelles d'un élément via les propriétés de boîte
En CSS, il est fondamental de comprendre que le navigateur ne voit pas vos éléments comme des textes, des images ou des boutons, mais comme des boîtes rectangulaires. C'est ce qu'on appelle le Box Model (Modèle de Boîte).
Maîtriser ce concept est la différence entre un développeur qui "tente des choses au hasard" jusqu'à ce que l'élément soit placé au bon endroit, et un développeur qui contrôle précisément chaque pixel de son interface.
Le Concept du Box Model
1. Quoi
Le Box Model est la structure fondamentale qui définit comment la taille d'un élément est calculée et comment il interagit avec ses voisins. Chaque élément HTML est encapsulé dans une boîte composée de quatre couches concentriques :
- Le Content (Contenu) : C'est le cœur de la boîte. C'est ici que se trouve le texte, l'image ou tout autre élément enfant. Ses dimensions sont contrôlées par
widthetheight. - Le Padding (Remplissage) : Une zone d'espace vide située entre le contenu et la bordure. Le padding est transparent et prend la couleur de fond de l'élément.
- La Border (Bordure) : Une ligne qui entoure le padding et le contenu. Elle peut avoir une épaisseur, un style et une couleur.
- La Margin (Marge externe) : L'espace vide situé à l'extérieur de la bordure. Elle sert à créer de la distance entre l'élément et les autres éléments environnants. La marge est toujours transparente.
2. Pourquoi
Dans un projet professionnel, le Box Model est utilisé pour :
- Aérer le contenu : Éviter que le texte ne colle aux bords d'un bouton ou d'une carte (via le
padding). - Structurer l'espacement : Créer des gouttières cohérentes entre les colonnes d'une grille (via la
margin). - Définir des limites visuelles : Encadrer des sections pour améliorer la hiérarchie visuelle (via la
border). - Prédire le rendu : Calculer exactement combien de place un élément occupera dans la page pour éviter les retours à la ligne inattendus.
3. Comment
A. Syntaxe de base
Chacune de ces propriétés peut être définie de manière globale ou pour chaque côté (top, right, bottom, left).
.box {
width: 300px;
height: 200px;
padding: 1rem 1.5rem /* 1rem en haut/bas et 1.5rem à gauche/droite */
border: 5px solid; /* 5px d'épaisseur sur les 4 côtés */
margin: 1rem; /* 1rem sur les 4 côtés */
}
B. Cas concret : Création d'une carte de produit
Voici comment on utilise les quatre couches pour créer un composant "Card" professionnel.
.product-card {
/* 1. Content : On définit la largeur de la zone de contenu */
width: 300px;
/* 2. Padding : On crée un espace interne pour que le texte
ne touche pas les bords de la carte */
padding: 1.5rem;
/* 3. Border : On ajoute un contour léger pour séparer la carte du fond */
border: 1px solid #e0e0e0;
border-radius: 8px; /* Arrondit les angles de la border */
/* 4. Margin : On s'assure que les cartes ne se collent pas
entre elles si elles sont côte à côte */
margin: 1rem;
background-color: #ffffff;
/* Ombre portée : décalage X=0, décalage Y=4px (vers le bas), flou=6px, couleur noire à 10% d'opacité */
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
C. Limitations et pièges
Le piège principal pour un débutant est la somme des dimensions. Par défaut, en CSS, si vous donnez une width de 300px et un padding de 20px, la largeur totale réelle de l'élément sur l'écran sera de 340px (300 + 20 gauche + 20 droite). Cela peut casser vos mises en page.
4. Zone de Danger
❌ Erreur commune : Utiliser la margin pour créer de l'espace à l'intérieur d'un élément (par exemple, pour décoller du texte d'un bord de bouton).
✅ Bonne pratique : Utiliser le padding pour l'espace interne et la margin pour l'espace externe.
❌ Erreur commune : Oublier que la border s'ajoute également à la largeur totale.
✅ Bonne pratique : Utiliser la propriété box-sizing: border-box (voir section suivante) pour simplifier les calculs.
Hiérarchie du Box Model CSS
Le Calcul des Dimensions : Content-box vs Border-box
C'est ici que se joue la majorité des bugs de mise en page pour les juniors. Il existe deux modèles de calcul de taille, définis par la propriété box-sizing.
1. box-sizing: content-box (Le mode par défaut)
C'est le comportement historique du web. La width et la height ne s'appliquent qu'au contenu. Le padding et la bordure s'ajoutent en plus.
Formule de calcul de la largeur totale :
Largeur Totale = width + padding-left + padding-right + border-left-width + border-right-width
Exemple :
.box-default {
box-sizing: content-box;
width: 200px;
padding: 20px;
border: 10px solid black;
}
/* Largeur réelle = 200 + 20 + 20 + 10 + 10 = 260px */
2. box-sizing: border-box (Le mode moderne)
C'est le mode utilisé par presque tous les frameworks modernes (Bootstrap, Tailwind) et la majorité des développeurs. Ici, la width et la height représentent la taille totale de la boîte, bordures et padding inclus. Le navigateur "rétrécit" automatiquement la zone de contenu pour faire de la place au padding et à la bordure.
Formule de calcul de la largeur totale :
Largeur Totale = width
Exemple :
.box-modern {
box-sizing: border-box;
width: 200px;
padding: 20px;
border: 10px solid black;
}
/* Largeur réelle = 200px.
Le contenu réel sera de : 200 - 20 - 20 - 10 - 10 = 140px */
Pourquoi utiliser border-box partout ?
Imaginez que vous vouliez deux colonnes de 50% de largeur. Si vous ajoutez un simple padding: 10px ou une border, vos colonnes dépasseront 100% (50% + 50% + padding) et la deuxième colonne sautera à la ligne. Avec border-box, vos colonnes resteront exactement à 50% peu importe le padding ajouté.
Astuce de pro : On applique généralement ce réglage à tous les éléments du site via un "reset" CSS :
*, *::before, *::after {
box-sizing: border-box;
}
La Marge et le Phénomène de "Collapse"
La marge (margin) est particulière car elle gère l'espace entre les éléments. Cependant, elle possède un comportement déroutant appelé le Margin Collapse (Fusion des marges).
1. Qu'est-ce que le Margin Collapse ?
Le Margin Collapse se produit principalement sur les marges verticales (haut et bas). Lorsque deux marges verticales se rencontrent, elles ne s'additionnent pas. Au lieu de cela, la marge la plus grande "absorbe" la plus petite.
Exemple :
- Élément A a une
margin-bottom: 30px. - Élément B a une
margin-top: 20px. - L'espace entre A et B ne sera pas de
50px, mais de30px(la valeur maximale).
2. Quand cela arrive-t-il ?
Le collapse se produit dans trois cas principaux :
- Entre deux éléments adjacents (le cas décrit ci-dessus).
- Entre un parent et son premier/dernier enfant (si le parent n'a pas de bordure ou de padding pour "bloquer" la marge).
- Sur des éléments vides qui n'ont ni bordure ni padding.
3. Comment l'éviter ?
Si vous voulez absolument que les marges s'additionnent ou éviter que la marge d'un enfant ne "sorte" du parent :
- Ajoutez un
padding(même de1px) au parent. - Ajoutez une
borderau parent. - Utilisez
overflow: hiddenoudisplay: flow-rootsur le parent.
Questions clés
Q1 : Quelle est la différence fondamentale entre padding et margin ?
Découvrir la réponse
Le padding est l'espace intérieur (entre le contenu et la bordure), il est affecté par la couleur de fond de l'élément. La margin est l'espace extérieur (entre la bordure et les autres éléments), elle est toujours transparente.
Q2 : Pourquoi mon élément fait-il 240px alors que j'ai écrit width: 200px ?
Découvrir la réponse
C'est probablement parce que vous êtes en box-sizing: content-box (par défaut) et que vous avez ajouté du padding ou des bordures. Le navigateur additionne ces valeurs à la largeur du contenu.
Q3 : Comment forcer un élément à occuper exactement la largeur définie, padding inclus ?
Découvrir la réponse
Il faut utiliser la propriété box-sizing: border-box;.
Q4 : Est-ce que le Margin Collapse fonctionne pour les marges gauche et droite ?
Découvrir la réponse
Non. Le collapse ne concerne que les marges verticales (top et bottom). Les marges horizontales s'additionnent toujours normalement.
Q5 : Si je mets un padding: 20px sur un élément avec un fond rouge, quelle sera la couleur de la zone de padding ?
Découvrir la réponse
Elle sera rouge. Le padding fait partie de l'intérieur de l'élément, contrairement à la marge qui est à l'extérieur.
Mise en pratique
Exercice 1 : Reproduction guidée
Objectif : Créer un bouton avec un espacement interne précis.
- Créez un élément
<a>ou<button>. - Donnez-lui une couleur de fond bleue et un texte blanc.
- Appliquez un
paddingde10pxen haut/bas et20pxà gauche/droite. - Ajoutez une bordure de
3pxsolide de couleur bleu foncé. - Observez comment le texte est "poussé" vers l'intérieur.
Découvrir la solution commentée
.btn-custom {
display: inline-block;
background-color: #3498db;
color: white;
text-decoration: none;
/* Padding : 10px vertical, 20px horizontal */
padding: 10px 20px;
/* Border : épaisseur, style, couleur */
border: 3px solid #2980b9;
/* On utilise border-box pour que le bouton
ne change pas de taille si on modifie le padding */
box-sizing: border-box;
border-radius: 4px;
font-family: sans-serif;
}
Exercice 2 : Adaptation et Calcul
Objectif : Prédire et corriger la taille d'un élément.
On vous donne le code suivant :
.card {
width: 300px;
padding: 25px;
border: 5px solid black;
box-sizing: content-box;
}
- Quelle est la largeur totale réelle de cet élément sur la page ?
- Modifiez le code pour que la largeur totale soit exactement de
300pxsans changer les valeurs de padding ou de border.
Découvrir la solution commentée
Réponse 1 :
Largeur = 300 (width) + 25 (padding-left) + 25 (padding-right) + 5 (border-left) + 5 (border-right) = 360px.
Réponse 2 : Il suffit de changer le modèle de boîte.
.card {
width: 300px;
padding: 25px;
border: 5px solid black;
/* On passe en border-box pour inclure
le padding et la border dans les 300px */
box-sizing: border-box;
}
Exercice 3 : Conception de Layout
Objectif : Gérer l'espacement d'une liste de messages.
Vous devez créer une interface de chat. Chaque message doit :
- Avoir un fond gris clair.
- Avoir un espace interne pour que le texte ne touche pas les bords.
- Avoir un espace entre chaque message pour qu'ils ne soient pas collés.
- Ne pas déborder de son conteneur parent (largeur
100%).
Bonus (optionnel) : Vous remarquerez qu'un espace inutile apparaît en bas du conteneur après le dernier message. Cherchez dans la documentation CSS comment cibler uniquement le dernier enfant d'un élément pour lui supprimer cette marge.
Regardez du côté des pseudo-classes et de :last-child.
Découvrir la solution commentée
/* Reset global indispensable pour le layout */
* {
box-sizing: border-box;
}
.chat-container {
width: 400px;
border: 1px solid #ccc;
padding: 10px;
}
.message {
background-color: #f1f1f1;
width: 100%; /* Occupe toute la largeur du parent */
/* Padding : espace interne pour le confort de lecture */
padding: 12px;
/* Margin : espace externe pour séparer les messages */
margin-bottom: 15px;
border-radius: 8px;
font-family: Arial, sans-serif;
}
/* On retire la marge du dernier message pour
éviter un espace inutile en bas du container */
.message:last-child {
margin-bottom: 0;
}