Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

TP1re année14 livrables

CSS : mettre en forme

Ta page HTML est correcte mais toute grise. Le CSS, c'est la déco : couleurs, polices, mise en page. Et pour le dompter, on va jouer — CSS Diner, Flexbox Froggy, Grid Garden — avant de styliser ton portfolio.

Par Josselyn C., prof de BTS SIO. Publié le , mis à jour le .

Objectif
sélecteurs, cascade, couleurs & polices, box model, mise en page (Flexbox/Grid), responsive — et styliser ta page
On manipule
ton `index.html` de la séance HTML + des jeux d'apprentissage en ligne
Pré-requis
avoir fait la séance HTML (ta page de présentation)
Pour qui
SLAM et SISR, 1re année
Durée
environ 3 h

Compétences : C1.3 Développer la présence en ligne de l'organisation, C2.1 Concevoir et développer une solution applicative

On apprend chaque notion par un mini-jeu, puis on l'applique tout de suite sur sa vraie page.

Avant de commencer

Pourquoi le CSS

HTML décrit le contenu (le quoi) ; le CSS décrit la présentation (le à quoi ça ressemble). Sans CSS, tous les sites seraient gris et alignés à gauche. Séparer les deux, c'est un principe de pro : tu changes tout le look d'un site en touchant uniquement le CSS, sans toucher au HTML.

Ce que tu sauras faire à la fin

NotionTu sauras…Le jeu pour t'entraîner
Sélecteurscibler les éléments à styliserCSS Diner
Cascade & spécificitécomprendre quelle règle gagne (le « C » de CSS)—
Couleurs & policeschanger couleurs, fonds, polices, tailles—
Unitéschoisir px, %, em, rem, fr—
Box modelgérer marges, bordures, espacements—
Pseudo-classesréagir au survol, cibler le 1er élément…—
Flexboxaligner et répartir des élémentsFlexbox Froggy
Gridcréer une grille de mise en pageGrid Garden
Responsiveadapter la page au mobile—
Inspecteur (F12)déboguer ton CSS, voir quelles règles s'appliquent—

0. C'est quoi le CSS ?

CSS (Cascading Style Sheets, « feuilles de style en cascade ») est le langage qui met en forme le HTML. On écrit des règles qui disent « tel élément doit être de telle couleur, telle taille, à tel endroit ».

