CSS — mettre en forme une page
Le langage qui habille le HTML : couleurs, espacements, mise en page. Une règle = un sélecteur, une propriété, une valeur.
Résumé flash
CSS (Cascading Style Sheets) décrit la présentation d'un
document HTML : il sépare le contenu (HTML) de l'apparence (CSS). On l'écrit dans
un fichier externe lié par <link>. Une règle cible des
éléments avec un sélecteur (balise, .classe,
#id) et leur applique des propriétés. Tout élément est une
boîte (contenu + padding + bordure + marge). Pour la mise en page moderne :
Flexbox et les media queries.
🔑
#sélecteur #classe #id #box-model
#margin #padding #border #hover
#before-after #flexbox #justify-content
#media-query #responsive
01Qu'est-ce que le CSS
CSS (Cascading Style Sheets, « feuilles de style en cascade ») décrit la présentation : mise en page, couleurs, polices, espacements. Son intérêt tient en un mot : la séparation. Le HTML porte le contenu et le sens ; le CSS porte l'apparence. On peut refaire tout le design d'un site sans toucher au HTML.
Trois façons d'insérer du CSS
| Méthode | Où | Verdict |
|---|---|---|
| Externe | un fichier .css lié par <link> dans le
<head> |
Recommandé — réutilisable, mis en cache, propre |
| Interne | dans une balise <style> du <head> |
Pratique pour tester une page unique |
| En ligne | dans l'attribut style="…" d'une balise |
À éviter — impossible à réutiliser, vite ingérable |
<!-- dans le <head> du HTML -->
<link rel="stylesheet" href="style.css"></code>
<code>/* dans style.css */
h1 {
color: blue;
font-size: 18px;
}Le HTML, c'est vous — votre corps, votre structure. Le CSS, c'est votre garde-robe : vous pouvez changer complètement de tenue (le design) sans changer de corps (le contenu). Et une seule feuille de style peut habiller toutes les pages d'un site d'un coup — comme un uniforme appliqué à toute une classe.
02La règle CSS
Une règle a toujours la même anatomie : un sélecteur, puis un bloc de déclarations, chacune étant une paire propriété : valeur.
Ici : p cible tous les paragraphes, color est la propriété à changer,
blue la valeur choisie. On peut empiler autant de déclarations qu'on veut dans le
bloc.
03Les sélecteurs
Les sélecteurs simples
| Type | Écriture | Cible |
|---|---|---|
| Par balise | p { } |
tous les <p> |
| Par classe | .intro { } |
tous les éléments class="intro" — réutilisable |
| Par id | #menu { } |
l'élément unique id="menu" |
La classe (point .) est le sélecteur le plus utilisé : plusieurs
éléments peuvent partager une classe. L'id (dièse #) désigne un
élément unique dans la page.
Les sélecteurs combinés
Ils ciblent des éléments selon leur position dans l'arbre HTML.
| Combinateur | Exemple | Cible |
|---|---|---|
| descendant (espace) | article p |
tous les <p> dans un <article>, à tout
niveau |
enfant direct > | div > p |
seulement les <p> enfants immédiats d'un
<div> |
frère immédiat + | h2 + p |
le <p> placé juste après un <h2> |
frère général ~ | h2 ~ p |
tous les <p> qui suivent un <h2> (même
parent) |
Si deux règles visent le même élément avec des valeurs contradictoires, la plus spécifique l'emporte — pas la dernière écrite. Le classement :
Un #menu { color:red } bat un .nav { color:blue } qui bat un
a { color:green }, quel que soit l'ordre. C'est la source n° 1 des « mais
pourquoi ma couleur ne s'applique pas ?! ». Évitez d'abuser des #id en CSS
justement parce qu'ils sont difficiles à surpasser.
04Le modèle de boîte
En CSS, chaque élément est une boîte rectangulaire. Cette boîte a quatre couches, de l'intérieur vers l'extérieur : le contenu, le padding (espace intérieur), la bordure, la marge (espace extérieur). C'est le concept le plus important de tout le CSS.
| Couche | Propriété | Rôle |
|---|---|---|
| Marge | margin | espace extérieur autour de la boîte |
| Bordure | border | le trait ; border-width,
border-style (solid, dashed, dotted…), border-color |
| Padding | padding | espace intérieur entre le contenu et la bordure |
| Contenu | width, height | la zone du texte ou de l'image |
.carte {
width: 200px;
padding: 16px;
border: 4px solid #2D5A27;
margin: 12px;
background: #EAF2E8;
}Les autres propriétés courantes
- Couleurs :
color(texte),background-color(fond). Valeurs : nom (red), hexadécimal (#FF0000),rgb(255,0,0). - Polices :
font-family,font-size,font-style(italic),font-weight(bold, 100–900). - Texte :
text-align(left, center, right, justify).
Un code hexadécimal représente une couleur par le mélange de trois primaires de la lumière :
Rouge, Vert, Bleu (RVB). Format #RRGGBB, chaque paire de 00 à
FF :
#FF0000 rouge pur (R au max, V et B à zéro)
#00FF00 vert pur
#0000FF bleu pur
#000000 noir (tout à zéro)
#FFFFFF blanc (tout au max)
#2D5A27 le vert de ces fichesbox-sizingPar défaut, width ne compte que le contenu : une boîte en
width:200px avec padding:20px et border:2px occupe en
réalité 200 + 20×2 + 2×2 = 244 px à l'écran. C'est déroutant et casse les
mises en page.
Le réflexe moderne, qu'aucun polycopié de première année ne montre : ajouter une fois pour toutes
* { box-sizing: border-box; }Avec border-box, width:200px devient la largeur totale
(padding et bordure compris) — bien plus intuitif.
05div & span
Deux conteneurs « neutres » (sans sens particulier) qui servent uniquement à regrouper pour styliser. Toute leur différence tient à un mot : bloc ou en ligne.
<div> est un bloc (nouvelle ligne, pleine largeur) ;
<span> reste en ligne, dans le fil du texte.<div> | <span> | |
|---|---|---|
| Type | bloc (block) | en ligne (inline) |
| Largeur | toute celle du parent | celle de son contenu |
| Saut de ligne | oui, avant et après | non |
| Usage | regrouper des blocs (sections) | styliser un bout de texte |
06Pseudo-classes
Une pseudo-classe cible un élément selon son état ou sa
position, sans qu'on ait à ajouter de classe dans le HTML. On l'écrit avec un
deux-points : sélecteur:pseudo-classe.
| Pseudo-classe | Cible |
|---|---|
:hover | l'élément survolé par la souris |
:focus | le champ qui a le focus (sélectionné) |
:first-child · :last-child | le premier / dernier enfant de son parent |
:nth-child(n) | le n-ième enfant (ex. :nth-child(2),
:nth-child(odd)) |
:checked | une case ou un radio coché |
/* survol d'un bouton */
button:hover { background-color: #1E3D1A; }
/* premier et dernier élément d'une liste */
ul li:first-child { color: red; font-weight: bold; }
ul li:last-child { color: blue; font-style: italic; }
/* teinter une case cochée */
input[type="checkbox"]:checked { accent-color: green; }:hover, la première interactivité sans JavaScriptAvant même d'apprendre JavaScript, :hover permet déjà de réagir à l'utilisateur :
un bouton qui change de couleur au survol, un lien qui se souligne. C'est du ressenti
d'interface obtenu en une ligne de CSS.
07Pseudo-éléments
Un pseudo-élément stylise une partie d'un élément, ou ajoute du
contenu virtuel (qui n'existe pas dans le HTML). On l'écrit avec
deux fois deux-points : élément::pseudo-élément.
| Pseudo-élément | Effet |
|---|---|
::before | ajoute du contenu avant l'élément |
::after | ajoute du contenu après l'élément |
::first-letter | stylise la première lettre (lettrines) |
::first-line | stylise la première ligne |
/* une flèche verte devant chaque élément de liste */
li::before {
content: "→ ";
color: green;
}
/* une lettrine sur les paragraphes */
p::first-letter {
font-size: 2em;
font-weight: bold;
}li::before {
content: "→ ";
color: #2D5A27;
font-weight: bold;
}- Pomme
- Banane
- Cerise
content est obligatoire pour ::before /
::afterSans la propriété content (même vide : content:""), le
pseudo-élément n'apparaît pas du tout. C'est l'oubli classique. Et deux
repères pour ne pas confondre :
- pseudo-classe = un simple deux-points = un état
(
:hover) ; - pseudo-élément = un double deux-points = un morceau
(
::before).
08Flexbox
Flexbox est le module CSS qui règle enfin le vieux casse-tête : aligner,
centrer et répartir des éléments. On rend un conteneur « flex » avec
display: flex ; ses enfants directs deviennent des
items alignés en ligne par défaut.
justify-content)
et le transversal (piloté par align-items).Propriétés du conteneur
| Propriété | Rôle | Valeurs clés |
|---|---|---|
flex-direction | sens de l'axe principal | row (défaut) · column · row-reverse |
justify-content | répartition sur l'axe principal | flex-start · center · space-between ·
space-around · space-evenly |
align-items | alignement sur l'axe transversal | stretch (défaut) · center · flex-start ·
baseline |
flex-wrap | passage à la ligne | nowrap (défaut) · wrap |
gap | espace entre les items | 10px, 1rem… |
Propriétés des items
order | change l'ordre d'affichage (défaut 0) |
flex-grow | capacité à grandir (défaut 0) |
flex-shrink | capacité à rétrécir (défaut 1) |
flex-basis | taille initiale avant répartition |
align-self | aligne un seul item (surcharge
align-items) |
.conteneur {
display: flex;
justify-content: space-between;
align-items: center;
gap: 8px;
background: #EAF2E8;
padding: 10px;
}
.item {
background: #2D5A27;
color: #fff;
padding: 12px 18px;
border-radius: 6px;
}.conteneur {
display: flex;
justify-content: center; /* centre horizontalement */
align-items: center; /* centre verticalement */
min-height: 100vh; /* sur toute la hauteur de l'écran */
}Trois lignes pour centrer un élément dans les deux sens — ce qui, avant Flexbox, demandait des bricolages pénibles. Retenez ce bloc : c'est le plus utile de tout le chapitre.
justify-content et align-items se posent sur le
conteneur ; align-self, flex-grow sur les
items. Une propriété d'item posée sur le conteneur (ou l'inverse) ne fait
rien, sans message d'erreur — d'où de longues minutes de perplexité.
09Le responsive
Un site responsive s'adapte à la taille de l'écran : téléphone, tablette, ordinateur. L'outil pour cela est la media query — un bloc de CSS qui ne s'applique qu'à certaines conditions de largeur.
/* styles de base : pour mobile (petit écran) */
.formulaire { width: 100%; }
/* à partir de 768px (tablette) : on élargit */
@media screen and (min-width: 768px) {
.formulaire { width: 700px; }
}
/* à partir de 1024px (ordinateur) */
@media screen and (min-width: 1024px) {
.formulaire { width: 800px; }
}La bonne méthode est le mobile-first : on écrit
d'abord le style pour petit écran, puis on ajoute avec min-width à
mesure que l'écran grandit. Les seuils courants (breakpoints) : 768 px
(tablette) et 1024 px (ordinateur).
Rien de tout cela ne marche sans cette ligne dans le <head> du HTML — sans
elle, le mobile fait semblant d'être un grand écran :
<meta name="viewport" content="width=device-width, initial-scale=1">Flexbox aligne sur un axe (une ligne ou une colonne). Pour des mises en page
en deux dimensions (lignes et colonnes, comme une grille de
galerie), CSS dispose de Grid (display: grid). Les deux se
complètent : Grid pour la structure d'ensemble de la page, Flexbox pour aligner le contenu à
l'intérieur de chaque zone. C'est d'ailleurs Grid qui structure la mise en page de cette
fiche.
On veut trois cartes côte à côte sur ordinateur, mais empilées sur mobile. Quel outil, et comment le rendre responsive ?
Flexbox avec flex-wrap: wrap. Le conteneur en
display:flex; flex-wrap:wrap; gap:1rem, et chaque carte en
flex: 1 1 300px (grandit, rétrécit, base 300px). Résultat : sur un large écran,
les trois tiennent sur une ligne ; quand la largeur descend sous ~900px, elles passent
automatiquement à la ligne et s'empilent — sans même écrire de media query. C'est
toute la puissance de wrap + flex-basis.