En une phrase
Les unités CSS sont le langage qu'on utilise pour dire à un navigateur comment dimensionner les éléments d'une page web, décidant si les tailles sont fixes comme le roc ou fluides comme l'eau.
Le problème que ça résout
À l'aube du web, baignée de modems 56k, la vie était simple. Les développeurs concevaient des sites pour une seule et glorieuse résolution d'écran — peut-être du 800x600, ou du 1024x768 si vous étiez vraiment à la pointe. Le roi incontesté de cette époque était le pixel (px). C'était un pacte avec l'univers : un px dans votre code correspondait à un pixel de lumière sur l'écran. Les mises en page étaient prévisibles, bien que fragiles.
Puis est arrivée l'explosion cambrienne des appareils. L'iPhone. Android. Les tablettes. Les ordinateurs portables aux bords ultra-fins. Les écrans 4K géants. Les montres connectées. Soudain, ce site de 960px de large était devenu un timbre-poste sur un écran immense et un cauchemar impossible à naviguer, avec un défilement horizontal sur un téléphone. Le règne de la certitude du pixel était terminé. Le royaume était en plein chaos.
Ce chaos a donné naissance au « Responsive Web Design », l'idée qu'un site web devrait s'adapter avec grâce à n'importe quel écran sur lequel il est consulté. Pour y parvenir, nous avions besoin d'un nouveau vocabulaire de tailles — un qui ne reposait pas sur des mesures absolues et fixes, mais sur des relations.
C'est le problème que les unités CSS résolvent. Elles fournissent une riche boîte à outils d'unités relatives (rem, em, %, vw, vh) qui nous permettent de construire des interfaces flexibles, évolutives et véritablement responsives. Au lieu de dire à une boîte « fais 500 pixels de large », nous pouvons maintenant dire « fais 80% de la largeur de ton parent », ou « que la taille de ton texte soit 1,5 fois la taille de police de base préférée de l'utilisateur ». C'est un passage d'ordres rigides à l'établissement de règles intelligentes.
Comment ça marche en coulisses
Pour vraiment piger le truc, il faut diviser les unités en quelques camps conceptuels. Tout dépend de ce que chaque unité utilise comme source de vérité.
Les Unités Absolues : Les maîtres-étalons immuables
Ces unités sont fixes. Elles se fichent de l'élément parent, de la taille de l'écran ou de quoi que ce soit d'autre. Elles sont ce qu'elles sont.
px(Pixel) : Celui que vous connaissez et adorez. Mais voilà le twist : unpxen CSS n'est plus un pixel physique de votre écran ! Les écrans haute résolution (comme les écrans Retina d'Apple) regroupent plusieurs pixels physiques dans l'espace d'un seul « pixel CSS ». La spécification définit 1px comme 1/96e de pouce. Cette abstraction permet à une bordure de1pxd'avoir à peu près la même épaisseur sur des appareils de densités de pixels différentes. C'est l'unité la plus courante pour les choses que vous voulez garder fixes, comme unborder-widthou le décalage d'unbox-shadow.pt(Point) : Un fantôme du monde de l'imprimerie. En typographie, 1 point équivaut à 1/72e de pouce. Il n'est presque jamais utilisé pour le style à l'écran car il ne s'aligne pas avec la grille de pixels, mais vous pourriez le voir dans des feuilles de style spécifiques à l'impression d'une page web.
Les Unités relatives à la police : La mise à l'échelle avec le texte
Ces unités sont géniales pour créer des interfaces utilisateur évolutives où l'espacement et la taille des éléments augmentent ou diminuent en même temps que la taille du texte.
em: Relatif à lafont-sizede son élément parent direct. C'est à la fois sa force et sa faiblesse. Si une<div>a unefont-sizede20px, alors à l'intérieur de cette div,padding: 1.5emsera calculé comme30px. Mais si vous imbriquez un autre élément avecfont-size: 0.8emà l'intérieur de celui-ci, vous obtenez des effets cumulatifs.<div style="font-size: 20px;"> <!-- font-size is 20px --> <p style="padding: 1.5em;"> <!-- padding is 1.5 * 20px = 30px --> <strong style="font-size: 1.2em;"> <!-- font-size is 1.2 * 20px = 24px --> </strong> </p> </div>Cet enchevêtrement peut vite mener à une folie mathématique.
rem(Root Em) : Le héros dont nous avions besoin. L'unitéremest relative uniquement à lafont-sizede l'élément racine (la balise<html>). Ça élimine le problème de cumul desem. Lafont-sizepar défaut dans la plupart des navigateurs est de16px, donc par défaut,1reméquivaut à16pxpartout sur la page. Si un utilisateur modifie la taille de police par défaut de son navigateur pour des raisons d'accessibilité, toute votre mise en page basée sur lesrems'adapte avec lui, ce qui est une énorme victoire. Pour cette raison, leremest le standard moderne pour dimensionner la typographie, les paddings, les marges et la plupart des composants de mise en page.
Les Unités relatives au viewport : Le dimensionnement par la fenêtre
Ces unités sont directement liées à la taille de la fenêtre du navigateur (le « viewport »).
vw(Viewport Width) &vh(Viewport Height) : Unvwcorrespond à 1% de la largeur du viewport ; unvhcorrespond à 1% de sa hauteur.width: 50vwsignifie « fais en sorte que cet élément fasse la moitié de la largeur de la fenêtre du navigateur ». Le cas d'usage le plus classique estheight: 100vh, qui crée une section « hero » qui remplit parfaitement l'écran verticalement.%(Pourcentage) : L'unité relative originelle. Elle est toujours relative à une propriété de son élément parent.width: 50%signifie la moitié de la largeur du conteneur parent.font-size: 120%est en pratique la même chose quefont-size: 1.2em. Son comportement dépend du contexte, ce qui le rend puissant mais vous oblige à faire attention au parent.
La magie de clamp() : Le dimensionnement fluide
C'est là que tout prend son sens. clamp() est une fonction CSS qui vous permet de définir une taille qui grandit mais qui est contrainte entre une valeur minimale et maximale.
Sa syntaxe est clamp(MIN, PRÉFÉRÉ, MAX).
MIN: La valeur minimale absolue. Elle ne descendra jamais en dessous.PRÉFÉRÉ: La valeur idéale et évolutive. C'est ici que vous utilisez généralement une unité de viewport, comme2vw, souvent combinée avec une unitérem(par ex.,1rem + 2vw).MAX: La valeur maximale absolue. Elle ne dépassera jamais cette valeur.
Jetons un œil à un exemple magistral pour la typographie fluide :
font-size: clamp(1rem, 1rem + 2vw, 2.25rem);
Cette seule ligne dit au navigateur :
- « Je veux que la taille de la police soit de
1rem + 2vw. » - « Mais, si
1rem + 2vwse calcule à quelque chose de plus petit que1rem(sur un tout petit écran), utilise simplement1rem. » - « Et si
1rem + 2vwse calcule à quelque chose de plus grand que2.25rem(sur un écran immense), utilise simplement2.25rem. »
Vous obtenez un texte parfaitement fluide qui s'adapte à la taille de l'écran mais ne devient jamais illisiblement petit ou comiquement énorme, le tout sans une seule media query.
Histoires vécues
La calamiteuse cascade des em cumulés
Un développeur junior devait créer un fil de commentaires imbriqués. Voulant être un bon développeur moderne, il a utilisé des unités relatives. Il a stylé chaque commentaire avec font-size: .9em et padding: 1em pour que les réponses soient légèrement plus petites tout en conservant un padding proportionnel. La première réponse était superbe. Mais la réponse à la réponse était minuscule. Le quatrième niveau d'imbrication n'était plus qu'un flou de texte microscopique. Il venait de se faire mordre par la nature cumulative de l'unité em. Chaque niveau multipliait la taille du parent par 0.9, créant un effet de pistolet réducteur exponentiel.
La leçon : Les em se propagent en cascade. Pour une cohérence à l'échelle du site où vous ne voulez pas d'effets cumulés, rem est votre meilleur ami, prévisible et stable.
Le « Héros Pleine Hauteur » qui ne l'était pas
Un designer vous donne une magnifique maquette avec une image de fond en plein écran en haut de la page d'accueil. « Fais en sorte que ça remplisse l'écran, peu importe l'appareil », dit-il. Le développeur, pensant logiquement, applique height: 100% à la section hero. La section disparaît. Il reste bouche bée. Après une session de débogage frénétique, il apprend que height: 100% signifie 100% de la hauteur du parent. Mais l'élément parent <body> n'avait pas de hauteur définie — sa hauteur était déterminée par son contenu. 100% de « auto », ça ne fait rien du tout. Il a changé le style pour height: 100vh. Et là, magie. La section hero s'est parfaitement calée en bas du viewport sur son ordinateur portable, son téléphone et son écran géant.
La leçon : Les hauteurs en pourcentage nécessitent un parent avec une hauteur définie. Les unités de viewport (vh et vw) sont votre ligne directe et sans ambiguïté avec les dimensions de l'écran de l'utilisateur.
La quête du texte parfaitement fluide
Une équipe construisait une page d'atterrissage à fort impact. Le titre principal devait être énorme sur ordinateur mais gérable sur mobile. Leur première approche utilisait des media queries : font-size: 80px pour le bureau, 60px pour la tablette et 40px pour le mobile. Ça marchait, mais le rendu n'était pas très élégant. En redimensionnant la fenêtre du navigateur, le texte « sautait » brusquement d'une taille à l'autre aux points de rupture. Ça manquait de finesse. Puis, un développeur a découvert clamp(). Ils ont remplacé trois media queries et trois règles CSS par une seule ligne : font-size: clamp(2.5rem, 8vw, 5rem);. Le résultat était époustouflant. Le texte s'adaptait maintenant avec une fluidité parfaite au redimensionnement de la fenêtre, grandissant et rétrécissant dans un mouvement continu et fluide.
La leçon : Les media queries sont faites pour changer les mises en page, mais clamp() est fait pour créer des propriétés véritablement fluides. Il offre une expérience utilisateur plus douce et plus sophistiquée, qui semble moins « saccadée » qu'un dimensionnement basé sur des points de rupture.
Erreurs et pièges courants
- Oublier la base du
rem: Définir toutes vos tailles en unitésremsans savoir quelle est lafont-sizeracine. Une astuce courante est de définirhtml { font-size: 62.5%; }pour que1reméquivaille à un pratique10px. Si vous ne savez pas que cela a été fait, votre élément de2remfera20px, et non les32pxque vous pourriez attendre. - La confusion entre
emetrem: Utiliserempour le padding d'un composant quand vous voulez qu'il s'adapte à l'interface globale (remserait plus indiqué), ou utiliserremquand vous voulez explicitement que la taille d'une icône s'adapte à lafont-sizedu bouton dans lequel elle se trouve (emserait plus indiqué). - Unités
vwet barres de défilement : Appliquerwidth: 100vwà un élément de haut niveau est une erreur de débutant classique. La mesure100vwpeut inclure la largeur de la barre de défilement verticale, ce qui rend votre élément légèrement plus large que la zone de contenu et provoque l'apparition d'une satanée barre de défilement horizontale. - Le purisme du tout-pixel : S'en tenir religieusement aux
pxpour tout, y compris lafont-size. Cela crée des designs rigides qui ignorent les préférences d'accessibilité de l'utilisateur (comme une taille de police par défaut plus grande) et ne s'adaptent pas bien entre les appareils. - L'excès de zèle avec
vh: Utiliserheight: 100vhsur un appareil mobile peut être délicat. Lorsque l'interface du navigateur (comme la barre d'adresse) apparaît ou disparaît au défilement, la valeur de1vhchange, ce qui fait « sauter » la mise en page. Cela a conduit à l'introduction de nouvelles unités plus stables commedvh(dynamic viewport height).
Pourquoi c'est un sujet à ne pas ignorer
Si vous touchez au CSS, vous ne pouvez pas échapper aux unités. Elles sont aussi fondamentales que les sélecteurs et les propriétés. Réfléchir à l'unité à utiliser devrait être un processus automatique chaque fois que vous écrivez une valeur de taille.
Choisir la bonne unité est le fondement du développement web moderne.
- C'est essentiel pour l'Accessibilité : Utiliser
rempermet aux utilisateurs d'adapter l'interface à leurs besoins. - C'est le cœur de la Responsivité : Utiliser
vw,vhet%permet aux mises en page de s'adapter à différents écrans. - C'est la clé du Design Fluide : Utiliser
clamp()crée les expériences fluides et de qualité qui définissent les sites web contemporains.
Maîtriser les unités CSS, c'est ce qui fait passer un développeur du statut de simple copieur-colleur de styles à celui d'architecte capable de concevoir une interface robuste, flexible et centrée sur l'utilisateur, qui fonctionne pour tout le monde, sur n'importe quel appareil.
Pour aller plus loin
- MDN Web Docs: CSS Values and Units — La référence ultime et la plus pratique.
- W3C Specification: CSS Values and Units Module Level 4 — La source officielle de vérité de l'organisme de normalisation.
- MDN Web Docs: clamp() — Une analyse détaillée de la fonction
clamp(). - Smashing Magazine: Fun with Viewport Units — Des utilisations créatives et pratiques de
vwetvh. - A Complete Guide to Fluid Typography par CSS-Tricks — Un excellent article qui retrace l'évolution jusqu'à
clamp(). - The Surprising Truth About Pixels and Accessibility — Une plongée en profondeur fantastique dans le débat
pxvsrem.