Comprendre et maîtriser toutes les unités
Formation DWWM - 2025-2026
Pourquoi plusieurs unités ?
| Famille | Unités | Principe |
|---|---|---|
| Absolues | px, cm, mm, pt, in | Taille fixe qui ne change pas |
| Relatives | %, em, rem, vw, vh, vmin, vmax | Taille qui s'adapte au contexte |
| Unité | Se base sur | Usage typique |
|---|---|---|
| px | Rien (fixe) | Bordures, détails précis |
| % | Taille du parent | Largeurs, layouts |
| em | Font-size du parent | Espacements dans composants |
| rem | Font-size de <html> | Tailles de texte, espacements globaux |
| vw / vh | Taille de l'écran | Sections plein écran |
L'unité absolue
/* Tout est en pixels */
.box {
width: 300px;
height: 200px;
font-size: 16px;
padding: 20px;
margin: 10px;
border: 2px solid black;
}
/* Ces dimensions sont FIXES
Elles ne changeront jamais */
width: 300px = "Largeur de exactement 300 pixels"Éléments en pixels (fixes) :
👆 Redimensionnez le navigateur → Les tailles restent identiques !
width: 100px → 100 unités CSSborder: 1px solidbox-shadow: 0 2px 4pxborder-radius: 8pxRelatif au parent
width: 50% = 50% de la largeur du parentheight: 100% = 100% de la hauteur du parent
width: 25% = Je prends 1/4 du gâteauwidth: 50% = Je prends la moitiéwidth: 100% = Je prends tout !<div class="parent" style="width: 800px;">
<div class="enfant" style="width: 50%;">
Je fais 50% de 800px = 400px
</div>
</div>
/* Le parent définit la référence */
.parent {
width: 800px;
}
/* L'enfant prend un % du parent */
.enfant {
width: 50%; /* 50% de 800px = 400px */
height: 100%; /* 100% de la hauteur du parent */
}
Parent container
👆 Redimensionnez → Tout s'adapte proportionnellement !
| Propriété | % calculé sur | Exemple |
|---|---|---|
| width | Largeur du parent | Parent 800px → 50% = 400px |
| height | Hauteur du parent | Parent 600px → 50% = 300px |
| padding | Largeur du parent (!) | Parent 800px → 5% = 40px |
| margin | Largeur du parent (!) | Parent 800px → 10% = 80px |
| font-size | Font-size du parent | Parent 16px → 150% = 24px |
padding-top et padding-bottom/* ❌ Ceci ne marche souvent PAS */
.element {
height: 100%; /* 100% de quoi ??? */
}
/* Pour que ça marche, le parent doit avoir une hauteur */
html, body {
height: 100%;
}
.parent {
height: 100%;
}
.element {
height: 100%; /* Maintenant ça marche ! */
}
height: 100% ne fonctionne que si le parent a une hauteur définie !width: 100%/* Exemple : Layout 3 colonnes */
.col-1 { width: 33.33%; float: left; }
.col-2 { width: 33.33%; float: left; }
.col-3 { width: 33.34%; float: left; }
/* Image responsive */
img {
width: 100%;
height: auto;
}
Relatif au font-size du parent
font-size: 20px1em = 20px2em = 40px0.5em = 10px
height: 1em = "Je mesure comme papa" = 1m80height: 0.5em = "Je mesure la moitié de papa" = 90cmheight: 2em = "Je mesure 2× papa" = 3m60<div class="parent" style="font-size: 20px;">
<div class="enfant" style="font-size: 1.5em;">
Ma taille = 1.5 × 20px = 30px
</div>
</div>
/* Le parent définit la base */
.parent {
font-size: 20px;
}
/* L'enfant utilise em */
.enfant {
font-size: 1.5em; /* 1.5 × 20px = 30px */
padding: 1em; /* 1 × 30px = 30px (!) */
margin: 0.5em; /* 0.5 × 30px = 15px */
}
padding et margin, le em<div style="font-size: 16px;"> <!-- 16px -->
<div style="font-size: 1.2em;"> <!-- 1.2 × 16 = 19.2px -->
<div style="font-size: 1.2em;"> <!-- 1.2 × 19.2 = 23px -->
<div style="font-size: 1.2em;"> <!-- 1.2 × 23 = 27.6px -->
Ça grossit de plus en plus !
</div>
</div>
</div>
</div>
em se multiplient en cascade !rem pour éviter ce problème !
⚠️ Ça grossit vite !
/* Bouton qui s'adapte à sa taille de texte */
.btn {
font-size: 16px;
padding: 0.5em 1em; /* S'adapte au font-size */
border-radius: 0.25em; /* Proportionnel aussi */
}
.btn-large {
font-size: 24px;
/* Le padding et border-radius s'adaptent auto ! */
}
.btn-small {
font-size: 12px;
/* Tout reste proportionnel */
}
Relatif au root (racine)
1rem = 16pxfont-size: 1rem = "Comme le roi l'a décidé"padding: 2rem = "2× la mesure du roi"/* On définit la taille racine */
html {
font-size: 16px; /* 1rem = 16px */
}
/* Partout dans le site */
h1 {
font-size: 2.5rem; /* 2.5 × 16px = 40px */
}
h2 {
font-size: 2rem; /* 2 × 16px = 32px */
}
p {
font-size: 1rem; /* 1 × 16px = 16px */
margin-bottom: 1rem; /* 16px */
}
.card {
padding: 1.5rem; /* 24px */
margin: 2rem; /* 32px */
}
1rem vaut toujours la même chose
| Critère | em | rem |
|---|---|---|
| Référence | Font-size du parent | Font-size de <html> |
| Cascade | ✅ Oui (multiplicatif) | ❌ Non (stable) |
| Prévisibilité | Difficile (dépend du contexte) | Facile (toujours pareil) |
| Usage | Composants locaux | Architecture globale |
<div style="font-size: 20px;">
<p style="font-size: 1em;">20px (em)</p>
<p style="font-size: 1rem;">16px (rem)</p>
</div>
/* Technique pour simplifier les calculs */
html {
font-size: 62.5%; /* 62.5% de 16px = 10px */
}
/* Maintenant 1rem = 10px ! */
body {
font-size: 1.6rem; /* 16px */
}
h1 {
font-size: 3.2rem; /* 32px */
}
h2 {
font-size: 2.4rem; /* 24px */
}
p {
font-size: 1.4rem; /* 14px */
margin: 2rem; /* 20px */
}
/* Calculs mentaux plus faciles ! */
1.6rem = 16px, 2.4rem = 24px, etc.font-size: 16px reste 16px même si l'utilisateur zoom/* Architecture moderne */
html {
font-size: 16px;
}
/* Tout en rem */
body {
font-size: 1rem;
line-height: 1.5;
}
.container {
max-width: 80rem; /* 1280px */
padding: 2rem; /* 32px */
margin: 0 auto;
}
.section {
margin-bottom: 4rem; /* 64px */
}
rem partout sauf pour les petits détails (bordures...)
Relatif à la taille de l'écran
1vw = 1% de la largeur de l'écran100vw = toute la largeur1vh = 1% de la hauteur de l'écran100vh = toute la hauteur
width: 100vw = "Aussi large que la fenêtre"height: 100vh = "Aussi haut que la fenêtre"width: 50vw = "La moitié de large"/* Section plein écran */
.hero {
width: 100vw; /* Toute la largeur */
height: 100vh; /* Toute la hauteur */
}
/* Titre responsive */
h1 {
font-size: 5vw; /* 5% de la largeur de l'écran */
/* Sur 1920px → 96px
Sur 375px → 18.75px */
}
/* Sidebar proportionnelle */
.sidebar {
width: 20vw; /* Toujours 20% de l'écran */
}
/* Centrage */
.box {
width: 50vw;
height: 50vh;
margin-left: 25vw;
margin-top: 25vh;
}
Éléments en vw/vh :
👆 Redimensionnez la fenêtre → S'adapte en direct !
100vw inclut la barre de défilement (scrollbar) !/* ❌ PROBLÈME */
.section {
width: 100vw; /* Déborde à cause de la scrollbar */
}
/* ✅ SOLUTION 1 : Utiliser 100% */
.section {
width: 100%; /* S'adapte sans déborder */
}
/* ✅ SOLUTION 2 : Cacher le débordement */
body {
overflow-x: hidden;
}
.section {
width: 100vw;
}
| Unité | Signification | Calcul |
|---|---|---|
| vw | Viewport Width | 1% de la largeur |
| vh | Viewport Height | 1% de la hauteur |
| vmin | Minimum | 1% du PLUS PETIT côté |
| vmax | Maximum | 1% du PLUS GRAND côté |
/* vmin : garde les proportions */
.square {
width: 50vmin;
height: 50vmin;
/* Reste carré sur tous les écrans ! */
}
.text {
font-size: 5vmin;
/* Lisible sur mobile ET desktop */
}
height: 100vhfont-size: 5vwwidth: 20vw/* Hero plein écran */
.hero {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* Titre fluide avec limites */
h1 {
font-size: clamp(2rem, 5vw, 5rem);
/* Min 2rem, idéal 5vw, max 5rem */
}
ch, vmin, vmax...
/* Largeur optimale pour la lecture */
p {
max-width: 60ch;
/* Maximum 60 caractères par ligne */
}
.article {
max-width: 70ch;
margin: 0 auto;
/* Texte centré et lisible */
}
input {
width: 20ch;
/* Largeur de 20 caractères */
}
max-width: 60ch est parfait !
| Unité | Type | Se base sur | Usage |
|---|---|---|---|
| px | Absolu | Rien (fixe) | Bordures, détails |
| % | Relatif | Taille du parent | Layouts, colonnes |
| em | Relatif | Font-size du parent | Composants locaux |
| rem | Relatif | Font-size racine | Architecture globale |
| vw | Relatif | Largeur écran | Largeurs fluides |
| vh | Relatif | Hauteur écran | Sections plein écran |
| vmin | Relatif | Plus petit côté | Éléments carrés |
| vmax | Relatif | Plus grand côté | Texte adaptatif |
| ch | Relatif | Largeur du "0" | Largeur de texte |
| Unité | Nom | Usage |
|---|---|---|
| cm | Centimètres | Print CSS uniquement |
| mm | Millimètres | Print CSS uniquement |
| in | Inches (pouces) | Print CSS uniquement |
| pt | Points (1/72 pouce) | Print CSS, documents |
Quelle unité choisir ?
| Unité | ✅ Avantage | ❌ Inconvénient | Verdict |
|---|---|---|---|
| px | Précis | Pas accessible | ❌ À éviter |
| em | Contextuel | Effet cascade | ⚠️ Rare |
| rem | Accessible, stable | Aucun | ✅ IDÉAL |
| vw | Fluide | Besoin limites | ✅ Avec clamp() |
/* ✅ RECOMMANDÉ */
html {
font-size: 16px;
}
body { font-size: 1rem; }
h1 { font-size: 2.5rem; }
h2 { font-size: 2rem; }
/* Avec fluidité */
h1 {
font-size: clamp(2rem, 5vw, 4rem);
}
| Contexte | Unité | Exemple |
|---|---|---|
| Container principal | % + max-width | width: 100%; max-width: 1200px; |
| Colonnes layout | % | width: 33.33%; |
| Hero section | vh | height: 100vh; |
| Composant fixe | px ou rem | width: 300px; |
| Image responsive | % | width: 100%; height: auto; |
rem pour la cohérence globale
/* Système d'espacement avec rem */
.space-xs { margin: 0.25rem; } /* 4px */
.space-sm { margin: 0.5rem; } /* 8px */
.space-md { margin: 1rem; } /* 16px */
.space-lg { margin: 2rem; } /* 32px */
.space-xl { margin: 4rem; } /* 64px */
/* OU avec em pour composants */
.btn {
padding: 0.5em 1em;
/* S'adapte au font-size du bouton */
}
/* ❌ Évitez px */
.container {
margin: 20px; /* Pas accessible */
}
/* ✅ EXCELLENT : Mix intelligent */
.card {
/* Largeur fluide avec limite */
width: 100%;
max-width: 400px;
/* Espacement cohérent */
padding: 2rem;
margin: 1rem;
/* Détails précis */
border: 1px solid #ddd;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
/* Typographie accessible */
font-size: 1rem;
}
/* Hero moderne */
.hero {
height: 100vh;
padding: 4rem 2rem;
}
.hero h1 {
font-size: clamp(2rem, 5vw, 5rem);
margin-bottom: 2rem;
}
Exemples concrets
/* Tout en rem */
html {
font-size: 16px;
}
body {
font-size: 1rem;
line-height: 1.5;
}
/* Échelle de titres */
h1 { font-size: 3rem; } /* 48px */
h2 { font-size: 2.25rem; } /* 36px */
h3 { font-size: 1.75rem; } /* 28px */
h4 { font-size: 1.5rem; } /* 24px */
h5 { font-size: 1.25rem; } /* 20px */
h6 { font-size: 1rem; } /* 16px */
/* Variantes */
.text-sm { font-size: 0.875rem; } /* 14px */
.text-xs { font-size: 0.75rem; } /* 12px */
/* Responsive */
h1 {
font-size: clamp(2rem, 5vw, 3rem);
}
/* Container fluide */
.container {
width: 100%;
max-width: 1200px;
margin: 0 auto;
padding: 0 2rem;
}
/* Grid adaptatif */
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}
/* Layout sidebar + content */
.layout {
display: flex;
gap: 2rem;
}
.sidebar {
width: 25%;
min-width: 250px;
}
.content {
flex: 1;
}
@media (max-width: 768px) {
.layout {
flex-direction: column;
}
.sidebar {
width: 100%;
}
}
/* Bouton adaptatif */
.btn {
/* Typo */
font-size: 1rem;
font-weight: 600;
/* Espacement proportionnel */
padding: 0.75em 1.5em;
/* Détails */
border: 2px solid transparent;
border-radius: 0.5rem;
/* Transitions */
transition: all 0.3s;
cursor: pointer;
}
/* Variantes de taille */
.btn-sm {
font-size: 0.875rem;
/* padding s'adapte automatiquement ! */
}
.btn-lg {
font-size: 1.25rem;
/* padding s'adapte automatiquement ! */
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
/* Hero plein écran */
.hero {
min-height: 100vh;
padding: 4rem 2rem;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
}
.hero h1 {
font-size: clamp(2.5rem, 6vw, 5rem);
margin-bottom: 1.5rem;
max-width: 20ch;
}
.hero p {
font-size: clamp(1rem, 2vw, 1.25rem);
max-width: 60ch;
margin-bottom: 2rem;
}
@media (max-width: 768px) {
.hero {
min-height: 80vh;
padding: 2rem 1rem;
}
}
/* Variables CSS pour spacing */
:root {
--space-xs: 0.25rem; /* 4px */
--space-sm: 0.5rem; /* 8px */
--space-md: 1rem; /* 16px */
--space-lg: 1.5rem; /* 24px */
--space-xl: 2rem; /* 32px */
--space-2xl: 3rem; /* 48px */
--space-3xl: 4rem; /* 64px */
}
/* Classes utilitaires */
.m-xs { margin: var(--space-xs); }
.m-sm { margin: var(--space-sm); }
.m-md { margin: var(--space-md); }
.m-lg { margin: var(--space-lg); }
.p-xs { padding: var(--space-xs); }
.p-sm { padding: var(--space-sm); }
.p-md { padding: var(--space-md); }
.p-lg { padding: var(--space-lg); }
/* Usage */
.card {
padding: var(--space-lg);
margin-bottom: var(--space-md);
}
/* Pas responsive ni accessible */
p { font-size: 16px; }
.container { width: 1200px; }
/* Tailles imprévisibles */
.parent { font-size: 1.2em; }
.child { font-size: 1.2em; } /* 1.44× ! */
/* Trop petit mobile, trop gros desktop */
p { font-size: 3vw; }
remremem% + max-widthvhpxrem partout + px pour les détails + % pour les layoutsVous maîtrisez les unités CSS ! 🎯
📏 N'oubliez pas de pratiquer !
Créez un système de design avec rem
et testez sur différents écrans ! 💪