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éthodeOù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
la méthode recommandée
<!-- dans le <head> du HTML -->
<link rel="stylesheet" href="style.css"></code>
<code>/* dans style.css */
h1 {
  color: blue;
  font-size: 18px;
}
💡 Le CSS, c'est le dressing

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.

p { color : blue ; } sélecteur propriété valeur
Le sélecteur dit qui, la propriété dit quoi, la valeur dit comment. Chaque déclaration se termine par un point-virgule.

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ÉcritureCible
Par balisep { } 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.

CombinateurExempleCible
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)
⚠️ La spécificité : qui gagne en cas de conflit ?

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 :

id (#) > classe (.) > balise

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.

contenu margin border padding
De l'intérieur vers l'extérieur : contenu → padding → bordure → marge. La marge sépare la boîte des autres ; le padding éloigne le contenu de la bordure.
CouchePropriétéRôle
Margemarginespace extérieur autour de la boîte
Bordureborderle trait ; border-width, border-style (solid, dashed, dotted…), border-color
Paddingpaddingespace intérieur entre le contenu et la bordure
Contenuwidth, heightla zone du texte ou de l'image
css
.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).
🧰 Le code hexadécimal des couleurs

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 :

00 = 0 % (absente)  ·  FF = 100 % (au maximum)
exemples
#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 fiches
🔧 Corrigé — le piège du calcul de largeur, et box-sizing

Par 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

css — à mettre en tête de toute feuille
* { 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> — prend toute la largeur, saute à la ligne : div div <span> — reste dans le flux du texte : un mot span dans la phrase.
<div> est un bloc (nouvelle ligne, pleine largeur) ; <span> reste en ligne, dans le fil du texte.
<div><span>
Typebloc (block)en ligne (inline)
Largeurtoute celle du parentcelle de son contenu
Saut de ligneoui, avant et aprèsnon
Usageregrouper 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-classeCible
:hoverl'élément survolé par la souris
:focusle champ qui a le focus (sélectionné)
:first-child · :last-childle premier / dernier enfant de son parent
:nth-child(n)le n-ième enfant (ex. :nth-child(2), :nth-child(odd))
:checkedune case ou un radio coché
css
/* 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 JavaScript

Avant 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émentEffet
::beforeajoute du contenu avant l'élément
::afterajoute du contenu après l'élément
::first-letterstylise la première lettre (lettrines)
::first-linestylise la première ligne
css
/* 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;
}
css
li::before {
  content: "→ ";
  color: #2D5A27;
  font-weight: bold;
}
⚠️ content est obligatoire pour ::before / ::after

Sans 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.

1 2 3 axe principal — justify-content axe transversal align-items
Deux axes : le principal (piloté par justify-content) et le transversal (piloté par align-items).

Propriétés du conteneur

PropriétéRôleValeurs clés
flex-directionsens de l'axe principal row (défaut) · column · row-reverse
justify-contentrépartition sur l'axe principal flex-start · center · space-between · space-around · space-evenly
align-itemsalignement sur l'axe transversal stretch (défaut) · center · flex-start · baseline
flex-wrappassage à la ligne nowrap (défaut) · wrap
gapespace entre les items10px, 1rem…

Propriétés des items

orderchange l'ordre d'affichage (défaut 0)
flex-growcapacité à grandir (défaut 0)
flex-shrinkcapacité à rétrécir (défaut 1)
flex-basistaille initiale avant répartition
align-selfaligne un seul item (surcharge align-items)
css
.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;
}
🧰 Le centrage parfait, enfin trivial
css
.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.

⚠️ Conteneur ou item : ne pas mélanger

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.

css — approche « mobile-first »
/* 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; }
}
🧰 Mobile-first, et le meta viewport

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 :

html
<meta name="viewport" content="width=device-width, initial-scale=1">
🌍 Et après Flexbox : Grid

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.

🧠 Auto-évaluation

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.

⚡ Récap 2 minutes

  • Insertion : fichier externe + <link> (recommandé).
  • Règle : sélecteur { propriété: valeur; }.
  • Sélecteurs : balise, .classe, #id ; combinés espace, >, +, ~. Spécificité : id > classe > balise.
  • Boîte : contenu + padding + border + margin. Toujours * { box-sizing: border-box; }.
  • div = bloc, span = en ligne.
  • Pseudo-classes (:hover, :nth-child) = un :, un état. Pseudo-éléments (::before) = deux ::, avec content.
  • Flexbox : display:flex, justify-content (axe principal), align-items (transversal), gap, wrap.
  • Responsive : mobile-first + @media (min-width: …) ; meta viewport indispensable.

Sources exploitées

  • Cours « Développement web — CSS » (le professeur, BTS CIEL 2025-2026)
  • TP 5, 6 et 8 — HTML + CSS (sélecteurs, Flexbox, formulaire responsive)
  • comptes rendus d'élève (dont le TP8 responsive)