MotDéfinition
CSSle langage de mise en forme des pages web
Règleun sélecteur + des propriétés (ce qu'on applique)
Sélecteurce qu'on veut cibler (une balise, une classe…)
Propriétéce qu'on change (couleur, taille…) et sa valeur

Flag A1

Checkpoint

En une phrase : quelle est la différence entre le rôle du HTML et celui du CSS ? Et pourquoi est-ce pratique de les séparer ?

Rends : ta réponse.

0 sur 14 dans cette étape

1. Brancher le CSS au HTML

Trois façons d'ajouter du CSS. On va droit à la bonne (la 3e).

MéthodeExempleVerdict
en ligne (style="…")<h1 style="color:red">à éviter (mélange contenu et style)
interne (<style> dans le head)une balise <style>pour des tests rapides
externe (fichier .css)un fichier style.css + un lienla bonne pratique

La bonne méthode — un fichier séparé

Crée un fichier style.css à côté de ton index.html (même dossier), puis relie-les. Dans le <head> du HTML :

html
<link rel="stylesheet" href="style.css">

Et dans style.css, une première règle :

h1 {
  color: purple;
}

Flag B1

Production

Crée style.css, relie-le à ta page avec <link>, et mets ton <h1> dans une couleur de ton choix.

Rends : la ligne <link> et ta première règle CSS.

0 sur 14 dans cette étape

2. La syntaxe d'une règle

Toutes les règles CSS ont la même forme. Une fois comprise, tu peux tout écrire.

Une règle = un sélecteur (qui), puis entre accolades une ou plusieurs paires propriété : valeur ; (quoi).

Une règle = un sélecteur (qui), puis entre accolades une ou plusieurs paires propriété : valeur ; (quoi).

Une règle peut empiler plusieurs déclarations, chacune finie par ; :

h1 {
  color: purple;
  font-size: 32px;
  text-align: center;
}

Les commentaires CSS

Un commentaire est un texte ignoré par le navigateur — pour toi (te repérer) ou pour désactiver une règle sans l'effacer.

/* Couleurs principales du site */
h1 {
  color: purple;
  /* font-size: 40px; */  /* désactivé pour l'instant */
}

Flag A2

Checkpoint

Dans p { font-size: 18px; }, identifie le sélecteur, la propriété, la valeur.

Rends : les trois, et écris en plus un commentaire CSS valide de ton choix.

0 sur 14 dans cette étape

3. Les sélecteurs (on joue !)

Le sélecteur, c'est qui on vise. C'est LA compétence clé du CSS, et le meilleur moyen de la muscler, c'est de jouer.

Cibler…SélecteurExemple
toutes les balises d'un typele nomp { } (tous les paragraphes)
les éléments d'une classe. + nom.intro { }
un élément unique (id)# + nom#menu { }
un élément dans un autreespacemain p { } (les p dans main)
absolument tout** { } (le sélecteur universel)

Pour utiliser une classe, on l'ajoute dans le HTML : <p class="intro">, puis on la cible avec .intro en CSS.

Classe vs id : lequel choisir ?

Classe (.)id (#)
Combien dans la pageautant qu'on veutun seul (unique)
HTMLclass="carte"id="entete"
CSS.carte { }#entete { }
Usage conseilléla norme pour styliserplutôt rare en style

En pratique on stylise presque tout avec des classes. L'id reste réservé à un élément vraiment unique.

Classes multiples

Un élément peut porter plusieurs classes, séparées par des espaces dans le HTML :

html
<p class="texte important">Attention</p>
.texte { font-size: 16px; }
.important { color: crimson; font-weight: bold; }

Les combinateurs — four façons de cibler « dans / à côté »

Un combinateur est le symbole entre deux sélecteurs ; il précise la relation entre eux. CSS Diner t'en fait pratiquer quatre.

CombinateurSyntaxeCe qu'il cibleExemple
Descendant (espace)main ptous les p à l'intérieur de main, peu importe la profondeurnav a { color: white; }
Enfant direct (>)ul > liles li enfants directs de ul (pas les sous-listes).menu > .item { }
Adjacent (+)h2 + ple p qui suit immédiatement un h2premier paragraphe après un titre
Voisins (~)h2 ~ ptous les p qui suivent un h2 dans le même parenttous les blocs après un titre
/* Descendant : tous les liens DANS nav, même imbriqués profond */
nav a { color: #5b2d8e; }

/* Enfant direct : seulement les li IMMÉDIATS de ul, pas ceux des sous-listes */
ul > li { list-style: square; }

/* Adjacent : seulement le premier p qui suit immédiatement un h2 */
h2 + p  { font-weight: 600; }

/* Voisins : tous les p qui suivent un h2 dans le même conteneur */
h2 ~ p  { color: #555; }

Flag B2

Production (jeu + page)

  1. Joue les 10 premiers niveaux de CSS Diner.\
  2. Dans ta page, ajoute class="intro" à un de tes paragraphes et stylise-le en CSS (.intro { … }).

Rends : le niveau atteint à CSS Diner (capture du compteur) et ta règle .intro.

0 sur 14 dans cette étape

4. La cascade, l'héritage & la spécificité

Le « C » de CSS veut dire Cascading (en cascade). Quand plusieurs règles ciblent le même élément avec des valeurs différentes, le navigateur doit en choisir une. La cascade, c'est l'ensemble des règles qui décident laquelle gagne. C'est exactement ce qui te bloquera le plus souvent — autant le comprendre maintenant.

1. La spécificité — la règle la plus « précise » gagne

Chaque type de sélecteur a un poids. Plus le sélecteur est précis, plus il pèse lourd.

SélecteurExemplePoids
balisep, h11
classe.intro10
id#menu100
style en lignestyle="…"1000
p        { color: blue; }    /* poids 1   */
.intro   { color: green; }   /* poids 10  */
#special { color: red; }     /* poids 100 */

Avec ce HTML : <p class="intro" id="special">Bonjour</p>

2. L'ordre — à poids égal, le dernier gagne

.intro { color: green; }
.intro { color: orange; }

2 bis. !important — la règle d'exception (à utiliser avec extrême prudence)

Il existe une façon de forcer une déclaration à gagner, quelle que soit la spécificité : écrire !important après la valeur.

p { color: blue !important; }
#special { color: red; }

@layer — la solution pro à !important (CSS 2022)

Les projets modernes (Bootstrap 5.3+, Tailwind v4, etc.) utilisent @layer pour organiser la priorité des blocs CSS sans !important. Principe : une couche déclarée en dernier dans la liste gagne sur les précédentes.

/* On déclare l'ordre de priorité UNE seule fois (en haut du CSS) */
@layer base, composants, utilitaires;

/* Les styles de base : peu prioritaires */
@layer base {
  a { color: blue; }
}

/* Les composants : priorité intermédiaire */
@layer composants {
  .bouton { background: #5b2d8e; color: white; }
}

/* Les utilitaires : priorité haute (déclaré en dernier dans la liste) */
@layer utilitaires {
  .text-center { text-align: center; }
}

Le vrai calcul de spécificité : le triplet (a, b, c)

Les navigateurs calculent la spécificité sous forme d'un triplet, pas d'une addition simple. Les chiffres 1, 10, 100 sont une aide-mémoire ; en réalité :

Sélecteura (ids)b (classes / attr / pseudo-cl.)c (balises / pseudo-elt.)Qui gagne si conflit
p001→
.intro010→
#menu100→ gagne sur tout ce qui a a=0
nav .intro p012→ bat .intro seul
#menu .lien:hover120→ bat #menu seul

3. L'héritage — certaines propriétés se transmettent

Quand tu stylises un parent, certaines propriétés descendent automatiquement vers les enfants. Pas besoin de les répéter partout.

body {
  font-family: Arial, sans-serif;
  color: #333;
}

Flag A3

Checkpoint (prédiction)

Soit ce CSS et ce HTML :

p       { color: black; }
.alerte { color: red; }
#titre  { color: blue; }

<p class="alerte" id="titre">Texte</p>

Sans tester, prédis la couleur affichée et justifie par les poids. Puis teste pour vérifier. Rends : ta prédiction + la justification.

0 sur 14 dans cette étape

5. Couleurs, fonds & polices

De quoi rendre une page vivante. Quelques propriétés essentielles.

body {
  font-family: Arial, sans-serif;
  color: #333333;
  background-color: #f4f4f4;
  line-height: 1.6;
}
h1 {
  color: #5b2d8e;
  font-size: 32px;
  text-align: center;
}

Couleur avec transparence : rgba() et hsl()

.fond-tinte  { background-color: rgba(91, 45, 142, 0.12); } /* violet à 12 % */
.fond-opaque { background-color: rgba(91, 45, 142, 1);    } /* identique à #5b2d8e */
.fond-hsl    { background-color: hsl(270, 60%, 42%);      } /* teinte 270°, sat 60 %, lum 42 % */

Charger une police web (Google Fonts)

Les polices système (Arial, Georgia…) sont limitées. Pour une vraie typographie web, on charge depuis un serveur :

Dans le <head> du HTML :

html
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap"
      rel="stylesheet">

Puis dans le CSS :

body {
  font-family: 'Inter', Arial, sans-serif;
}

font-weight : les graisses d'une police

Valeur numériqueMot-cléUsage typique
400normalcorps de texte courant
600semi-boldsous-titres, labels de formulaire
700boldtitres principaux
800extra-boldtitres d'impact, bandeaux
900blackaffiches, chiffres-clés isolés

Flag B3

Production

Donne à ta page : une police pour tout le body, un line-height confortable, une couleur de fond douce, et un <h1> coloré et centré.

Rends : tes règles CSS et une description du rendu.

0 sur 14 dans cette étape

6. Les unités : px, %, em, rem, fr

Quand tu écris font-size: 32px ou width: 80%, le nombre est suivi d'une unité. Choisir la bonne, c'est éviter bien des surprises.

UnitéC'est quoiQuand l'utiliser
pxpixels fixes (taille absolue)bordures, ombres, petites valeurs précises
%pourcentage du parentlargeurs fluides (width: 80%)
em× la taille de police de l'élémentespacements liés au texte
rem× la taille de police de la racine (html, 16px par défaut)les tailles de texte (cohérent partout)
frfraction de l'espace dispo (Grid uniquement)colonnes de grille (ch. 10)
.titre {
  font-size: 2rem;     /* 2 × 16px = 32px */
  margin-bottom: 1em;  /* 1 × la taille de police de l'élément */
  width: 80%;          /* 80% de la largeur du parent */
  border: 2px solid;   /* épaisseur fixe, en pixels */
}

Les unités de la fenêtre : vw, vh, vmin

.hero {
  width: 100vw;    /* 100 % de la LARGEUR de la fenêtre */
  min-height: 80vh; /* 80 % de la HAUTEUR de la fenêtre */
  padding: 5vmin;  /* 5 % du plus petit côté (utile portrait/paysage) */
}

calc() — combiner des unités différentes

.contenu {
  width: calc(100% - 240px);   /* pleine largeur moins la sidebar */
  margin-left: calc(2rem + 4px);
  font-size: calc(1rem + 0.5vw); /* taille qui grandit avec l'écran */
}

Flag A4

Checkpoint

Pour chacun, quelle unité choisirais-tu et pourquoi ? (1) la taille d'un titre ; (2) la largeur d'un bloc qui doit faire la moitié de l'écran ; (3) l'épaisseur d'une bordure ; (4) la hauteur d'une section d'accueil plein-écran.

Rends : tes 4 réponses justifiées.

0 sur 14 dans cette étape

7. Le box model : l'espace autour des éléments

Notion centrale : chaque élément HTML est une boîte, faite de 4 couches. Les comprendre, c'est maîtriser tous les espacements.

De l'intérieur vers l'extérieur : contenu → padding (espace intérieur) → border (le trait) → margin (espace extérieur entre boîtes).

De l'intérieur vers l'extérieur : contenu → padding (espace intérieur) → border (le trait) → margin (espace extérieur entre boîtes).

.carte {
  padding: 20px;
  border: 2px solid #5b2d8e;
  margin: 16px;
}

box-sizing: border-box — le réglage qui sauve

Par défaut, quand tu écris width: 200px, c'est la largeur du contenu seul. Le padding et la bordure s'ajoutent par-dessus — ta boîte déborde de la taille prévue.

.carte {
  width: 200px;
  padding: 20px;
}
/* Largeur réelle = 200 + 20 (gauche) + 20 (droite) = 240px ! */

La solution, qu'on met tout en haut de chaque feuille CSS :

* {
  box-sizing: border-box;
}

Deux finitions très utiles

.carte {
  border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}

Flag B4

Production

Ajoute * { box-sizing: border-box; } en haut de ton CSS. Puis mets ton <main> (ou un bloc) dans une « carte » : padding, border ou box-shadow, margin, border-radius et un fond blanc.

Rends : ta règle CSS et l'effet obtenu.

0 sur 14 dans cette étape

8. Les pseudo-classes : réagir & cibler

Une pseudo-classe stylise un élément dans un état particulier (survolé, premier de sa liste…). On l'écrit avec : collé au sélecteur.

a:hover {
  color: #5b2d8e;
  text-decoration: underline;
}
nav a:first-child {
  font-weight: bold;
}
Pseudo-classeCible…Cas d'usage typique
:hoverl'élément survolé par la sourisretour visuel sur liens, boutons
:first-childle premier enfant de son parentsupprimer la bordure du 1er élément
:last-childle dernier enfant de son parentsupprimer la marge du dernier
:nth-child(n)le nième enfant (ou odd/even)lignes de tableau zébrées
:focusl'élément actif au clavier (Tab)accessibilité : indiquer où on est
:activel'élément pendant le clicretour visuel bouton enfoncé
:not(sél)les éléments qui ne correspondent PAS au sélecteurstyliser tout sauf le dernier

:nth-child() — cibler par position ou alternance

li:nth-child(2)    { font-weight: bold; }        /* le 2e <li> seulement */
tr:nth-child(odd)  { background: #f6f3fb; }      /* lignes impaires = zébrage */
tr:nth-child(even) { background: #efe9f6; }      /* lignes paires */
li:not(:last-child) { border-bottom: 1px solid #e7def3; } /* trait sauf après le dernier */

:focus — l'accessibilité dès le départ

input:focus, button:focus {
  outline: 3px solid #5b2d8e;
  outline-offset: 2px;
  border-color: #5b2d8e;
}
button:active {
  transform: scale(0.97);
}

Les transitions — rendre les changements fluides

Jusqu'ici, un changement de style (au :hover) est instantané. La propriété transition le rend progressif.

a {
  color: #333;
  background-color: transparent;
  padding: 4px 8px;
  border-radius: 4px;
  transition: color 0.2s ease, background-color 0.2s ease;
}
a:hover {
  color: #fff;
  background-color: #5b2d8e;
}

Flag B5

Production

Sur ta page : 1) ajoute un effet :hover sur tes liens (changement de couleur) ; 2) mets le premier élément d'une liste en gras avec :first-child.

Rends : tes deux règles CSS et la description de l'effet au survol.

0 sur 14 dans cette étape

9. Flexbox : aligner & répartir (on joue !)

Comment mettre des éléments côte à côte, les centrer, les espacer ? Pendant des années c'était l'enfer ; aujourd'hui on a Flexbox, et c'est devenu simple — surtout si on l'apprend en jeu.

Le principe

On met display: flex sur un conteneur (le parent), et ses enfants s'alignent automatiquement. Deux propriétés rois :

.menu {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

Les deux axes (le truc à visualiser)

Flexbox raisonne en axes. justify-content agit sur l'axe principal (horizontal par défaut) ; align-items sur l'axe secondaire (vertical). Tout le jeu Flexbox Froggy tourne là-dessus.

justify-content déplace les enfants le long de l'axe principal (horizontal) ; align-items les place sur l'axe secondaire (vertical).

justify-content déplace les enfants le long de l'axe principal (horizontal) ; align-items les place sur l'axe secondaire (vertical).

La recette « centrer parfaitement »

Le combo le plus utile de tout le CSS : centrer un élément au milieu de son conteneur, dans les deux sens.

.boite {
  display: flex;
  justify-content: center;
  align-items: center;
}

flex-wrap — que faire quand les enfants débordent ?

Par défaut, Flexbox entasse tous les enfants sur une seule ligne, même s'ils débordent de leur conteneur. flex-wrap autorise le retour à la ligne.

.liste-cartes {
  display: flex;
  flex-wrap: wrap;    /* passage à la ligne autorisé */
  gap: 16px;          /* espace entre chaque enfant (lignes ET colonnes) */
}
.carte {
  width: 200px;       /* largeur minimale de chaque carte */
}

flex-direction: column — l'axe vertical

.sidebar {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.sidebar-centree {
  display: flex;
  flex-direction: column;
  justify-content: center;   /* centré verticalement (car axe = colonne) */
  align-items: center;       /* centré horizontalement */
  height: 400px;
}

flex : la propriété de contrôle des enfants

Jusqu'ici on a tout réglé sur le conteneur. On peut aussi donner des instructions à chaque enfant individuellement.

.grille {
  display: flex;
  gap: 16px;
}

/* Chaque carte occupe une part égale de l'espace restant */
.carte { flex: 1; }

/* Cette carte en occupe le double */
.carte-principale { flex: 2; }
PropriétéRôleValeur par défautExemple pro
flex-growcombien l'enfant grandit pour remplir l'espace libre0 (ne grandit pas)flex-grow: 1 = occupe tout l'espace restant
flex-shrinkcombien il rapetisse si l'espace manque1 (rétrécit)flex-shrink: 0 = ne rétrécit jamais (sidebar fixe)
flex-basissa taille de départ avant le calcul flexautoflex-basis: 200px = commence à 200px puis s'adapte
/* Sidebar fixe + contenu qui remplit le reste */
.layout {
  display: flex;
  gap: 20px;
}
.sidebar  { flex: 0 0 220px; }   /* 0 grow, 0 shrink, 220px */
.contenu  { flex: 1; }           /* grandit pour tout le reste */

/* align-self : surcharger align-items sur UN seul enfant */
.badge-special { align-self: flex-end; }  /* ce badge descend en bas */

Flag B6

Production (jeu + page)

  1. Joue jusqu'au niveau 12+ de Flexbox Froggy.\
  2. Sur ta page, crée un petit menu (un <nav> avec 3 liens) et aligne-les en ligne avec Flexbox.

Rends : le niveau atteint (capture) et ta règle Flexbox.

0 sur 14 dans cette étape

10. Grid : des grilles (on joue !)

Flexbox aligne sur une ligne ; Grid crée des grilles (lignes ET colonnes) — parfait pour une galerie ou une mise en page de site.

.galerie {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 10px;
}

Faire qu'une case prenne 2 colonnes

Souvent une carte doit être plus large que les autres (une « vedette »). On le dit sur l'enfant, pas sur le conteneur :

.carte-vedette {
  grid-column: span 2;
}

repeat() et minmax() — la grille qui s'adapte seule

/* Version lisible de grid-template-columns: 1fr 1fr 1fr */
.galerie {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
}
/* Grille adaptative sans media query */
.galerie-adaptive {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 16px;
}

grid-template-areas — dessiner la mise en page en ASCII

.page {
  display: grid;
  grid-template-areas:
    "header  header"
    "sidebar main  "
    "footer  footer";
  grid-template-columns: 220px 1fr;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
  gap: 0;
}
header  { grid-area: header; }
.sidebar { grid-area: sidebar; }
main    { grid-area: main; }
footer  { grid-area: footer; }

grid-auto-rows — contrôler la hauteur des lignes implicites

Quand tu places plus d'éléments que ta grille ne prévoit de lignes, Grid crée des lignes implicites automatiquement. Par défaut leur hauteur est déterminée par le contenu le plus haut de la ligne — ce qui crée des hauteurs incohérentes.

.galerie {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 200px;  /* toutes les lignes auto = 200px */
  gap: 12px;
}

/* Ou avec minmax pour une hauteur minimale mais pouvant grandir */
.galerie-flexible {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  grid-auto-rows: minmax(150px, auto);
  gap: 16px;
}

Flag B7

Production (jeu + page)

  1. Joue jusqu'au niveau 10 de Grid Garden.\
  2. Sur ta page, affiche 3 « cartes » (3 <div>) côte à côte avec Grid (3 colonnes + un gap).

Rends : le niveau atteint (capture) et ta règle Grid.

0 sur 14 dans cette étape

11. Un site qui s'adapte (responsive)

Un bon site s'affiche aussi bien sur ordinateur que sur téléphone. C'est le responsive design. La brique de base : la media query.

@media (max-width: 600px) {
  .menu {
    flex-direction: column;
  }
}

Mobile-first vs Desktop-first : quelle stratégie choisir ?

StratégieOn part de…Query utiliséeRecommandée ?
Desktop-firstgrand écran (base)@media (max-width: …) pour réduireAncienne méthode, encore courante
Mobile-firstmobile (base)@media (min-width: …) pour enrichirRecommandée (Google, frameworks modernes)
/* Mobile-first : base = mobile (pas de media query) */
.menu {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

/* On enrichit pour tablette (768px et plus) */
@media (min-width: 768px) {
  .menu {
    flex-direction: row;
    justify-content: space-between;
  }
}

/* On enrichit encore pour desktop (1024px et plus) */
@media (min-width: 1024px) {
  .menu {
    max-width: 1100px;
    margin: 0 auto;
  }
}

Les points de rupture courants (breakpoints)

Ces valeurs varient selon le framework que tu utilises. Comparaison utile :

NomBootstrap 5Tailwind CSSAppareils visés
Mobile (base)0px0pxsmartphones portrait — pas de media query
sm576px640pxsmartphones paysage (souvent ignoré)
md768px768pxtablettes — le plus important
lg992px1024pxportables / petits écrans
xl1200px1280pxdesktops — souvent juste un max-width centré
2xl1400px1536pxgrands écrans (TV, écrans 4K)

clamp() — la taille qui s'adapte sans media query

Pour la typographie et les espacements, il existe une technique encore plus élégante que les media queries : clamp(), qui définit un minimum, une valeur fluide et un maximum.

/* Titre : min 20px, idéal 4vw, max 48px */
h1 {
  font-size: clamp(20px, 4vw, 48px);
}

/* Marge latérale : min 16px, idéal 5%, max 80px */
.contenu {
  padding: 0 clamp(16px, 5%, 80px);
}

@media autres que la taille d'écran

Les media queries ne servent pas qu'à la taille. Deux autres courantes en prod :

/* Thème sombre : s'active si l'OS de l'utilisateur est en mode sombre */
@media (prefers-color-scheme: dark) {
  :root {
    --couleur-fond: #1a1a2e;
    --couleur-texte: #e8e8f0;
  }
  body { background: var(--couleur-fond); color: var(--couleur-texte); }
}

/* Impression : simplifier la page pour l'imprimante */
@media print {
  nav, footer, .btn { display: none; }
  body { font-size: 12pt; color: black; }
}

Variables CSS — thématiser en une ligne

Au lieu de répéter #5b2d8e vingt fois dans ton CSS, définis-le une seule fois sous un nom.

:root {
  --couleur-principale: #5b2d8e;
  --couleur-fond:       #f4f4f4;
  --rayon-carte:        8px;
  --ombre-carte:        0 4px 16px rgba(0,0,0,0.10);
}

h1     { color: var(--couleur-principale); }
body   { background-color: var(--couleur-fond); }
.carte {
  border-radius: var(--rayon-carte);
  box-shadow:    var(--ombre-carte);
  border: 2px solid var(--couleur-principale);
}

Flag D1

Investigation

Avec le mode appareil de l'inspecteur (F12), regarde ta page en taille « mobile ». Qu'est-ce qui s'affiche mal ? Ajoute UNE media query pour corriger un problème.

Rends : le souci repéré et ta media query.

0 sur 14 dans cette étape

12. Déboguer avec l'inspecteur (F12)

Tôt ou tard, une règle « ne marche pas » et tu ne sais pas pourquoi. L'inspecteur (les « DevTools » du navigateur) est ton meilleur ami : il te montre exactement quelles règles s'appliquent à un élément, et lesquelles ont été écrasées par la cascade.

Comment l'ouvrir et s'en servir

GesteEffet
F12 (ou clic droit → Inspecter)ouvre les DevTools
onglet Éléments / Inspecteurl'arbre HTML de ta page
clique sur un élément (ou l'icône flèche puis sur la page)le sélectionne
panneau Styles (à droite)toutes les règles CSS qui le ciblent

Flag C1

Debug (avec l'inspecteur)

Ajoute exactement ce CSS et ce HTML à ta page :

p.note { color: green; }
.note  { color: crimson; }

<p class="note">Texte test</p>

Le texte s'affiche en vert, pas en crimson, alors que la règle crimson est écrite en dernier. Ouvre F12, clique sur le paragraphe, regarde le panneau Styles : quelle règle est barrée, laquelle gagne, et pourquoi ?

Rends : l'explication par la spécificité (quels poids), et ce que tu changerais pour obtenir crimson.

0 sur 14 dans cette étape

13. Mini-projet : stylise ton portfolio

On transforme ta page HTML brute en une vraie page présentable — la base de ton portfolio qu'on construira avec l'IA et déploiera en ligne aux prochaines séances.

Le cahier des charges

  1. Un fichier style.css relié à ta page (aucun style en ligne).
  2. * { box-sizing: border-box; } tout en haut du CSS.
  3. Le body : une police agréable, un line-height confortable, une couleur de fond, une largeur de contenu centrée.
  4. Le <header> : titre coloré, centré, avec du padding.
  5. Le <main> : présenté en « carte » (fond blanc, padding, bordure ou ombre, margin, coins arrondis).
  6. Un menu de navigation aligné avec Flexbox, avec un effet :hover sur les liens.
  7. Tes compétences ou projets en grille (Grid) si tu en as plusieurs.
  8. Le <footer> : discret, centré, petit texte.
  9. Au moins UNE media query pour que ça tienne sur mobile.

Flag B8

Mini-projet (production)

Stylise entièrement ta page de présentation avec ton style.css, en respectant le cahier des charges.

Rends : ton fichier CSS complet et une capture (ou description) de la page avant / après. Garde le tout : c'est ton portfolio en germe.

0 sur 14 dans cette étape

Pour finir

Ton tableau de chasse (les jeux)

Coche au fur et à mesure. Finir un jeu en entier = un vrai cap franchi (et un bonus E3).

JeuAdresseCe que tu musclesNiveaux
CSS Dinerflukeout.github.ioles sélecteurs32
Flexbox Froggyflexboxfroggy.comaligner / répartir24
Grid Gardencssgridgarden.comles grilles 2D28

Ton antisèche

Je veux…CSS / HTML
relier le CSS<link rel="stylesheet" href="style.css">
un commentaire/* … */
cibler une classe / un id.classe { } / #id { }
réinitialiser les tailles* { box-sizing: border-box; }
couleur / fond / policecolor / background-color / font-family
transparencergba(91,45,142, 0.15) — 4e valeur de 0 à 1
charger une police web<link href="fonts.googleapis.com/…"> + font-family: 'Inter', sans-serif
espacementspadding (intérieur) / margin (extérieur) / gap (entre éléments flex/grid)
finitionsborder-radius / box-shadow / line-height
survol / clic / focus:hover / :active / :focus
lignes alternées:nth-child(odd/even)
animation doucetransition: color 0.2s ease;
aligner sur une lignedisplay: flex + justify-content / align-items
retour à la ligne flexflex-wrap: wrap
grille 2D fixedisplay: grid + repeat(3, 1fr) + gap
grille adaptativerepeat(auto-fill, minmax(180px, 1fr))
nommer des zonesgrid-template-areas + grid-area: nom
plein-écran en hauteurmin-height: 100vh (ou 100svh)
calcul mixte d'unitéswidth: calc(100% - 240px)
variable réutilisable:root { --ma-couleur: #5b2d8e; } puis var(--ma-couleur)
adapter au mobile (desktop-first)@media (max-width: 768px) { }
enrichir pour grand écran (mobile-first)@media (min-width: 768px) { }
déboguerF12 → panneau Styles (règles barrées = écrasées)
calculer la spécificitéspecificity.keegan.st

Vérifie tes acquis

  1. Quelle est la différence entre HTML et CSS ?
  2. Comment relie-t-on un fichier CSS à une page HTML ?
  3. Quelle est la structure d'une règle CSS ?
  4. Différence entre cibler une balise, une classe (.) et un id (#) ?
  5. Entre une règle .intro et une règle #titre sur le même élément, laquelle gagne et pourquoi ? Exprime la spécificité comme un triplet (a,b,c).
  6. Qu'est-ce que !important ? Pourquoi est-ce dangereux d'en abuser ?
  7. Cite les 4 couches du box model. À quoi sert box-sizing: border-box ?
  8. Différence entre padding et margin ? Et entre margin et gap ?
  9. Quand utiliser vh plutôt que % pour la hauteur ? Quel problème peut poser 100vh sur mobile ?
  10. Quand utiliser Flexbox plutôt que Grid ? Et flex-wrap: wrap, ça sert à quoi ?
  11. Que fait repeat(auto-fill, minmax(180px, 1fr)) ? En quoi est-ce différent de repeat(3, 1fr) ?
  12. Qu'est-ce qu'une variable CSS ? Comment en déclarer une et l'utiliser ?
  13. Comment voir, avec F12, qu'une règle a été écrasée ?
  14. Quelle est la différence entre approche mobile-first et desktop-first ?

Glossaire

MotDéfinition
CSSle langage de mise en forme des pages web (Cascading Style Sheets)
Règleun sélecteur + des paires propriété : valeur
Sélecteurce qu'on cible (balise, .classe, #id, pseudo-classe…)
Cascadeles règles qui décident quelle déclaration gagne (spécificité → ordre)
Spécificitéle « poids » d'un sélecteur, exprimé en triplet (a,b,c) : id > classe > balise
!importantforce une déclaration à gagner quelle que soit la spécificité — à éviter
Héritagedes propriétés (police, couleur) qui passent du parent aux enfants
Pseudo-classecible un état (:hover, :focus, :nth-child()…)
Transitionrend un changement de style progressif (durée + courbe)
Box modelcontenu + padding + border + margin
box-sizing: border-boxinclut padding et border dans la largeur déclarée (plus prévisible)
Unité pxpixel fixe, taille absolue
Unité remrelatif à la racine (html, 16px par défaut) — recommandé pour les textes
Unité vw / vhpourcentage de la largeur / hauteur de la fenêtre
calc()calcul CSS mélangeant plusieurs unités : calc(100% - 240px)
rgba()couleur avec canal alpha (transparence) : rgba(r,g,b, 0–1)
Variable CSSvaleur nommée avec --nom: valeur dans :root, utilisée via var(--nom)
Flexboxmise en page sur un axe (ligne ou colonne) — display: flex
flex-wrapautorise le retour à la ligne quand les enfants ne tiennent plus
gapespace entre les enfants d'un conteneur flex ou grid
Gridmise en page en grille 2D — display: grid
minmax()définit une taille entre un min et un max pour une colonne grid
grid-template-areasdessin textuel de la grille (zones nommées)
Media querybloc CSS conditionnel selon la taille d'écran (@media (min-width: …))
Mobile-firstécrire le CSS pour mobile en base, enrichir avec min-width
Breakpointpoint de rupture = largeur où la mise en page change
Responsiveune page qui s'adapte à la taille de l'écran
Inspecteurles outils du navigateur (F12) pour examiner/déboguer le CSS

TP terminé ?

Coche chaque livrable quand tu l'as : c'est la preuve que l'étape est acquise.

livrables
–
de série
–
Voir tous les TP