00 Comment ça fonctionne

HTML = le contenu. CSS = l'apparence.

Le HTML décrit ce qu'il y a sur la page (un titre, un paragraphe, une image). Le CSS décrit comment ça se présente (couleur, taille, position). Le CSS cible les éléments HTML grâce à leurs classes.

fichier HTML <p class="mon-texte">Bonjour !</p>
fichier CSS .mon-texte {
  color: red;
}

Balise = <p>, <h1>, <div>… les briques du HTML.
Classe = un nom qu'on invente (class="mon-texte"). En CSS, on la cible avec un point : .mon-texte { … }
Propriété = ce qu'on change (color, font-size…). Valeur = ce qu'on lui donne (red, 16px…).

01 Typographie
color— Couleur du texte

Texte rouge

Texte bleu

Texte vert

<p class="rouge">Texte rouge</p>
<p class="bleu">Texte bleu</p>
<p class="vert">Texte vert</p>

<!-- <p> = paragraphe -->
.rouge { color: #e63946; }
.bleu  { color: #3b82f6; }
.vert  { color: #22c55e; }

/* formats de couleur acceptés :
   #e63946   → hexadécimal
   rgb(230, 57, 70) → rgb
   red       → nom anglais */
font-size— Taille du texte

12px — note de bas de page

16px — corps courant

24px — sous-titre

40px titre

<p class="petit">Note de bas de page</p>
<p class="corps">Corps courant</p>
<h2 class="sous-titre">Sous-titre</h2>
<h1 class="grand-titre">Titre</h1>

<!-- h1 à h6 = niveaux de titre -->
.petit       { font-size: 12px; }
.corps       { font-size: 16px; }
.sous-titre  { font-size: 24px; }
.grand-titre {
  font-size: 40px;
  font-weight: 800;
  line-height: 1;
}
font-weight— Épaisseur du tracé

300 — fin (Light)

400 — normal

600 — semi-gras

800 — très gras

<p class="fin">300 — fin</p>
<p class="normal-w">400 — normal</p>
<p class="semi-gras">600 — semi-gras</p>
<p class="gras">800 — très gras</p>
.fin       { font-weight: 300; }
.normal-w  { font-weight: 400; }
.semi-gras { font-weight: 600; }
.gras      { font-weight: 800; }

/* La police doit proposer
   la graisse demandée.
   bold = 700, normal = 400. */
font-family— Police de caractères
police-sans

Le vif renard brun saute

police-serif

Le vif renard brun saute

police-mono

Le vif renard brun saute

<p class="police-sans">
  Le vif renard…
</p>
<p class="police-serif">
  Le vif renard…
</p>
<p class="police-mono">
  Le vif renard…
</p>
.police-sans {
  font-family: Arial, sans-serif;
}
.police-serif {
  font-family: Georgia, serif;
}
.police-mono {
  font-family: 'Courier New', monospace;
}
/* Le 2ᵉ terme = police de secours
   si la 1ère est introuvable */
text-align— Alignement horizontal

Aligné à gauche

Centré

Aligné à droite

<p class="aligne-gauche">
  Aligné à gauche
</p>
<p class="aligne-centre">
  Centré
</p>
<p class="aligne-droite">
  Aligné à droite
</p>
.aligne-gauche {
  text-align: left;
}
.aligne-centre {
  text-align: center;
}
.aligne-droite {
  text-align: right;
}
/* left est le défaut.
   justify = texte justifié
   comme dans un journal. */
line-height— Interlignage
interligne-serre

Première ligne. Deuxième ligne. Troisième ligne.

interligne-normal

Première ligne. Deuxième ligne. Troisième ligne.

interligne-large

Première ligne. Deuxième ligne.

<p class="interligne-serre">
  Première ligne…
</p>
<p class="interligne-normal">
  Première ligne…
</p>
<p class="interligne-large">
  Première ligne…
</p>
.interligne-serre  {
  line-height: 1.1;
}
.interligne-normal {
  line-height: 1.6;
}
.interligne-large  {
  line-height: 2.2;
}
/* Sans unité = multiple de
   font-size. 1.6 est le standard
   pour un texte confortable. */
letter-spacing— Espace entre les lettres (tracking)

Texte serré −0.03em

Texte normal 0

Texte aéré 0.12em

Titre en majuscules

<p class="tracking-serre">
  Texte serré
</p>
<p class="tracking-large">
  Texte aéré
</p>
<p class="tracking-caps">
  Titre en majuscules
</p>
.tracking-serre {
  letter-spacing: -0.03em;
}
.tracking-large {
  letter-spacing: 0.12em;
}
.tracking-caps {
  letter-spacing: 0.25em;
  text-transform: uppercase;
  font-weight: 600;
}
/* em = relatif à font-size */
text-decoration— Soulignement, texte barré

Texte souligné

Texte barré (prix)

Lien sans soulignement
<p class="souligne">
  Texte souligné
</p>
<p class="barre">
  Texte barré
</p>
<!-- <a> = lien, souligné par défaut -->
<a class="lien-propre" href="#">
  Lien propre
</a>
.souligne {
  text-decoration: underline;
}
.barre {
  text-decoration: line-through;
}
.lien-propre {
  text-decoration: none;
}
/* none = enlève le soulignement
   Très utile pour les <a>
   dans les menus de navigation */
02 Box Model — La boîte

Chaque élément HTML est une boîte rectangulaire à 4 couches : contenu → padding → border → margin.

margin · border · padding— Les 4 couches de chaque élément
margin — espace EXTÉRIEUR
padding — espace INTÉRIEUR
contenu
<div class="carte">
  Contenu de la carte
</div>

<!-- <div> = boîte générique,
     la balise la plus utilisée
     pour structurer une page -->
.carte {
  border: 2px solid #1a1714;
  /* bordure visible */

  padding: 16px;
  /* espace entre bord et contenu
     — espace INTÉRIEUR */

  margin: 16px;
  /* repousse les voisins
     — espace EXTÉRIEUR */
}
padding&margin— Raccourcis et centrage
carte avec padding: 16px
Contenu
btn-pad avec padding: 8px 24px
Bouton
centree avec margin: 0 auto
centré
<div class="carte">Contenu</div>

<button class="btn-pad">Bouton</button>

<div class="centree">centré</div>
.carte   { padding: 16px; }

/* 2 valeurs : haut/bas | gauche/droite */
.btn-pad { padding: 8px 24px; }

/* margin: 0 auto = centrage horizontal */
.centree {
  width: 140px;
  margin: 0 auto;
}

/* côtés séparés */
margin-top: 32px;
padding-left: 16px;
width— Largeur d'un élément
largeur-fixe
largeur-moitie
largeur-pleine
<div class="largeur-fixe"></div>
<div class="largeur-moitie"></div>
<div class="largeur-pleine"></div>
.largeur-fixe   { width: 80px; }
.largeur-moitie { width: 50%; }
.largeur-pleine { width: 100%; }

/* limiter la largeur maximum */
max-width: 800px;

/* height = même logique
   Par défaut height: auto
   = s'adapte au contenu */
border— Bordure : épaisseur, style, couleur
solid dashed dotted dessous seulement
<div class="bord-solid">solid</div>
<div class="bord-tirets">dashed</div>
<div class="bord-points">dotted</div>
<h2 class="bord-dessous">
  Titre souligné
</h2>
/* épaisseur   style    couleur */
.bord-solid  {
  border: 2px solid #1a1a1a;
}
.bord-tirets {
  border: 2px dashed #3b82f6;
}
.bord-points {
  border: 2px dotted #e91e63;
}
.bord-dessous {
  border-bottom: 3px solid #c95c22;
}
/* border: none; → supprimer */
border-radius— Coins arrondis
coins-carres
coins-ronds
cercle
pilule
<div class="coins-carres"></div>
<div class="coins-ronds"></div>
<div class="cercle"></div>
<button class="pilule"></button>
.coins-carres {
  border-radius: 0;
}
.coins-ronds {
  border-radius: 14px;
}
.cercle {
  width: 56px; height: 56px;
  border-radius: 50%;
  /* width = height pour un cercle */
}
.pilule {
  border-radius: 999px;
}
box-sizing: border-box— À mettre en haut de tout projet
piege — content-box (défaut)
width: 130px
+ border 16px
+ padding 20px
= 166px réels 😬
correct — border-box ✓
width: 130px
tout compris

= 130px. Point.
<!-- Ce code va dans le CSS,
     tout en haut, pour s'appliquer
     à l'ensemble du projet. -->
/* À COLLER EN HAUT DE CHAQUE PROJET */
*, *::before, *::after {
  box-sizing: border-box;
}

/* L'étoile * cible TOUS les éléments.
   Avec border-box : width inclut
   déjà le padding et la border.
   Sans ça, les tailles deviennent
   impossibles à calculer. */
03 Fonds & Couleurs de fond
background-color— Couleur de fond
fond-bleu
fond-rose
fond-semi
<div class="fond-bleu"></div>
<div class="fond-rose"></div>
<div class="fond-semi"></div>
.fond-bleu {
  background-color: #3b82f6;
}
.fond-rose {
  background-color: #e91e63;
}
/* rgba : rouge vert bleu + alpha
   alpha : 0 (invisible) → 1 (plein) */
.fond-semi {
  background-color: rgba(59, 130, 246, 0.2);
}
background— Dégradés
degrade-1
degrade-2
degrade-3
<div class="degrade-1"></div>
<div class="degrade-2"></div>
<div class="degrade-3"></div>
/* linéaire : direction, départ, arrivée */
.degrade-1 {
  background: linear-gradient(
    to right, #3b82f6, #e91e63
  );
}
.degrade-2 {
  background: linear-gradient(
    135deg, #f9e2af, #c95c22
  );
}
/* radial : du centre vers l'extérieur */
.degrade-3 {
  background: radial-gradient(
    circle, #93c5fd, #1e3a8a
  );
}
background-image&background-size&background-position
hero — image en arrière-plan
background: linear-gradient(…)
Remplacer par url('photo.jpg') pour une vraie image
<div class="hero">
  Texte par-dessus l'image
</div>

<!-- Ou une vraie balise image -->
<img
  src="photo.jpg"
  alt="Description"
/>
.hero {
  background-image: url('photo.jpg');

  background-size: cover;
  /* cover = remplit sans déformer
     contain = tout visible
     100% = étire (souvent moche) */

  background-position: center;
  /* center / top / bottom
     left / right / top left… */

  background-repeat: no-repeat;
  /* désactive la répétition */
}
opacity— Transparence (0 = invisible, 1 = plein)
opaque
1.0
mi-opaque
0.5
peu-opaque
0.2
<div class="opaque">1.0</div>
<div class="mi-opaque">0.5</div>
<div class="peu-opaque">0.2</div>
.opaque    { opacity: 1;   }
.mi-opaque { opacity: 0.5; }
.peu-opaque{ opacity: 0.2; }

/* Attention : opacity rend transparent
   TOUT l'élément — texte inclus.
   Pour juste le fond :
   background: rgba(0,0,0, 0.5)
   
   opacity: 0 = invisible MAIS
   occupe toujours de la place */
04 Display — Comportement dans la page
display— Comment un élément occupe l'espace
block — prend toute la largeur, empilé
div.el-block (A)
div.el-block (B)
inline — coule dans le texte

Du texte span.el-inline qui continue sur la même ligne.

inline-block — côte à côte, accepte width et padding
A B C
<!-- block : <div> <p> <h1>… -->
<div class="el-block">A</div>
<div class="el-block">B</div>

<!-- inline : <span> <a>… -->
<p>Texte <span class="el-inline">
  span
</span> continu.</p>

<!-- inline-block : côte à côte -->
<span class="el-inline-block">A</span>
<span class="el-inline-block">B</span>
.el-block {
  display: block;
  /* défaut pour div, p, h1… */
}
.el-inline {
  display: inline;
  /* défaut pour span, a, strong… */
}
.el-inline-block {
  display: inline-block;
  /* côte à côte + accepte
     width, height, padding */
}
/* display: none → invisible
   ET retiré de la page */
05 Position
position: relative&position: absolute
parent-relatif (le conteneur)
relative top:8px left:8px absolute bottom:10px right:10px
<div class="parent-relatif">

  <span class="enfant-relatif">
    relative
  </span>

  <span class="enfant-absolu">
    absolute
  </span>

</div>
.parent-relatif {
  position: relative;
  /* référence pour les absolute */
}
.enfant-relatif {
  position: relative;
  top: 8px;
  left: 8px;
  /* décalé depuis sa position */
}
.enfant-absolu {
  position: absolute;
  bottom: 10px;
  right: 10px;
  /* collé en bas à droite
     du parent-relatif */
}
position: fixed&position: sticky
fixed — collé à l'écran, ne bouge pas quand on fait défiler la page. Idéal pour une barre de navigation.
sticky — suit le défilement normalement, puis reste visible dès qu'il atteint le bord. Utilisé pour les titres de section.
<nav class="barre-nav">
  Menu
</nav>

<h2 class="titre-collant">
  Titre
</h2>
.barre-nav {
  position: fixed;
  top: 0; left: 0;
  width: 100%;
  /* reste en haut même si
     on scrolle */
}
.titre-collant {
  position: sticky;
  top: 0;
  /* colle au bord quand
     il l'atteint au scroll */
}
/* z-index : qui est devant */
z-index: 100;
06 Flexbox

Flexbox s'active sur le parent (le conteneur). Il organise automatiquement tous ses enfants directs.

display: flex— Active flexbox sur le conteneur
sans flex (empilés par défaut)
A
B
C
conteneur-flex (côte à côte)
A
B
C
<!-- Le parent = conteneur -->
<div class="conteneur-flex">
  <div class="enfant-a">A</div>
  <div class="enfant-b">B</div>
  <div class="enfant-c">C</div>
</div>
/* Sur le PARENT */
.conteneur-flex {
  display: flex;
  gap: 8px;
}

/* Les ENFANTS */
.enfant-a { background: #3b82f6; }
.enfant-b { background: #e91e63; }
.enfant-c { background: #22c55e; }
justify-content— Distribution horizontale des enfants
jc-debut
A
B
C
jc-milieu
A
B
C
jc-fin
A
B
C
jc-entre
A
B
C
jc-egal
A
B
C
<div class="jc-debut">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>
<!-- Même structure HTML pour
     jc-milieu, jc-fin,
     jc-entre et jc-egal -->
.jc-debut  { display: flex; justify-content: flex-start; }
.jc-milieu { display: flex; justify-content: center; }
.jc-fin    { display: flex; justify-content: flex-end; }
.jc-entre  { display: flex; justify-content: space-between; }
.jc-egal   { display: flex; justify-content: space-evenly; }
align-items— Alignement vertical des enfants
ai-haut
A
B
C
ai-milieu
A
B
C
ai-bas
A
B
C
<div class="ai-haut">
  <div class="fi-court">A</div>
  <div class="fi-grand">B</div>
  <div class="fi-court">C</div>
</div>
<!-- Même structure pour
     ai-milieu et ai-bas -->
.ai-haut   {
  display: flex;
  align-items: flex-start;
}
.ai-milieu {
  display: flex;
  align-items: center;
}
.ai-bas {
  display: flex;
  align-items: flex-end;
}
/* Centrer dans les 2 axes : */
display: flex;
justify-content: center;
align-items: center;
gap&flex-wrap— Espacement et retour à la ligne
avec-gap (gap: 16px)
A
B
C
D
avec-wrap (flex-wrap: wrap)
Un
Deux
Trois
Quatre
<div class="avec-gap">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>

<div class="avec-wrap">
  <div>Un</div>
  <div>Deux</div>
  <div>Trois</div>
  <div>Quatre</div>
</div>
.avec-gap {
  display: flex;
  gap: 16px;
  /* espace entre les enfants */
}
.avec-wrap {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  /* wrap = passe à la ligne
     si pas assez de place.
     Par défaut : nowrap. */
}
flex: 1— Sur les enfants : comment ils partagent l'espace
conteneur-parts (part-2 prend 2×, part-1 prend 1×)
flex: 2
flex: 1
flex: 1
<div class="conteneur-parts">
  <div class="part-2">flex: 2</div>
  <div class="part-1">flex: 1</div>
  <div class="part-1">flex: 1</div>
</div>
.conteneur-parts {
  display: flex;
}
.part-2 { flex: 2; }
/* prend 2 parts de l'espace */
.part-1 { flex: 1; }
/* prend 1 part de l'espace */

/* Exemple : sidebar + contenu
   .sidebar { flex: 1; }  → 25%
   .contenu { flex: 3; }  → 75% */
flex-direction— Horizontal ou vertical
flex-rangee (row)
A
B
C
flex-colonne (column)
A
B
C
<div class="flex-rangee">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>

<div class="flex-colonne">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>
.flex-rangee {
  display: flex;
  flex-direction: row;
  /* → c'est le défaut */
}
.flex-colonne {
  display: flex;
  flex-direction: column;
  /* ↓ les enfants s'empilent */
}
/* row-reverse ← et column-reverse ↑
   existent aussi */
07 Effets visuels
box-shadow— Ombre portée
ombre-legere
légère
ombre-carte
carte
ombre-coloree
colorée
<div class="ombre-legere">
  Contenu
</div>
<div class="ombre-carte">
  Carte
</div>
<div class="ombre-coloree">
  Colorée
</div>
/* décalX décalY flou couleur */
.ombre-legere {
  box-shadow: 0 1px 4px rgba(0,0,0,.1);
}
.ombre-carte {
  box-shadow: 0 4px 16px rgba(0,0,0,.12);
}
.ombre-coloree {
  box-shadow: 0 4px 20px rgba(59,130,246,.5);
}
/* inset = ombre vers l'intérieur
   box-shadow: inset 0 3px 8px rgba(0,0,0,.2) */
cursor— Forme du curseur (passe la souris dessus)
pointer not-allowed text
<button class="curseur-main">
  Bouton
</button>

<button class="curseur-interdit">
  Désactivé
</button>

<div class="curseur-texte">
  Zone de saisie
</div>
.curseur-main {
  cursor: pointer;
  /* main — cliquable
     Les <a> l'ont par défaut */
}
.curseur-interdit {
  cursor: not-allowed;
  /* cercle barré */
}
.curseur-texte {
  cursor: text;
  /* I-beam comme dans un éditeur */
}
/* cursor: default → flèche normal
   cursor: grab    → main ouverte */
transition— Anime les changements CSS (passe la souris sur les boutons)
btn-base — changement brutal
btn-anime — animé en 0.3s
<button class="btn-base">
  Sans transition
</button>

<button class="btn-anime">
  Avec transition
</button>
.btn-base {
  background: #3b82f6;
  /* PAS de transition */
}
.btn-base:hover { background: #e91e63; }

.btn-anime {
  background: #3b82f6;
  transition: background 0.3s ease,
              transform  0.3s ease;
}
.btn-anime:hover {
  background: #e91e63;
  transform: scale(1.06);
}
/* :hover = quand la souris
   est posée sur l'élément */
transform— Déplacement, rotation, zoom
normal
A
zoom
A
rotation
A
decalage
A
inclinaison
A
<div class="boite-base">A</div>
<div class="zoom">A</div>
<div class="rotation">A</div>
<div class="decalage">A</div>
<div class="inclinaison">A</div>
.zoom        { transform: scale(1.4); }
.rotation    { transform: rotate(20deg); }
.decalage    { transform: translateY(-16px); }
.inclinaison { transform: skewX(18deg); }

/* combiner : */
transform: scale(1.05) rotate(3deg);

/* Astuce : centrage absolu parfait */
position: absolute;
top: 50%; left: 50%;
transform: translate(-50%, -50%);