Apprenez toutes les balises HTML et leurs utilisations
Le CSS (Cascading Style Sheets, ou Feuilles de style en cascade) est un langage qui permet de définir l’apparence d’une page web : couleurs, tailles, marges, polices, mise en page, etc. Il complète le HTML, qui décrit la structure et le contenu. Il existe 3 manières d’appliquer du CSS dans un document HTML :
<p style="color: red; font-size: 20px;">
Ceci est un texte rouge de 20px.
</p>
Ceci est un texte rouge de 20px.
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Mon site</title>
<style>
p{
color: blue;
font-size: 18px;
}
</style>
</head>
<body>
<p>Texte bleu en 18px.</p>
</body>
</html><
Texte bleu en 18px.
style.css
p {
color: green;
font-size: 16px;
}
index.html
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Mon site</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<p>Texte vert en 16px.</p>
</body>
</html><
Texte vert en 16px.
Le CSS (Cascading Style Sheets) permet de séparer le contenu (HTML) de la présentation (style). Voici TOUT ce que tu dois maîtriser pour bien commencer : sélecteurs, propriétés, unités, héritage, spécificité, pseudo-classes, et plus.
style.css
p {
color: red;
font-size: 18px;
line-height: 1.6;
}
h2 {
color: #333;
border-bottom: 2px solid #00bcd4;
padding-bottom: 5px;
}
Ce paragraphe est rouge, en 18px, avec un espacement de ligne confortable.
div, h1, ul, button.
style.css
.important {
color: blue;
font-weight: bold;
background: #e3f2fd;
padding: 8px;
border-radius: 4px;
}
.highlight {
background: yellow;
font-style: italic;
}
Ce texte utilise la classe .important.
Et celui-ci utilise .highlight. Tu peux combiner les classes !
.nom-de-classeclass="important highlight".
style.css
#special {
background-color: yellow;
padding: 15px;
border: 2px dashed #ff5722;
font-size: 20px;
text-align: center;
}
#header {
background: #2196f3;
color: white;
padding: 20px;
text-align: center;
}
Ce paragraphe a l’ID #special → unique dans la page.
#header#nom-id
style.css
/* Sélecteur d'attribut */
input[type="text"] {
border: 2px solid #4caf50;
padding: 10px;
}
/* Enfant direct */
ul > li {
color: purple;
font-weight: bold;
}
/* Frère adjacent */
h2 + p {
margin-top: 0;
font-style: italic;
}
/* Frère général */
h3 ~ p {
color: gray;
}
Paragraphe FRÈRE ADJACENT (h2 + p)
Paragraphe FRÈRE GÉNÉRAL (h3 ~ p)
Un autre paragraphe frère général
[attribut] → cible par attribut → input[type="text"]parent > enfant → uniquement les enfants directs.frère + suivant → l’élément immédiatement après.frère ~ suivants → tous les frères après, pas forcément adjacents.
style.css
.button {
background: #607d8b;
color: white;
padding: 10px 20px;
border: none;
cursor: pointer;
transition: background 0.3s;
}
.button:hover {
background: #455a64;
}
.button:focus {
outline: 3px solid #81d4fa;
}
li:nth-child(odd) {
background: #f5f5f5;
}
input:invalid {
border: 2px solid #f44336;
}
:hover → au survol de la souris.:focus → quand l’élément est sélectionné (clavier ou clic).:nth-child(n) → cible le n-ième enfant → odd, even,
3n+1.:invalid, :required, :checked → états des formulaires.
style.css
.quote::before {
content: "“";
color: #ff9800;
font-size: 2em;
vertical-align: -0.4em;
}
.quote::after {
content: "”";
color: #ff9800;
font-size: 2em;
vertical-align: -0.4em;
}
.intro::first-line {
font-weight: bold;
color: #d32f2f;
}
.clearfix::after {
content: "";
display: table;
clear: both;
}
“Ceci
est une citation stylée avec ::before et ::after”
Ceci est une introduction. La première ligne est en gras et rouge
grâce à ::first-line. Le reste est normal.
::before / ::after → insèrent du contenu avant/après
l’élément (nécessite content).::first-line → style uniquement la première ligne.::first-letter → style la première lettre (idéal pour les lettrines).
style.css
.box {
width: 300px; /* fixe */
font-size: 1.2rem; /* relatif à la racine (html) */
padding: 1em; /* relatif à la police du parent */
margin: 5%; /* relatif au parent */
height: 20vh; /* 20% de la hauteur de la fenêtre */
max-width: 80vw; /* 80% de la largeur de la fenêtre */
}
px → fixe, pas responsive.em → relatif à la taille de police du parent.rem → relatif à la taille de police de la racine (html) →
recommandé.% → relatif au parent.vw / vh → relatif à la taille de la fenêtre → parfait pour
le responsive.font-size: clamp(1rem, 2.5vw, 1.5rem); → typographie fluide.
style.css
/* Héritage : certaines propriétés se transmettent aux enfants */
body {
font-family: Arial, sans-serif;
color: #333;
}
/* Spécificité : quel style l'emporte ? */
p { color: blue; } /* spécificité faible */
.important { color: red; } /* plus spécifique */
#special { color: green; } /* encore plus spécifique */
p#special.important { color: purple; } /* très très spécifique */
/* !important → force l'application (à éviter) */
.force { color: orange !important; }
Texte en bleu (balise)
Texte en rouge (classe)
Texte en vert (ID)
Texte en violet (balise + ID + classe)
Texte en orange (!important)
color, font-family) se
transmettent aux enfants.!important → force le style → à utiliser uniquement en dernier
recours.
style.css
/* Commentaire sur une ligne */
/*
Commentaire
sur plusieurs lignes
*/
/* ✅ Bonnes pratiques */
.button {
padding: 12px 24px; /* espace intérieur */
border: none; /* pas de bordure */
background: #03a9f4; /* couleur de fond */
color: white; /* couleur du texte */
cursor: pointer; /* change le curseur */
font-size: 1rem; /* taille lisible et scalable */
transition: all 0.2s ease; /* micro-interaction fluide */
}
/* ❌ À éviter */
div { color: red; } /* trop générique */
#main .sidebar p span b { ... } /* trop spécifique → fragile */
.btn-primary, pas
.red-big-button.
| Type | Exemple | Description |
|---|---|---|
| Sélecteur de balise | p { } |
Tous les paragraphes |
| Sélecteur de classe | .btn { } |
Éléments avec class="btn" |
| Sélecteur d’ID | #header { } |
Élément avec id="header" |
| Sélecteur d’attribut | input[type="text"] |
Input de type texte |
| Enfant direct | ul > li |
Li enfants directs de ul |
| Frère adjacent | h2 + p |
P immédiatement après h2 |
| Frère général | h2 ~ p |
Tous les p après h2 |
| Pseudo-classe | a:hover, li:nth-child(odd) |
État ou position |
| Pseudo-élément | p::first-line, div::before |
Partie d’un élément |
| Unités | 1rem, 5vw, 50% |
Mesures relatives/absolues |
| Héritage | color, font-family |
Se transmet aux enfants |
| Spécificité | ID > Classe > Balise | Détermine quel style l’emporte |
Le CSS permet de contrôler chaque détail typographique : police, couleur, espacement, décoration, ombre, césure, débordement, et même l’orientation du texte. Voici TOUT ce que tu dois maîtriser.
style.css
.texte-bleu {
color: #2196f3; /* bleu moderne */
font-size: 24px; /* ou 2rem, 4vw... */
opacity: 0.9; /* transparence */
}
index.html
<p class="texte-bleu">Texte bleu en 24px, avec opacité.</p>
Texte bleu en 24px, avec opacité
color → accepte HEX, RGB, HSL, mots-clés.font-size → px, em, rem, %,
vw (responsive).opacity → 0 (invisible) à 1 (opaque). Affecte tout l’élément (fond + texte).
style.css
/* Polices système avec fallback */
.texte-arial {
font-family: "Arial", "Helvetica", sans-serif;
}
/* Police personnalisée */
@font-face {
font-family: 'MaPolice';
src: url('mapolice.woff2') format('woff2');
font-weight: normal;
font-style: normal;
}
.texte-custom {
font-family: 'MaPolice', sans-serif;
}
index.html
<p class="texte-arial">Texte en Arial.</p>
<p class="texte-custom">Texte en police personnalisée.</p>
Texte en Arial (fallback: Helvetica, sans-serif)
sans-serif, serif,
monospace.@font-face pour charger des polices personnalisées (formats modernes :
.woff2).
style.css
.texte-complet {
font-style: italic; /* italique */
font-weight: 700; /* gras (400=normal, 700=bold) */
font-variant: small-caps; /* petites majuscules */
}
index.html
<p class="texte-complet">Texte en italique, gras, petites majuscules.</p>
Texte en italique, gras, petites majuscules.
font-weight → 100 à 900 (multiples de 100).font-variant: small-caps; → transforme les minuscules en petites majuscules stylées.font-variant-ligatures, font-variant-numeric pour des contrôles
typographiques avancés.
style.css
.texte-centre {
text-align: center; /* horizontal */
}
.texte-baseline {
vertical-align: baseline; /* alignement vertical (inline/inline-block) */
}
.texte-super {
vertical-align: super; /* exposant */
}
index.html
<p class="texte-centre">Texte centré.</p>
<span>H</span><span class="texte-super">2O
Texte centré
H2O → eau
text-align → left, center, right,
justify.vertical-align → fonctionne sur éléments inline ou inline-block
:baseline, top, middle, bottom,
super, sub.
style.css
.souligne {
text-decoration: underline;
}
.barrer {
text-decoration: line-through;
}
.clignote {
text-decoration: underline wavy red; /* style, motif, couleur */
animation: blink 1s step-end infinite;
}
@keyframes blink {
50% { opacity: 0; }
}
index.html
<p class="souligne">Texte souligné.</p>
<p class="barrer">Texte barré.</p>
<p class="clignote">Texte clignotant avec souligné ondulé rouge.
Texte souligné
Texte barré
Texte clignotant avec souligné ondulé rouge
text-decoration: [style] [line-style] [color];underline dotted bluesolid, dotted, dashed, wavy.animation pour des effets dynamiques (clignotement, etc.).
style.css
.majuscules {
text-transform: uppercase;
}
.minuscules {
text-transform: lowercase;
}
.capitalise {
text-transform: capitalize;
}
index.html
<p class="majuscules">ceci devient MAJUSCULES.</p>
<p class="minuscules">CECI DEVIENT minuscules.</p>
<p class="capitalise">chaque mot commence par une majuscule.</p>
ceci devient MAJUSCULES
CECI DEVIENT minuscules
chaque mot commence par une majuscule
style.css
.espacement {
letter-spacing: 4px; /* entre les caractères */
word-spacing: 15px; /* entre les mots */
line-height: 1.8; /* hauteur de ligne (sans unité = multiple) */
}
index.html
<p class="espacement">Texte avec espacement large entre lettres, mots et lignes.</p>
Texte avec espacement large entre lettres, mots et lignes.
letter-spacing → idéal pour les titres.word-spacing → utile pour améliorer la lisibilité.line-height → sans unité (ex: 1.5) = relatif à la taille de police → responsive et
fluide.
style.css
.ombre {
text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
}
.ombre-multiple {
text-shadow:
1px 1px 2px black,
-1px -1px 2px blue;
}
index.html
<h2 class="ombre">Titre avec ombre</h2>
<h2 class="ombre-multiple">Titre avec ombres multiples</h2>
text-shadow: offsetX offsetY blurRadius color;
style.css
.controle-texte {
width: 200px;
border: 1px solid #ccc;
padding: 10px;
white-space: normal; /* retour à la ligne normal */
overflow-wrap: break-word; /* casse les mots longs */
hyphens: auto; /* césure automatique */
text-overflow: ellipsis; /* ... si débordement (nécessite white-space: nowrap) */
}
.pas-de-retour {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 150px;
border: 1px dashed red;
padding: 5px;
}
index.html
<div class="controle-texte">Ce texte long doit s'adapter et se couper proprement avec césure automatique si possible.</div>
<div class="pas-de-retour">Texte très très long qui déborde et se termine par ...</div>
white-space → normal, nowrap, pre,
pre-line.overflow-wrap: break-word; → casse les mots trop longs.hyphens: auto; → ajoute des tirets de césure (dépend de la langue du document).text-overflow: ellipsis; → affiche "..." si le texte déborde (nécessite
white-space: nowrap + overflow: hidden).
style.css
.max-3-lignes {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
width: 300px;
border: 1px solid #ddd;
padding: 10px;
}
/* Modern CSS (support limité) */
.modern-clamp {
line-clamp: 3;
overflow: hidden;
}
index.html
<div class="max-3-lignes">Ce texte très long va être tronqué après exactement trois lignes, avec des points de suspension. C’est très utile pour les résumés, extraits, ou cartes de contenu.</div>
-webkit-line-clamp (supportée partout sauf très anciens
navigateurs).line-clamp: 3; (en cours d’adoption).
style.css
.vertical {
writing-mode: vertical-rl; /* texte vertical de droite à gauche */
text-orientation: upright; /* caractères droits, pas tournés */
height: 150px;
background: #e3f2fd;
padding: 10px;
}
.arabe {
direction: rtl; /* right-to-left */
text-align: right;
font-family: "Amiri", serif;
}
index.html
<div class="vertical">TEXTE VERTICAL</div>
<p class="arabe">هذا نص باللغة العربية</p>
هذا نص باللغة العربية
writing-mode: vertical-rl; → pour les langues asiatiques ou effets design.text-orientation: upright; → garde les lettres droites.direction: rtl; → pour l’arabe, l’hébreu, etc.lang="ar" ou lang="ja" dans ton HTML pour l’accessibilité.
style.css
.curseur-personnalise {
caret-color: #ff5722; /* couleur du curseur de texte */
}
.selection-personnalisee::selection {
background: #ffeb3b; /* fond lors de la sélection */
color: #000;
}
.texte-variable {
--font-principale: "Georgia", serif;
font-family: var(--font-principale);
font-size: var(--taille-titre, 24px);
}
index.html
<input class="curseur-personnalise" type="text" value="Clique ici → curseur orange">
<p class="selection-personnalisee">Sélectionne ce texte pour voir le fond jaune.</p>
<p class="texte-variable">Texte avec police et taille en variables CSS.</p>
Sélectionne ce texte pour voir le fond jaune
Texte avec police et taille en variables CSS.
caret-color → personnalise le curseur clignotant dans les champs.::selection → style du texte sélectionné par l’utilisateur.clamp() pour la taille de police →
font-size: clamp(1rem, 2.5vw, 2rem); à ,
, → bon pour le SEO et l’accessibilité.font-family: "Custom", Arial, sans-serif;| Propriété | Valeurs courantes | Description |
|---|---|---|
color |
#ff0000, rgb(), blue |
Couleur du texte |
font-size |
16px, 1.2em, 5vw, clamp() |
Taille de la police |
font-family |
"Arial", sans-serif |
Police du texte |
font-weight |
400, 700, bold |
Épaisseur (gras) |
font-style |
normal, italic |
Style (italique) |
font-variant |
small-caps |
Petites majuscules |
text-align |
left, center, right, justify |
Alignement horizontal |
vertical-align |
baseline, top, middle, super |
Alignement vertical (inline) |
text-decoration |
underline, line-through, overline |
Décoration (souligné, barré...) |
text-transform |
uppercase, lowercase, capitalize |
Transformation maj/min |
letter-spacing |
2px |
Espace entre les lettres |
word-spacing |
5px |
Espace entre les mots |
line-height |
1.5, 24px |
Hauteur de ligne |
text-shadow |
2px 2px 4px #000 |
Ombre du texte |
white-space |
normal, nowrap, pre |
Gestion des espaces et retours |
text-overflow |
ellipsis, clip |
Comportement si débordement |
hyphens |
auto, manual |
Césure automatique |
-webkit-line-clamp |
3 |
Limite le nombre de lignes |
writing-mode |
horizontal-tb, vertical-rl |
Orientation du texte |
direction |
ltr, rtl |
Direction du texte (arabe...) |
caret-color |
#ff0000 |
Couleur du curseur clignotant |
::selection |
background: yellow; |
Style du texte sélectionné |
Le CSS permet de créer des arrière-plans riches, dynamiques et modernes : couleurs unies, images, dégradés linéaires/radiaux/coniques, superpositions, effets de mélange... Voici TOUT ce que tu dois maîtriser.
style.css
.texte-hex {
color: #ff5722; /* HEX */
}
.texte-rgb {
color: rgb(76, 175, 80); /* RGB */
}
.texte-hsl {
color: hsl(240, 100%, 50%); /* HSL → teinte, saturation, luminosité */
}
.texte-alpha {
color: rgba(255, 99, 132, 0.7); /* avec transparence */
}
.texte-lab {
color: lab(50% 40 20); /* Lab → perceptuel, moderne */
}
index.html
<div class="texte-hex">Texte en HEX (#ff5722)</div>
<div class="texte-rgb">Texte en RGB (76, 175, 80)</div>
<div class="texte-hsl">Texte en HSL (Bleu pur)</div>
<div class="texte-alpha">Texte semi-transparent (rgba)</div>
<div class="texte-lab">Texte en Lab (50% 40 20)</div>
Texte en HEX (#ff5722)
Texte en RGB (76, 175, 80)
Texte en HSL (Bleu pur)
Texte semi-transparent (rgba)
HEX → traditionnel (#rrggbb)RGB → rgb(rouge, vert, bleu) ou rgba(..., alpha)HSL → plus intuitif : hsl(teinte 0-360°, saturation %, luminosité %)Lab, LCH → couleurs perceptuelles, modernes, accessibles.
style.css
.fond-hsl {
background-color: hsl(200, 100%, 80%);
padding: 20px;
color: #333;
}
.fond-lab {
background-color: lch(75% 50 200); /* LCH → Lightness, Chroma, Hue */
padding: 20px;
color: #000;
}
index.html
<div class="fond-hsl">Fond en HSL (bleu clair)</div>
<div class="fond-lab">Fond en LCH (moderne, perceptuel)</div>
color s’appliquent à background-color.hsl() est excellent pour créer des variations de teinte (ex: thèmes dynamiques).lch() → le futur des couleurs CSS → plus proche de la perception humaine.
style.css
.fond-image {
background-image: url('https://via.placeholder.com/400x200');
background-repeat: no-repeat;
background-size: cover; /* ou contain, auto, 100% 100% */
background-position: center; /* ou top left, 50% 50%, etc. */
background-origin: padding-box; /* ou border-box, content-box */
background-clip: padding-box; /* où la couleur/dégradé est dessinée */
width: 300px;
height: 200px;
border: 10px dashed #333;
padding: 20px;
}
index.html
<div class="fond-image">Image de fond</div>
background-size: cover → remplit sans déformer.background-size: contain → montre toute l’image sans dépasser.background-position → positionne l’image (mots-clés ou %).background-origin → où commence le positionnement (padding, border, content).background-clip → où le fond est visible (padding, border, content, text !).
style.css
.texte-degrade {
background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1);
background-clip: text;
-webkit-background-clip: text; /* nécessaire pour Chrome/Safari */
color: transparent;
font-size: 2rem;
font-weight: bold;
margin: 20px 0;
}
index.html
<div class="texte-degrade">Texte en dégradé !</div>
background-clip: text; → le fond ne s’affiche QUE dans les lettres.color: transparent;-webkit-background-clip: text; pour la compatibilité.
style.css
.degrade-simple {
background: linear-gradient(to right, red, blue);
}
.degrade-angle {
background: linear-gradient(135deg, #ff9a9e, #fecfef, #fecfef, #ff9a9e);
}
.degrade-transparence {
background: linear-gradient(to bottom, rgba(255,255,255,0), rgba(0,0,0,0.8));
}
.degrade-arrets {
background: linear-gradient(to right, red 0%, yellow 50%, green 100%);
}
index.html
<div class="degrade-simple">Dégradé simple</div>
<div class="degrade-angle">Dégradé angle</div>
<div class="degrade-transparence">Dégradé transparence</div>
<div class="degrade-arrets">Dégradé arrêts</div>
to right, to bottom, 45deg, etc.red 0%, yellow 50% → contrôle précis.rgba() ou hsla() dans les dégradés.
style.css
.radial-simple {
background: radial-gradient(circle, yellow, red);
}
.radial-position {
background: radial-gradient(circle at 30% 70%, #ffecd2, #fcb69f);
}
.radial-taille {
background: radial-gradient(ellipse farthest-corner at center, #a8edea, #fed6e3);
}
circle, ellipseat center, at 20% 80%closest-side, farthest-corner, etc.
style.css
.conic-simple {
background: conic-gradient(red, yellow, blue);
border-radius: 50%;
}
.conic-angle {
background: conic-gradient(from 90deg, #ff9a9e 0%, #fecfef 50%, #ff9a9e 100%);
border-radius: 50%;
}
.conic-pie {
background: conic-gradient(
red 0% 25%,
blue 25% 50%,
green 50% 75%,
yellow 75% 100%
);
border-radius: 50%;
}
index.html
<div class="conic-simple">Conique simple</div>
<div class="conic-angle">Conique angle</div>
<div class="conic-pie">Conique pie</div>
conic-gradient([from angle]? [color start% end%]?)red 0% 25% → de 0 à 25% = rouge.
style.css
.repeating-linear {
background: repeating-linear-gradient(
45deg,
#606c88,
#606c88 10px,
#3f4c6b 10px,
#3f4c6b 20px
);
}
.repeating-radial {
background: repeating-radial-gradient(
circle at center,
#ff6b6b,
#ff6b6b 10px,
#ffeaa7 10px,
#ffeaa7 20px
);
}
.repeating-conic {
background: repeating-conic-gradient(
from 0deg,
#ff9a9e 0% 10%,
#fecfef 10% 20%
);
border-radius: 50%;
}
index.html
<div class="repeating-linear">Dégradé répété linéaire</div>
<div class="repeating-radial">Dégradé répété radial</div>
<div class="repeating-conic">Dégradé répété conique</div>
background-size pour contrôler la répétition.
style.css
.fond-multiple {
background:
linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5)), /* overlay noir semi-transparent */
url('https://images.pexels.com/photos/1103970/pexels-photo-1103970.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1');
background-size: cover;
background-position: center;
width: 300px;
height: 200px;
color: white;
padding: 20px;
text-align: center;
}
index.html
<div class="fond-multiple">Texte par-dessus fond + overlay</div>
background-size, position, etc. → sépare
aussi par virgules.
style.css
.blend-mode {
background:
radial-gradient(circle, rgba(255,0,0,0.8), transparent),
linear-gradient(45deg, blue, green);
background-blend-mode: multiply; /* ou screen, overlay, darken, lighten... */
width: 300px;
height: 150px;
}
index.html
<div class="blend-mode">Texte par-dessus fond + overlay</div>
background-blend-mode → mélange les couches de fond entre elles.multiply, screen, overlay, darken,
lighten, etc.mix-blend-mode (qui mélange avec le contenu au-dessus).
background-size: cover +
background-position: center pour les images hero.transparent pour des effets de fondu ou
superposition.outline pour voir
les limites de la boîte.color-mix(), accent-color,
@property pour des contrôles avancés.| Propriété | Valeurs courantes | Description |
|---|---|---|
color |
#ff0000, rgb(), hsl(), lab() |
Couleur du texte |
background-color |
blue, hsla(), transparent |
Couleur de fond |
background-image |
url(), linear-gradient(), radial-gradient() |
Image ou dégradé |
background-repeat |
repeat, no-repeat, repeat-x |
Répétition de l’image |
background-size |
cover, contain, 100% 100% |
Redimensionnement |
background-position |
center, top left, 50% 25% |
Positionnement |
background-origin |
padding-box, border-box, content-box |
Où commence le fond |
background-clip |
border-box, padding-box, content-box,
text |
Où le fond est visible |
background-blend-mode |
multiply, screen, overlay |
Mélange des fonds |
linear-gradient() |
to right, red, blue |
Dégradé linéaire |
radial-gradient() |
circle, red, blue |
Dégradé radial |
conic-gradient() |
from 0deg, red, blue |
Dégradé conique |
repeating-linear-gradient() |
45deg, red, red 10px, blue 10px, blue 20px |
Dégradé linéaire répété |
Chaque élément HTML est une boîte. Le box model contrôle son contenu, son padding, sa bordure, sa marge, et même son ombre ou son contour. Voici TOUT ce que tu dois maîtriser pour contrôler l’espace comme un pro.
style.css
.bordure-complete {
border: 4px dashed #ff5722;
border-radius: 12px; /* coins arrondis */
width: 180px;
height: 100px;
text-align: center;
line-height: 100px;
}
.bordure-côtés {
border-top: 3px solid #4caf50;
border-bottom: 6px double #2196f3;
border-radius: 0 0 20px 20px;
width: 180px;
height: 100px;
text-align: center;
line-height: 100px;
}
index.html
<div class="bordure-complete">Bordure pointillée</div>
<div class="bordure-côtés">Bordures top/bottom</div>
border: [épaisseur] [style] [couleur];solid, dashed, dotted, double,
groove, ridge, inset, outset.border-radius → coins arrondis (ex: 10px, 50% pour un
cercle).border-top, border-left, etc.
style.css
.bordure-image {
border: 20px solid transparent;
border-image: url('https://via.placeholder.com/100') 30 round;
width: 180px;
height: 100px;
text-align: center;
line-height: 100px;
}
index.html
<div class="bordure-image">Bordure image</div>
border-image → utilise une image pour la bordure.url() [slice] [repeat/stretch/round]
style.css
.marge-auto {
margin: 0 auto; /* centrage horizontal */
width: 150px;
height: 60px;
background: #e3f2fd;
text-align: center;
line-height: 60px;
}
.marge-negative {
margin-top: -20px;
margin-left: 30px;
width: 150px;
height: 60px;
background: #ffecb3;
text-align: center;
line-height: 60px;
}
.marge-collapse {
margin-top: 40px;
margin-bottom: 20px;
background: #c8e6c9;
padding: 10px;
}
.marge-collapse + .marge-collapse {
margin-top: 30px; /* ne sera PAS ajouté → collapse avec le margin-bottom du précédent */
}
index.html
<div class="marge-auto">Centré avec margin: auto</div>
<div class="marge-negative">Marge négative</div>
<div class="marge-collapse">Marge 40px top / 20px bottom</div>
<div class="marge-collapse">Marge 40px top / 20px bottom</div>
margin: 0 auto; → centre horizontalement un élément de largeur fixe.margin négative → permet de superposer ou rapprocher des éléments.
style.css
.padding-raccourci {
padding: 10px 20px 30px 40px; /* top, right, bottom, left */
background: #f3e5f5;
width: 200px;
text-align: center;
}
.padding-responsive {
padding: 2rem 5vw; /* unités fluides */
background: #e8f5e8;
text-align: center;
}
index.html
<div class="padding-raccourci">Padding 10/20/30/40</div>
<div class="padding-responsive">Padding fluide (2rem + 5vw)</div>
padding: 10px; → tous les côtéspadding: 10px 20px; → vertical / horizontalpadding: 10px 20px 30px; → top / horizontal / bottompadding: 10px 20px 30px 40px; → top / right / bottom / leftrem, %, vw pour du padding responsive.
style.css
.outline-custom {
outline: 4px dotted #ff9800;
outline-offset: 8px; /* décalage du contour */
width: 180px;
height: 80px;
background: #fff;
text-align: center;
line-height: 80px;
border: 2px solid #ddd;
}
index.html
<div class="outline-custom">Contour outline</div>
outline → contour dessiné autour de la bordure, n’affecte PAS le
layout.outline-offset → décale le contour vers l’extérieur.
style.css
.ombre-simple {
box-shadow: 5px 5px 10px rgba(0,0,0,0.3);
width: 180px;
height: 80px;
background: white;
text-align: center;
line-height: 80px;
}
.ombre-interne {
box-shadow: inset 0 0 15px rgba(0,0,0,0.2);
width: 180px;
height: 80px;
background: white;
text-align: center;
line-height: 80px;
}
.ombre-multiple {
box-shadow:
0 4px 8px rgba(0,0,0,0.2),
0 8px 16px rgba(0,0,0,0.15),
inset 0 2px 4px rgba(0,0,0,0.05);
width: 180px;
height: 80px;
background: white;
text-align: center;
line-height: 80px;
}
index.html
<div class="ombre-simple">Ombre externe</div>
<div class="ombre-interne">Ombre interne</div>
<div class="ombre-multiple">Ombres multiples</div>
box-shadow: [offsetX] [offsetY] [blur] [spread] [color] [inset?];inset → ombre à l’intérieur.
style.css
.content-box {
box-sizing: content-box; /* comportement par défaut */
width: 150px;
padding: 20px;
border: 5px solid #f44336;
background: #ffebee;
text-align: center;
}
.border-box {
box-sizing: border-box; /* padding et border inclus dans width/height */
width: 150px;
padding: 20px;
border: 5px solid #4caf50;
background: #e8f5e8;
text-align: center;
}
/* ✅ Recommandé : appliquer border-box à tout le site */
*, *::before, *::after {
box-sizing: border-box;
}
index.html
<div class="content-box">content-box → largeur totale = 150 + 40 + 10 = 200px</div>
<div class="border-box">border-box → largeur totale = 150px (padding et border inclus dedans)</div>
content-box (défaut) → width = contenu seulement. Padding et bordure
s’ajoutent.border-box → width = contenu + padding + bordure → prévisible, intuitif.*, *::before, *::after { box-sizing: border-box; } au début de ton
CSS → évite 90% des bugs de layout.
style.css
.responsive-box {
width: calc(100% - 40px); /* calcule dynamiquement */
max-width: 500px; /* ne dépasse pas */
min-height: 100px; /* hauteur minimale */
padding: 20px;
border: 2px solid #9c27b0;
background: #f3e5f5;
text-align: center;
}
index.html
<div class="responsive-box">Boîte fluide avec calc(), min-height, max-width</div>
min-width / max-width → contrôle les limites responsives.min-height / max-height → utile pour les cartes, sections, conteneurs
dynamiques.calc() → mélange unités : calc(100% - 2rem), calc(50vw + 100px)
→ très puissant.
style.css
.block {
display: block;
width: 150px;
height: 60px;
background: #bbdefb;
margin: 5px;
text-align: center;
line-height: 60px;
}
.inline {
display: inline;
width: 150px; /* ignoré ! */
height: 60px; /* ignoré ! */
background: #ffccbc;
padding: 20px; /* partiellement respecté */
margin: 20px; /* ignoré verticalement */
}
.inline-block {
display: inline-block;
width: 150px;
height: 60px;
background: #c5e1a5;
margin: 10px;
text-align: center;
line-height: 60px;
}
index.html
<div class="block">Block</div>
<span class="inline">Inline (largeur/hauteur ignorées)</span>
<div class="inline-block">Inline-Block</div>
display: block; → prend toute la largeur, respecte width/height, margin/padding.display: inline; → ne respecte PAS width/height, margin-top/bottom ignorées.display: inline-block; → garde les propriétés de bloc, mais reste en ligne → parfait pour
les icônes, boutons, cartes en ligne.
*, *::before, *::after { box-sizing: border-box; }
→ indispensable.margin: 0 auto; pour centrer un bloc avec largeur
définie.max-width + padding: 2rem 5vw; →
s’adapte à tous les écrans.outline sans fournir un
remplacement visible au focus.border-image lourd ou box-shadow
blur excessif sur des éléments animés.outline: 1px solid red; pour
visualiser les boîtes sans affecter le layout.| Propriété | Valeurs courantes | Description |
|---|---|---|
width / height |
200px, 50%, auto |
Dimensions de base |
min-width / max-width |
300px, 80vw |
Limites responsives |
padding |
10px, 1rem 2rem |
Espace intérieur |
border |
2px solid #000 |
Bordure (épaisseur/style/couleur) |
border-radius |
10px, 50% |
Coin arrondi |
border-image |
url() 30 round |
Bordure avec image |
margin |
20px, 0 auto, -10px |
Espace extérieur |
outline |
2px dotted red |
Contour (accessibilité, debug) |
outline-offset |
5px |
Décalage du contour |
box-shadow |
2px 2px 5px #000, inset ... |
Ombre (externe/interne) |
box-sizing |
content-box, border-box |
Mode de calcul des dimensions |
display |
block, inline, inline-block |
Comportement de la boîte |
calc() |
calc(100% - 40px) |
Calculs dynamiques |
border-box partout, joue avec les ombres, les marges négatives, les calc(), et
crée des layouts solides.Le positionnement en CSS permet de contrôler précisément où les éléments apparaissent à l’écran. Chaque type de positionnement a un comportement unique et des cas d’usage spécifiques.
style.css
.box-static {
position: static; /* Valeur par défaut - inutile de l'écrire */
top: 50px; /* IGNORÉ */
left: 50px; /* IGNORÉ */
background: #e0e0e0;
padding: 20px;
border: 2px solid #9e9e9e;
}
index.html
<div class="box-static">
Box STATIC → les propriétés top/left sont ignorées.
</div>
top/left sont ignorées.
position: static; → comportement normal du flux de document.top, right, bottom, left,
z-index n’ont aucun effet.
style.css
.box-relative {
position: relative;
top: 20px;
left: 30px;
background: #bbdefb;
padding: 20px;
border: 2px solid #2196f3;
}
index.html
<div class="box-relative">
Box RELATIVE → décalée de 20px vers le bas et 30px à droite, mais l’espace d’origine est conservé.
</div>
→ L’espace vide ci-dessus est réservé pour la position d’origine.
position: relative; → l’élément reste dans le flux normal, mais peut être décalé avec
top/left.absolute
enfants.
style.css
.container-relative {
position: relative;
height: 200px;
background: #ffe0b2;
padding: 20px;
border: 2px solid #ff9800;
}
.box-absolute {
position: absolute;
top: 20px;
right: 20px;
background: #ffccbc;
padding: 15px;
border: 2px solid #f44336;
}
index.html
<div class="container-relative">
<div class="box-absolute">
Box ABSOLUTE → positionnée en haut à droite du conteneur relatif.
</div>
</div>
Conteneur avec position: relative; → sert de référence à
l’élément absolute.
position: absolute; → sort l’élément du flux normal → les autres éléments l’ignorent.
style.css
.box-fixed {
position: fixed;
bottom: 20px;
right: 20px;
background: #c8e6c9;
padding: 15px;
border: 2px solid #4caf50;
z-index: 1000; /* pour rester au-dessus des autres éléments */
}
index.html
<div class="box-fixed">
Box FIXED → toujours en bas à droite, même en scrollant.
</div>
Scrolle vers le bas → la boîte verte reste fixe dans le coin de la fenêtre !
position: fixed; → toujours positionné par rapport à la fenêtre du
navigateur.z-index pour contrôler la superposition.
style.css
.box-sticky {
position: sticky;
top: 10px; /* colle quand le bord supérieur atteint 10px du haut de la zone de défilement */
background: #ffecb3;
padding: 15px;
border: 2px solid #ffc107;
z-index: 10;
}
.scroll-container {
height: 200px;
overflow-y: scroll;
border: 2px solid #ff9800;
padding: 20px;
background: #fff3e0;
}
index.html
<div class="scroll-container">
<div class="box-sticky">
Box STICKY → devient fixe quand tu scroll et qu’elle atteint 10px du haut.
</div>
</div>
Contenu avant (scroll pour voir l’effet sticky)...
----------
Contenu après → scroll encore...
Fin du conteneur.
position: sticky; → se comporte comme relative jusqu’à un seuil de scroll,
puis comme fixed.top, bottom, etc.
style.css
.parent {
position: relative;
z-index: 1; /* crée un contexte d'empilement */
}
.child {
position: absolute;
z-index: 10; /* 10 est relatif au parent, pas à la page ! */
}
.other-element {
position: relative;
z-index: 2; /* sera au-dessus du parent, mais pas des enfants du parent */
}
index.html
<div class="parent">
<div class="child">
Enfant (z-index: 10) → au-dessus du parent, mais dans son contexte
</div>
</div>
<div class="other-element">
Autre élément (z-index: 2) → au-dessus du parent, mais en dessous de l’enfant si chevauchement
</div>
z-index ne fonctionne que sur les éléments positionnés (non-static).z-index crée un contexte d’empilement → les enfants sont comparés entre
eux, pas avec le reste de la page.z-index → empilés par ordre d’apparition dans le DOM.
style.css
.box-inset {
position: absolute;
inset: 10px; /* = top:10px; right:10px; bottom:10px; left:10px; */
/* inset: 10px 20px; → vertical/horizontal */
/* inset: 10px 20px 30px 40px; → top/right/bottom/left */
background: #e8eaf6;
border: 2px solid #3f51b5;
padding: 10px;
}
index.html
<div class="box-inset">
Box avec inset: 10px; → remplit tout le conteneur avec 10px de marge.
</div>
inset: 10px; → remplit tout le conteneur avec 10px de marge.
inset → raccourci moderne pour
top/right/bottom/left.inset: 10px; → tous les côtésinset: 10px 20px; → vertical / horizontalinset: 10px 20px 30px 40px; → top / right / bottom / left| Valeur | Dans le flux ? | Référence | Cas d’usage |
|---|---|---|---|
static |
Oui | Aucune | Comportement par défaut |
relative |
Oui | Position initiale | Décalage léger, parent pour absolute |
absolute |
Non | Ancêtre positionné | Tooltips, badges, modales internes |
fixed |
Non | Viewport (fenêtre) | Navbar fixe, bouton flottant |
sticky |
Oui (puis non) | Conteneur scrollable | Headers collants, filtres, titres |
relative comme parent, absolute pour les décos, fixed
pour les outils globaux, sticky pour l’UX.Les variables CSS (aussi appelées “Custom Properties”) permettent de stocker des valeurs réutilisables : couleurs, espacements, polices, etc. Elles rendent ton CSS modulaire, maintenable, et dynamique — surtout en combinaison avec JavaScript.
style.css
:root {
--primary-color: #2196f3;
--spacing-unit: 16px;
--font-main: "Arial", sans-serif;
}
.button {
background: var(--primary-color);
padding: var(--spacing-unit);
font-family: var(--font-main);
color: white;
border: none;
border-radius: 4px;
}
.card {
background: white;
padding: var(--spacing-unit);
margin-bottom: var(--spacing-unit);
border: 1px solid var(--primary-color);
}
index.html
<button class="button">Bouton avec variables CSS</button>
<div class="card">Carte avec variables CSS → même espacement et couleur que le bouton.</div>
--nom-variable: valeur;var(--nom-variable):root = pseudo-classe qui cible l’élément racine () → variables
globales.
style.css
.theme-dark {
--bg-color: #333;
--text-color: #f5f5f5;
--border-color: #555;
background: var(--bg-color);
color: var(--text-color);
padding: 20px;
border: 2px solid var(--border-color);
}
.theme-light {
--bg-color: #f9f9f9;
--text-color: #333;
--border-color: #ddd;
background: var(--bg-color);
color: var(--text-color);
padding: 20px;
border: 2px solid var(--border-color);
}
index.html
<div class="theme-dark">Thème sombre → variables locales à ce conteneur.</div>
<div class="theme-light">Thème clair → variables locales à ce conteneur.</div>
style.css
.button-safe {
background: var(--button-color, #9e9e9e); /* gris par défaut si --button-color n'existe pas */
color: var(--text-color, white);
padding: 12px 24px;
border: none;
}
index.html
<button class="button-safe">Bouton sans variable définie → fallback gris</button>
<button class="button-safe" style="--button-color: #ff5722;">Bouton avec --button-color → orange vif</button>
var(--nom, valeur-par-défaut)var(--border-radius, 4px).
style.css
.dynamic-theme {
background: var(--bg-dynamic, #e0e0e0);
color: var(--text-dynamic, #333);
padding: 30px;
text-align: center;
transition: background 0.3s, color 0.3s;
}
index.html
<div id="theme-box">Change le thème avec les boutons ci-dessous 👇</div>
element.style.setProperty('--ma-variable', 'nouvelle-valeur');
style.css
:root {
--base-spacing: 8px;
--gutter: calc(var(--base-spacing) * 2);
--max-width: calc(100% - var(--gutter) * 2);
}
.container {
max-width: var(--max-width);
margin: 0 auto;
padding: var(--gutter);
background: #e3f2fd;
border: 2px solid #2196f3;
}
index.html
<div class="container">Conteneur avec espacement et largeur calculés via variables + calc().</div>
calc() → pour des calculs dynamiques.calc(var(--espacement) * 3), calc(100vw - var(--sidebar-width)).
style.css
@property --hue {
syntax: "";
inherits: false;
initial-value: 0;
}
.animated-hue {
--hue: 0;
background: hsl(var(--hue), 100%, 50%);
padding: 30px;
color: white;
text-align: center;
animation: changeHue 5s infinite linear;
}
@keyframes changeHue {
to {
--hue: 360;
}
}
index.html
<div class="animated-hue">Animation de teinte via variable CSS animée (avec @property)</div>
@property.syntax) → pour permettre l’interpolation.@property, les variables ne s’animent pas (changement brutal).
style.css
:root {
--font-size: 16px;
--container-padding: 20px;
}
@media (min-width: 768px) {
:root {
--font-size: 18px;
--container-padding: 40px;
}
}
.responsive-box {
font-size: var(--font-size);
padding: var(--container-padding);
background: #fff3e0;
border: 2px solid #ff9800;
text-align: center;
}
@media → tout ce qui utilise ces variables s’adapte
automatiquement.--bp-tablet: 768px; puis
@media (min-width: var(--bp-tablet)).
--primary-color, --spacing-md,
--border-radius-lg.var(--color, #000) → évite les surprises.| Concept | Syntaxe | Description |
|---|---|---|
| Déclaration | --ma-var: #ff0000; |
Dans n’importe quel sélecteur |
| Utilisation | color: var(--ma-var); |
Applique la valeur stockée |
| Fallback | var(--ma-var, #000) |
Valeur par défaut si non définie |
| Portée | :root ou sélecteur local |
Héritage : enfants peuvent les utiliser |
| JS | element.style.setProperty('--ma-var', 'blue'); |
Modification dynamique |
| calc() | width: calc(var(--base) * 2); |
Calculs avec variables |
| Animation | @property + @keyframes |
Interpolation de variables (moderne) |
| Media Queries | @media { :root { --var: new; } } |
Responsive via redéfinition |
:root, utilise partout, modifie avec JS, anime avec
@property.
Quand tu mets une image () dans un conteneur de taille fixe, elle peut se déformer.
object-fit et object-position permettent de contrôler son redimensionnement et
son positionnement — sans déformation, comme avec background-size.
style.css
.image-container {
width: 200px;
height: 150px;
border: 2px solid #f44336;
margin: 10px;
}
img {
width: 100%;
height: 100%;
}
index.html
<div class="image-container">
<img src="image.jpg" alt="description">
</div>
object-fit, l’image est étirée ou écrasée pour remplir le conteneur
→ déformation.object-fit → préserve le ratio, comme background-size mais pour
les balises ![]()
.
style.css
.img-cover {
width: 100%;
height: 100%;
object-fit: cover; /* Remplit, déborde si nécessaire */
}
index.html
<div class="image-container">
<img src="image.jpg" alt="description" class="img-cover">
</div>
object-fit: cover; → l’image remplit le conteneur en conservant son
ratio → certaines parties peuvent être rognées.background-size: cover; mais pour les ![]()
.
style.css
.img-contain {
width: 100%;
height: 100%;
object-fit: contain; /* Contenu entier visible, peut laisser des espaces */
background: #f5f5f5; /* pour voir les espaces */
}
index.html
<div class="image-container">
<img src="image.jpg" alt="description" class="img-contain">
</div>
object-fit: contain; → l’image est entièrement visible, sans déformation
→ mais peut laisser des espaces vides.background-size: contain;.
style.css
.img-fill {
object-fit: fill; /* Étire pour remplir → déformation */
}
.img-scale-down {
object-fit: scale-down; /* Comme none ou contain, selon la taille */
}
.img-none {
object-fit: none; /* Garde taille originale, peut déborder */
}
index.html
<div class="image-container">
<img src="image.jpg" alt="description" class="img-fill">
</div>
fill → déformé
scale-down → comme contain
none → taille originale, rogné
fill → étire l’image pour remplir → déformation (à éviter sauf cas très
spécifiques).scale-down → choisit entre none et contain selon ce qui rend
l’image la plus petite.none → garde la taille originale de l’image → peut déborder ou laisser de l’espace.cover ou contain.
style.css
.img-cover-top {
object-fit: cover;
object-position: top; /* ou center, bottom, left, 50% 20%, etc. */
}
.img-cover-bottom {
object-fit: cover;
object-position: bottom;
}
index.html
<div class="image-container">
<img src="image.jpg" alt="description" class="img-cover-top">
</div>
object-position: top;
object-position: bottom;
object-position: 20% 70%;
object-position fonctionne comme background-position.center, top left, 50% 25%, etc.cover → pour choisir quelle partie de l’image reste visible (ex: visage
dans un avatar).
style.css
/* Avec background-image */
.bg-cover {
width: 200px;
height: 150px;
background: url('image.jpg') center/cover no-repeat;
}
/* Avec
+ object-fit */
.img-cover {
width: 200px;
height: 150px;
object-fit: cover;
object-position: center;
}
index.html
<div class="image-container">
<img src="image.jpg" alt="description" class="img-cover">
</div>
| Critère | background-image | |
|---|---|---|
| ✅ Accessibilité | Oui → alt text | Non → invisible aux lecteurs d’écran |
| ✅ SEO | Oui → les images sont crawlées | Non → ignorées par les moteurs |
| ✅ Chargement | Prioritaire (contenu) | Moins prioritaire (décoratif) |
| ✅ JS / Manipulation | Accès direct à l’élément | Moins direct |
| ✅ Responsive (srcset) | Oui → |
Non → une seule image |
![]()
+ object-fit quand :srcset pour la performance
responsive.background-image quand :
→ accessibilité
obligatoire.srcset pour charger la bonne image selon
l’écran.background: linear-gradient(...); à
l’image → évite le vide pendant le chargement.![]()
→ performance sur les longues
pages.| Propriété | Valeurs | Description |
|---|---|---|
object-fit |
cover |
Remplit le conteneur, rogne si nécessaire (ratio conservé) |
object-fit |
contain |
Montre toute l’image, ajoute des bandes si nécessaire |
object-fit |
fill |
Étire pour remplir → déformation |
object-fit |
none |
Taille originale, peut déborder |
object-fit |
scale-down |
Comme none ou contain, selon la taille la plus petite |
object-position |
center, top left, 50% 25% |
Positionne l’image dans le conteneur |
![]()
+ object-fit: cover pour le contenu,
background-image pour le décor.Flexbox est un module CSS qui permet de disposer facilement des éléments dans une ligne ou une colonne, de gérer l’alignement et l’espacement automatiquement.
style.css
.container {
display: flex;
border: 2px solid black;
padding: 10px;
}
.item {
background-color: lightblue;
margin: 5px;
padding: 20px;
}
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
display: flex; transforme un conteneur en flexbox et aligne les éléments en ligne par
défaut.
style.css
.container {
display: flex;
justify-content: space-between;
border: 2px solid black;
padding: 10px;
}
index.html
<div class="container">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
</div>
justify-content contrôle l’espace horizontal entre les éléments :
flex-start, center, flex-end, space-between,
space-around.
style.css
.container {
display: flex;
align-items: center;
height: 150px;
border: 2px solid black;
}
.item {
background-color: pink;
margin: 5px;
padding: 20px;
}
index.html
<div class="container">
<div class="item">X</div>
<div class="item">Y</div>
<div class="item">Z</div>
</div>
align-items aligne les éléments verticalement dans le conteneur :
flex-start, center, flex-end, stretch.
style.css
.container {
display: flex;
flex-direction: column;
border: 2px solid black;
padding: 10px;
}
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
flex-direction: column; place les éléments verticalement.
Par défaut, les éléments sont alignés horizontalement (row).
style.css
.container {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
border: 2px solid black;
padding: 10px;
height: 150px;
}
.item {
background-color: lightseagreen;
padding: 20px;
margin: 5px;
}
index.html
<div class="container">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
</div>
flex-direction)justify-content)align-items)
Flexbox ne se limite pas à justify-content ou align-items.
Voici TOUT ce que tu dois savoir pour dominer les layouts modernes.
style.css
.container {
display: flex;
flex-wrap: wrap; /* Permet aux éléments de passer à la ligne */
width: 300px;
border: 2px solid #555;
padding: 10px;
}
.item {
background-color: #ffcc80;
margin: 5px;
padding: 20px;
min-width: 100px; /* Forcer un minimum pour tester le wrap */
}
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
flex-wrap: wrap; permet aux éléments de passer à la ligne si le conteneur est trop
étroit.nowrap (défaut), wrap, wrap-reverse.
style.css
.container {
display: flex;
flex-flow: column wrap; /* = flex-direction + flex-wrap */
height: 200px;
border: 2px solid #555;
padding: 10px;
}
.item {
background-color: #a5d6a7;
margin: 5px;
padding: 20px;
min-height: 80px;
}
index.html
<div class="container">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
<div class="item">D</div>
</div>
flex-flow est un raccourci pour flex-direction + flex-wrap.flex-flow: row wrap; ou flex-flow: column nowrap;.
style.css
.container {
display: flex;
flex-wrap: wrap;
align-content: space-between; /* Espace entre les lignes */
height: 300px;
border: 2px solid #555;
padding: 10px;
}
.item {
background-color: #bbdefb;
margin: 5px;
padding: 20px;
min-width: 120px;
}
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
align-content gère l’espace entre les lignes (quand il y a plusieurs
lignes avec flex-wrap).justify-content mais verticalement : flex-start,
center, space-between, etc.wrap).
style.css
.container {
display: flex;
border: 2px solid #555;
padding: 10px;
}
.item:nth-child(1) { order: 3; }
.item:nth-child(2) { order: 1; }
.item:nth-child(3) { order: 2; }
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
order change l’ordre d’affichage visuel (sans modifier le DOM).0. Plus le chiffre est bas, plus l’élément est en premier.
style.css
.container {
display: flex;
border: 2px solid #555;
padding: 10px;
}
.item:nth-child(1) { flex-grow: 1; }
.item:nth-child(2) { flex-grow: 2; } /* Prend 2x plus d’espace */
.item:nth-child(3) { flex-grow: 1; }
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
flex-grow définit comment l’élément occupe l’espace restant.flex-grow: 2 et les autres 1, il prendra 2
fois plus d’espace.
style.css
.container {
display: flex;
width: 300px;
border: 2px solid #555;
padding: 10px;
}
.item {
min-width: 120px; /* Forcer un débordement */
}
.item:nth-child(1) { flex-shrink: 1; }
.item:nth-child(2) { flex-shrink: 3; } /* Rétrécit 3x plus */
.item:nth-child(3) { flex-shrink: 1; }
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
flex-shrink définit comment l’élément rétrécit s’il n’y a pas assez
d’espace.1. Plus la valeur est élevée, plus il rétrécit.
style.css
.container {
display: flex;
border: 2px solid #555;
padding: 10px;
}
.item:nth-child(1) { flex-basis: 50px; }
.item:nth-child(2) { flex-basis: 150px; }
.item:nth-child(3) { flex-basis: auto; }
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
flex-basis définit la taille initiale de l’élément avant que grow/shrink
ne s’appliquent.px, %, auto (défaut = taille du contenu).
style.css
.container {
display: flex;
border: 2px solid #555;
padding: 10px;
}
.item:nth-child(1) { flex: 1 1 100px; } /* grow shrink basis */
.item:nth-child(2) { flex: 2 1 50px; }
.item:nth-child(3) { flex: 0 0 120px; } /* Ne grandit ni ne rétrécit */
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
flex est un raccourci pour flex-grow flex-shrink
flex-basis.flex: 1 1 auto; (valeur par défaut)flex: 0 0 200px; → taille fixe, ne grandit ni ne rétrécit.
style.css
.container {
display: flex;
align-items: flex-start; /* Alignement par défaut */
height: 150px;
border: 2px solid #555;
padding: 10px;
}
.item:nth-child(2) {
align-self: flex-end; /* Override pour cet élément */
}
index.html
<div class="container">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
</div>
align-self permet de surcharger align-items pour un élément
spécifique.flex-start, center, baseline,
stretch, etc.
justify-content: center; align-items: center;
justify-content: space-around;flex-direction: column sur mobile + media
queries.min-width: 0 ou
overflow: hidden sur les éléments flex si tu as des problèmes de débordement.flex: 1 1 0% → très utile pour remplir l’espace restant.
flex: 0 0 auto → taille fixe, ne grandit ni ne
rétrécit.| Propriété | Appliquée à | Valeurs courantes |
|---|---|---|
display: flex |
Conteneur | - |
flex-direction |
Conteneur | row, column, row-reverse, column-reverse
|
flex-wrap |
Conteneur | nowrap, wrap, wrap-reverse |
flex-flow |
Conteneur | [direction] [wrap] |
justify-content |
Conteneur | flex-start, center, space-between,
space-around, space-evenly |
align-items |
Conteneur | stretch, flex-start, center, baseline
|
align-content |
Conteneur | stretch, center, space-between (multi-ligne
uniquement) |
order |
Élément | 0, 1, 2... |
flex-grow |
Élément | 0, 1, 2... |
flex-shrink |
Élément | 0, 1, 2... |
flex-basis |
Élément | auto, 0, 100px, 50% |
flex |
Élément | 0 1 auto, 1 1 0%, none |
align-self |
Élément | auto, flex-start, center, stretch |
CSS Grid est un système de mise en page puissant qui permet de placer les éléments dans des lignes et colonnes de façon précise.
style.css
.container {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-gap: 10px;
border: 2px solid black;
padding: 10px;
}
.item {
background-color: lightblue;
padding: 20px;
}
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
display: grid; transforme le conteneur en grid.
grid-template-columns définit le nombre et la taille des colonnes.
grid-gap définit l’espace entre les cellules.
style.css
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 10px;
}
.item {
background-color: lightgreen;
padding: 20px;
}
index.html
<div class="container">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
<div class="item">D</div>
</div>
repeat(3, 1fr) crée 3 colonnes égales. 1fr = une fraction de l’espace
disponible.
style.css
.container {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 50px 50px;
grid-gap: 5px;
}
.item1 {
grid-column: 1 / 3; /* commence à la colonne 1, finit avant la colonne 3 */
grid-row: 1 / 2; /* ligne 1 */
background-color: lightcoral;
padding: 10px;
}
.item2 { background-color: lightblue; padding: 10px; }
.item3 { background-color: lightgreen; padding: 10px; }
index.html
<div class="container">
<div class="item1">1</div>
<div class="item2">2</div>
<div class="item3">3</div>
</div>
grid-column et grid-row permettent de positionner précisément chaque élément
sur la grille.
style.css
.container {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 50px 100px;
grid-gap: 10px;
}
.item1 { grid-column: 1 / 4; background-color: lightcoral; padding: 10px; }
.item2 { background-color: lightblue; padding: 10px; }
.item3 { background-color: lightgreen; padding: 10px; }
.item4 { background-color: lightpink; padding: 10px; }
index.html
<div class="container">
<div class="item1">Header</div>
<div class="item2">Sidebar</div>
<div class="item3">Content</div>
<div class="item4">Footer</div>
</div>
grid-column et grid-row.
CSS Grid va bien au-delà des colonnes fixes. Voici TOUT ce que tu dois savoir pour créer des layouts 2D puissants, réactifs et élégants.
style.css
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar content content"
"footer footer footer";
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 60px 150px 60px;
gap: 10px;
border: 2px solid #555;
padding: 10px;
}
.header { grid-area: header; background: #ffab91; }
.sidebar { grid-area: sidebar; background: #a5d6a7; }
.content { grid-area: content; background: #90caf9; }
.footer { grid-area: footer; background: #fff59d; }
.item { padding: 20px; text-align: center; }
index.html
<div class="container">
<div class="item">Header</div>
<div class="item">Sidebar</div>
<div class="item">Content</div>
<div class="item">Footer</div>
</div>
grid-template-areas permet de nommer visuellement les zones de la
grille.grid-area: [nom];
style.css
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 15px;
border: 2px solid #555;
padding: 10px;
}
.item {
background-color: #e1bee7;
padding: 20px;
text-align: center;
}
index.html
<div class="container">
<div class="item">Card 1</div>
<div class="item">Card 2</div>
<div class="item">Card 3</div>
<div class="item">Card 4</div>
<div class="item">Card 5</div>
</div>
1fr = fraction de l’espace restant.minmax(150px, 1fr) = taille min 150px, max 1 fraction.auto-fit = ajuste automatiquement le nombre de colonnes en fonction de l’espace
disponible → responsive sans media query !
style.css
.container {
display: grid;
grid-template-columns: repeat(3, 100px);
justify-items: center; /* horizontal dans chaque cellule */
align-items: end; /* vertical dans chaque cellule */
height: 150px;
border: 2px solid #555;
gap: 10px;
padding: 10px;
}
.item {
background-color: #c5e1a5;
padding: 10px;
text-align: center;
}
index.html
<div class="container">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
<div class="item">D</div>
</div>
justify-items → alignement horizontal à l’intérieur de chaque cellule
(start, center, end, stretch).align-items → alignement vertical dans chaque cellule.place-items: center; → raccourci pour les deux.
style.css
.container {
display: grid;
grid-template-columns: repeat(2, 100px);
justify-content: center; /* aligne la grille HORIZONTALEMENT dans le conteneur */
align-content: end; /* aligne la grille VERTICALEMENT */
width: 100%;
height: 200px;
border: 2px solid #555;
gap: 10px;
padding: 10px;
}
.item {
background-color: #b39ddb;
padding: 20px;
text-align: center;
}
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
justify-content → aligne la grille entière horizontalement dans le
conteneur.align-content → aligne la grille verticalement.
style.css
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
border: 2px solid #555;
padding: 10px;
}
.item1 {
grid-column: 2 / span 2; /* commence à 2, s'étend sur 2 colonnes */
grid-row: 1;
background: #ffcc80;
}
.item2 {
grid-column: 1 / 5; /* occupe toute la largeur */
grid-row: 2;
background: #81d4fa;
}
index.html
<div class="container">
<div class="item1">Item 1 (span 2)</div>
<div class="item2">Item 2 (full width)</div>
</div>
grid-column: 2 / span 2; → commence à la colonne 2, s’étend sur 2 colonnes.grid-column: 1 / -1; → occupe de la première à la dernière colonne (très utile pour les
headers/footers).grid-row: 1 / 3; → occupe les lignes 1 et 2.
style.css
.container {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-auto-flow: row dense; /* remplit les trous */
gap: 10px;
border: 2px solid #555;
padding: 10px;
}
.item1 {
grid-column: span 2;
background: #a5d6a7;
}
.item3 {
grid-row: span 2;
background: #ffab91;
}
index.html
<div class="container">
<div class="item1">Item 1 (span 2)</div>
<div class="item2">Item 2</div>
<div class="item3">Item 3 (span 2 rows)</div>
<div class="item4">Item 4</div>
</div>
grid-auto-flow: row; → placement par défaut, ligne par ligne.grid-auto-flow: column; → placement colonne par colonne.grid-auto-flow: row dense; → remplit les trous laissés par les éléments étendus → évite
les espaces vides.
style.css
.container {
display: grid;
grid-template-columns: 100px 100px;
grid-auto-rows: 60px; /* hauteur des lignes auto-créées */
grid-auto-columns: 80px; /* largeur des colonnes auto-créées */
gap: 10px;
border: 2px solid #555;
padding: 10px;
}
.item5 {
grid-column: 3; /* déclenche une colonne implicite */
background: #f48fb1;
}
index.html
<div class="container">
<div class="item1">1</div>
<div class="item2">2</div>
<div class="item3">3</div>
<div class="item4">4</div>
<div class="item5">5</div>
</div>
grid-auto-rows et grid-auto-columns permettent de contrôler leur taille.
style.css
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
align-items: start;
justify-items: start;
height: 150px;
border: 2px solid #555;
gap: 10px;
padding: 10px;
}
.item2 {
justify-self: end;
align-self: end;
background: #fff59d;
}
index.html
<div class="container">
<div class="item1">1</div>
<div class="item2">2</div>
<div class="item3">3</div>
</div>
justify-self et align-self permettent de surcharger
l’alignement pour un élément spécifique.place-self: center; → raccourci pour les deux.
style.css
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px 10px; /* row-gap / column-gap */
border: 2px solid #555;
padding: 10px;
}
.item { background: #e0e0e0; padding: 20px; text-align: center; }
index.html
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
gap remplace grid-gap (obsolète).gap: [row-gap] [column-gap]; → si une seule valeur, s’applique aux deux.row-gap et column-gap individuellement.
place-self: center; ou
margin: auto; dans une cellule.grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));grid-column: 1 / -1;padding sur le conteneur +
gap entre les éléments.outline: 1px solid red; sur les
items pour voir la grille.| Propriété | Appliquée à | Description |
|---|---|---|
display: grid |
Conteneur | Active le layout Grid |
grid-template-columns |
Conteneur | Définit les colonnes (1fr, 100px, repeat()) |
grid-template-rows |
Conteneur | Définit les lignes |
grid-template-areas |
Conteneur | Définit un layout visuel avec noms de zones |
gap |
Conteneur | Espace entre les cellules (row-gap, column-gap) |
justify-items |
Conteneur | Alignement horizontal dans chaque cellule |
align-items |
Conteneur | Alignement vertical dans chaque cellule |
justify-content |
Conteneur | Alignement horizontal de la grille dans le conteneur |
align-content |
Conteneur | Alignement vertical de la grille dans le conteneur |
grid-auto-flow |
Conteneur | Contrôle le placement automatique (row, column,
dense) |
grid-auto-rows |
Conteneur | Taille des lignes implicites |
grid-auto-columns |
Conteneur | Taille des colonnes implicites |
grid-column |
Élément | Positionnement horizontal (start / end, span) |
grid-row |
Élément | Positionnement vertical |
grid-area |
Élément | Zone nommée ou raccourci row-start / col-start / row-end / col-end |
justify-self |
Élément | Alignement horizontal individuel |
align-self |
Élément | Alignement vertical individuel |
place-self |
Élément | Raccourci align-self + justify-self |
Le responsive design permet à ton site de s’adapter automatiquement à la taille de l’écran de l’utilisateur : mobile, tablette, desktop, TV, etc. Voici TOUT ce que tu dois maîtriser.
index.html
width=device-width : largeur = largeur de l’écran.initial-scale=1.0 : pas de zoom initial.
style.css
.container {
width: 90%; /* relatif au parent */
max-width: 1200px; /* mais ne dépasse pas 1200px */
margin: 0 auto;
padding: 2rem; /* relatif à la taille de la police de base */
}
.title {
font-size: 5vw; /* 5% de la largeur de la fenêtre */
margin-bottom: 2em; /* relatif à la taille de la police du parent */
}
.full-height {
height: 80vh; /* 80% de la hauteur de la fenêtre */
}
% → relatif au parent.vw (viewport width) / vh (viewport height) → relatif à la taille de la
fenêtre.rem → relatif à la racine (html).em → relatif au parent direct.max-width avec % pour éviter les débordements sur grand
écran.
style.css
/* Mobile First : styles de base pour petits écrans */
.card {
width: 100%;
padding: 1rem;
margin-bottom: 1rem;
background: #e3f2fd;
}
/* Tablettes (768px et +) */
@media (min-width: 768px) {
.card {
width: 48%;
display: inline-block;
margin-right: 1%;
}
}
/* Desktop (1024px et +) */
@media (min-width: 1024px) {
.card {
width: 30%;
margin-right: 1.5%;
}
}
@media (condition) { ... }min-width.< 768px768px - 1023px>= 1024px>= 1440px
style.css
.container {
padding: 20px;
background: #fff3e0;
}
@media (orientation: landscape) {
.container {
padding: 50px;
background: #e8f5e8;
}
}
@media (orientation: portrait) ou landscape
style.css
img {
max-width: 100%; /* jamais plus large que le conteneur */
height: auto; /* conserve le ratio */
display: block; /* évite l’espace en dessous */
}
/* HTML moderne avec srcset (pour la performance) */
index.html
max-width: 100%; est ESSENTIEL pour les images.srcset + sizes → charge l’image adaptée à la taille d’écran → gain de
performance. pour des images différentes selon le contexte (ex: dark mode,
format webp).
/* ✅ MOBILE FIRST (commence petit, étends pour grand) */
.nav { display: none; } /* caché par défaut sur mobile */
@media (min-width: 768px) {
.nav { display: block; } /* visible sur tablette+ */
}
/* ❌ DESKTOP FIRST (déconseillé) */
.nav { display: block; } /* visible par défaut */
@media (max-width: 768px) {
.nav { display: none; } /* caché sur mobile */
}
style.css
h1 {
font-size: clamp(1.5rem, 4vw, 3rem);
/* min, preferred, max */
}
/* OU avec calc + media queries */
h2 {
font-size: 1.8rem;
}
@media (min-width: 768px) {
h2 {
font-size: calc(1.8rem + 0.5 * (100vw - 768px) / 456);
}
}
Réduis/agrandis la fenêtre → le titre s’adapte doucement.
clamp(min, preferred, max) → typographie fluide sans media query.clamp(1rem, 2.5vw, 2rem) → jamais moins de 1rem, jamais plus de 2rem, fluide entre
les deux.calc() + media queries pour un contrôle plus fin.
style.css
.container {
display: flex;
flex-direction: column; /* mobile : colonne */
gap: 1rem;
}
@media (min-width: 768px) {
.container {
flex-direction: row; /* tablette+ : ligne */
}
}
/* Avec Grid */
.grid {
display: grid;
grid-template-columns: 1fr; /* une colonne sur mobile */
gap: 1rem;
}
@media (min-width: 768px) {
.grid {
grid-template-columns: repeat(2, 1fr); /* deux colonnes */
}
}
@media (min-width: 1024px) {
.grid {
grid-template-columns: repeat(3, 1fr); /* trois colonnes */
}
}
flex-direction ou grid-template-columns dans les media queries.gap pour un espacement fluide.
style.css
:root {
--bp-mobile: 480px;
--bp-tablet: 768px;
--bp-desktop: 1024px;
--bp-lg: 1440px;
}
@media (min-width: var(--bp-tablet)) {
.sidebar { display: block; }
}
@media (min-width: var(--bp-desktop)) {
.container { max-width: 1200px; }
}
max-width + % ou
fr.| Concept | Outil CSS | Exemple / Usage |
|---|---|---|
| Viewport | |
Indispensable pour le mobile |
| Unités fluides | %, vw, vh, rem |
Largeurs/hauteurs/tailles adaptables |
| Media Queries | @media (min-width: ...) |
Styles conditionnels selon la taille |
| Mobile First | min-width |
Commencer petit, étendre vers grand |
| Images | max-width: 100% + srcset |
Images adaptatives et performantes |
| Typographie fluide | clamp() |
Texte qui s’adapte sans saut |
| Flex/Grid responsive | @media + changement de direction/colonnes |
Réorganiser les layouts |
| Breakpoints sémantiques | --bp-tablet (variables CSS) |
Code plus maintenable |
| Orientation | @media (orientation: ...) |
Styles paysage/portrait |
CSS permet d’ajouter du mouvement et des effets interactifs avec les propriétés transition,
transform et @keyframes.
style.css
button {
background-color: lightblue;
padding: 10px 20px;
border: none;
transition: background-color 0.5s, transform 0.3s;
}
button:hover {
background-color: lightgreen;
transform: scale(1.2);
}
index.html
<button>Hover moi</button>
transition permet d’ajouter un effet progressif lors d’un changement de propriété (ici
couleur et taille).
style.css
div {
width: 100px;
height: 100px;
background-color: coral;
transition: transform 0.5s;
}
div:hover {
transform: rotate(45deg) scale(1.5);
}
index.html
<div></div>
transform permet de faire tourner (rotate), agrandir/réduire
(scale), déplacer (translate) ou incliner (skew) un élément.
style.css
@keyframes example {
0% { background-color: red; left: 0px; }
50% { background-color: yellow; left: 50px; }
100% { background-color: red; left: 0px; }
}
div {
width: 50px;
height: 50px;
position: relative;
animation: example 3s infinite;
}
index.html
<div></div>
@keyframes définit une animation étape par étape.
animation: example 3s infinite; lance l’animation pendant 3 secondes en boucle infinie.
animation-name: nom_de_l_animation;
animation-duration: 2s;
animation-iteration-count: infinite / 1 / 3 ...;
animation-timing-function: linear / ease / ease-in / ease-out;
animation-delay: 1s;
animation-direction: normal / reverse / alternate;
CSS permet de créer des interfaces dynamiques, fluides et engageantes sans JavaScript.
Voici TOUT ce que tu dois savoir sur transition, transform,
@keyframes, et les bonnes pratiques de performance.
style.css
.button {
background: #4fc3f7;
color: white;
padding: 12px 24px;
border: none;
border-radius: 4px;
cursor: pointer;
/* Syntaxe complète : propriété | durée | fonction de timing | délai */
transition: background-color 0.4s ease-in-out,
transform 0.3s cubic-bezier(0.68, -0.55, 0.27, 1.55),
box-shadow 0.3s ease;
}
.button:hover {
background: #03a9f4;
transform: translateY(-3px) scale(1.05);
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
}
index.html
<button class="button">Cliquez-moi</button>
transition: [propriété] [durée] [timing-function] [delay];color, background, transform,
opacity, width (avec précaution)...ease, linear, ease-in,
ease-out, cubic-bezier() (personnalisable sur cubic-bezier.com).
style.css
.box {
width: 100px;
height: 100px;
background: #ff7043;
margin: 20px;
transition: transform 0.5s ease;
}
.box:hover {
transform:
rotate(45deg) /* rotation */
scale(1.3) /* agrandissement */
translateX(20px) /* déplacement horizontal */
skewY(10deg); /* inclinaison verticale */
}
index.html
<div class="box">HOVER</div>
transform n’affecte PAS le flux du document → les autres éléments ne bougent pas.transform.rotate(45deg) scale(1.5) ≠ scale(1.5) rotate(45deg).translateX() / translateY() / translate()scaleX() / scaleY() / scale()rotate()skewX() / skewY()
style.css
.scene {
perspective: 800px; /* donne une profondeur à la scène */
margin: 40px 0;
}
.card {
width: 150px;
height: 150px;
background: #81c784;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: bold;
transition: transform 0.8s ease;
}
.card:hover {
transform: rotateY(45deg) rotateX(15deg);
}
index.html
<div class="scene">
<div class="card">3D HOVER</div>
</div>
perspective → appliqué au parent, donne un effet 3D réaliste.rotateX() / rotateY() / rotateZ() → rotations 3D.translateZ() → avance/recule dans la profondeur.transform-style: preserve-3d; → pour imbriquer des éléments 3D.backface-visibility: hidden; → cache l’arrière d’un élément retourné.
style.css
@keyframes bounce {
0%, 100% {
transform: translateY(0);
animation-timing-function: ease-out;
}
50% {
transform: translateY(-50px);
animation-timing-function: ease-in;
}
}
.ball {
width: 50px;
height: 50px;
background: #e91e63;
border-radius: 50%;
animation: bounce 1s infinite;
}
index.html
<div class="ball"></div>
@keyframes → définit les étapes (keyframes) d’une animation.from (0%) et to (100%) pour les animations simples.
.ball {
animation-name: bounce;
animation-duration: 1s;
animation-timing-function: ease; /* ou cubic-bezier() */
animation-delay: 0.5s;
animation-iteration-count: infinite; /* ou 3, 5... */
animation-direction: alternate; /* normal, reverse, alternate, alternate-reverse */
animation-fill-mode: both; /* none, forwards, backwards, both */
animation-play-state: running; /* running, paused */
}
animation: bounce 1s ease 0.5s infinite alternate both paused;
style.css
.spinner {
width: 40px;
height: 40px;
border: 4px solid #ccc;
border-top: 4px solid #3f51b5;
border-radius: 50%;
animation: spin 1s linear infinite;
}
.spinner:hover {
animation-play-state: paused; /* arrête l'animation au survol */
}
@keyframes spin {
to { transform: rotate(360deg); }
}
index.html
<div class="spinner"></div>
animation-play-state: paused; → arrête l’animation sans la réinitialiser.element.style.animationPlayState = "paused").
style.css
.perf-box {
will-change: transform, opacity; /* prévient le navigateur */
transition: transform 0.3s, opacity 0.3s;
}
.perf-box:hover {
transform: scale(1.1);
opacity: 0.8;
}
index.html
<div class="perf-box">PERF</div>
width, height, top, left →
déclenchent des “reflows” → lags.will-change: transform; → optimisation proactive (à utiliser avec parcimonie).translateZ(0) ou transform: translate3d(0,0,0) pour forcer
l’accélération matérielle (legacy trick).
style.css
.sprite {
width: 100px;
height: 100px;
background: url('sprite-sheet.png') 0 0;
animation: walk 1s steps(8) infinite;
}
@keyframes walk {
100% { background-position: -800px 0; } /* 8 frames de 100px */
}
index.html
<div class="sprite"></div>
animation-timing-function: steps(8); → divise l’animation en 8 étapes nettes (pas de
transition entre).steps(nombre, [start|end]) → end par défaut.
style.css
/* Au clic */
button:active {
transform: scale(0.95);
}
/* Au focus (clavier ou clic) */
input:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.5);
transition: box-shadow 0.3s ease;
}
/* En responsive */
@media (prefers-reduced-motion: no-preference) {
.animated-element {
animation: fadeIn 1s ease-in;
}
}
index.html
<button>Clique moi</button>
<br><br>
<input type="text" placeholder="Clique ici → focus animé">
:active → pendant le clic.:focus → quand l’élément est sélectionné (clavier ou souris).@media (prefers-reduced-motion) → respecte les préférences utilisateurs
(accessibilité).@media (prefers-reduced-motion: reduce) →
désactive les animations gênantes.transform et opacity. Utilise
will-change avec modération.cubic-bezier personnalisés pour des mouvements
“humains” (rebond, inertie).| Propriété | Valeurs courantes | Description |
|---|---|---|
transition |
all 0.3s ease |
Animation lors d’un changement d’état (hover, focus...) |
transform |
rotate(30deg) scale(1.2) |
Déformation 2D/3D sans affecter le flux |
perspective |
800px |
Profondeur pour les transformations 3D (sur le parent) |
@keyframes |
from {} to {} ou 0% {} 50% {} 100% {} |
Définit une animation complexe |
animation-name |
bounce |
Nom de l’animation @keyframes |
animation-duration |
1s, 500ms |
Durée totale de l’animation |
animation-timing-function |
ease, linear, cubic-bezier(), steps()
|
Accélération de l’animation |
animation-delay |
0.5s |
Délai avant le début |
animation-iteration-count |
infinite, 3 |
Nombre de répétitions |
animation-direction |
normal, reverse, alternate |
Sens de lecture |
animation-fill-mode |
forwards, backwards, both |
Style avant/après l’animation |
animation-play-state |
running, paused |
Contrôle la lecture |
will-change |
transform, opacity |
Optimisation de performance (à utiliser avec parcimonie) |
Voici un résumé de toutes les notions CSS vues, avec des conseils pour organiser et maintenir votre CSS.
p, .classe, #idcolor, font-size, font-weight,
text-align, text-decoration, line-height,
letter-spacingbackground-color, background-imageborder, margin, padding, box-sizing
display:flex, justify-content, align-items,
flex-directiondisplay:grid, grid-template-columns,
grid-template-rows, grid-column, grid-row@media screen and (max-width: 600px)transition: property duration timing-function;transform: scale(), rotate(), translate()
@keyframes, animation-name, animation-duration,
animation-iteration-countstyle.css) pour toutes les pages..header, .btn-primary, .card).
box-sizing: border-box pour simplifier le calcul des tailles.
/* === Typographie === */
body {
font-family: Arial, sans-serif;
line-height: 1.6;
}
/* === Layout === */
.container {
display: flex;
flex-direction: column;
padding: 20px;
}
/* === Composants === */
.btn {
background-color: blue;
color: white;
padding: 10px 20px;
border: none;
cursor: pointer;
transition: background-color 0.3s;
}
.btn:hover {
background-color: darkblue;
}
/* === Responsive === */
@media screen and (max-width: 600px) {
.container {
flex-direction: column;
}
h1 {
font-size: 24px;
}
}
Les transitions CSS permettent de créer des changements fluides entre deux états.
Ici, on va bien au-delà du transition: all 0.3s; : courbes d’animation personnalisées, délais, transitions multiples, et contrôle fin pour une UX parfaite.
style.css
.button-full {
background: #607d8b;
color: white;
padding: 12px 24px;
border: none;
border-radius: 4px;
cursor: pointer;
/* transition: [propriété] [durée] [timing-function] [délai]; */
transition:
background-color 0.4s ease-in-out,
transform 0.3s cubic-bezier(0.68, -0.55, 0.27, 1.55),
box-shadow 0.3s ease 0.1s; /* délai de 0.1s */
}
.button-full:hover {
background: #455a64;
transform: translateY(-3px) scale(1.05);
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
}
index.html
<button class="button-full">✨ Hover moi — transitions multiples + délai + courbe custom</button>
transition: propriété durée timing-function délai;ease-in-out → ralentit au début et à la fin.cubic-bezier(x1, y1, x2, y2) → courbe personnalisée (va sur cubic-bezier.com pour la créer).0.1s → délai avant le début de la transition.
style.css
.ease {
transition: transform 0.6s ease;
}
.linear {
transition: transform 0.6s linear;
}
.ease-in {
transition: transform 0.6s ease-in;
}
.ease-out {
transition: transform 0.6s ease-out;
}
.cubic-custom {
transition: transform 0.6s cubic-bezier(0.86, 0, 0.07, 1); /* easeInOutExpo */
}
.steps {
transition: transform 0.6s steps(6, end); /* animation par étapes */
}
index.html
<button class="ease">ease</button>
<button class="linear">linear</button>
<button class="ease-in">ease-in</button>
<button class="ease-out">ease-out</button>
<button class="cubic-custom">cubic-custom</button>
<button class="steps">steps</button>
ease → accélération/décélération douce (valeur par défaut).linear → vitesse constante → mécanique, robotique.ease-in → commence lentement.ease-out → finit lentement.cubic-bezier() → contrôle total de la courbe d’animation.steps(6) → animation par étapes → parfait pour les sprites, compteurs, flip cards.
style.css
.card-multi {
background: #e3f2fd;
padding: 20px;
border: 2px solid #2196f3;
cursor: pointer;
/* Chaque propriété a sa propre transition */
transition-property: background-color, transform, border-color;
transition-duration: 0.5s, 0.3s, 0.8s;
transition-timing-function: ease, cubic-bezier(0.68, -0.55, 0.27, 1.55), ease-in-out;
transition-delay: 0s, 0.1s, 0.2s;
}
.card-multi:hover {
background: #2196f3;
color: white;
transform: scale(1.05) rotate(2deg);
border-color: #0d47a1;
}
index.html
<div class="card-multi">Hover → transitions indépendantes (fond, transformation, bordure)</div>
transition-propertytransition-durationtransition-timing-functiontransition-delay
style.css
/* Au clic (état actif) */
.button:active {
transform: scale(0.95);
transition: transform 0.1s;
}
/* Au focus (clavier ou clic) */
.input:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.5);
transition: box-shadow 0.3s ease;
}
/* En mode réduit mouvement (accessibilité) */
@media (prefers-reduced-motion: reduce) {
* {
transition: none !important;
animation: none !important;
}
}
/* Sur mobile */
@media (max-width: 768px) {
.card {
transition: transform 0.2s ease; /* plus rapide sur mobile */
}
}
index.html
<button class="button:active">Clique moi → transition au clic</button>
<input type="text" placeholder="Clique ici → transition au focus">
:active → pendant le clic → parfait pour les boutons “pressés”.:focus → quand l’élément est sélectionné → essentiel pour l’accessibilité clavier.@media (prefers-reduced-motion: reduce) → respecte les utilisateurs sensibles au mouvement.
style.css
.box-js {
width: 100px;
height: 100px;
background: #ff5722;
margin: 20px;
transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.box-js.active {
transform: rotate(180deg) scale(1.5);
background: #4caf50;
border-radius: 50%;
}
index.html
<div id="js-box"></div>
<button onclick="document.getElementById('js-box').classList.toggle('active');">Toggle Class → déclenche la transition</button>
element.classList.add('active'); → déclenche la transition si les propriétés changent.transitionend → événement déclenché à la fin de la transition.getComputedStyle(element).transitionDuration pour lire la durée en JS.
transform et opacity → 60 FPS garantis. Évite width, height, top, left.@media (prefers-reduced-motion: reduce) → désactive les transitions/mouvements.cubic-bezier pour des mouvements “humains” (rebond, inertie, élasticité).transition-delay pour créer des séquences ou des effets “en cascade”.| Propriété | Valeurs courantes | Description |
|---|---|---|
transition-property | transform, opacity, all | Quelle propriété animer |
transition-duration | 0.3s, 500ms | Durée de la transition |
transition-timing-function | ease, linear, cubic-bezier(), steps() | Accélération de l’animation |
transition-delay | 0.2s | Délai avant le début |
transition | all 0.3s ease 0.1s | Raccourci pour tout |
@media (prefers-reduced-motion) | reduce | Désactive pour l’accessibilité |
Le Scroll Snap permet de créer des interfaces où le défilement “accroche” à des points précis : carrousels, diaporamas, sections pleine page, galeries. Fini le scroll incontrôlé — bienvenue au scroll piloté, fluide et moderne, sans JavaScript.
style.css
.snap-container {
scroll-snap-type: x mandatory; /* ou y, both */
overflow-x: scroll;
display: flex;
width: 100%;
height: 200px;
border: 2px solid #607d8b;
scroll-behavior: smooth; /* scroll fluide */
}
.snap-item {
scroll-snap-align: start; /* ou center, end */
flex: 0 0 100%; /* chaque item prend 100% de la largeur */
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
color: white;
}
index.html
<div class="snap-container">
<div class="snap-item">1</div>
<div class="snap-item">2</div>
<div class="snap-item">3</div>
</div>
scroll-snap-type.scroll-snap-align.scroll-snap-type: x mandatory; → snap horizontal, obligatoire.scroll-snap-align: start; → l’élément s’aligne au début de la zone de défilement.scroll-behavior: smooth; pour un scroll fluide.
style.css
/* Vertical */
.snap-container-y {
scroll-snap-type: y mandatory;
overflow-y: scroll;
height: 300px;
width: 300px;
border: 2px solid #607d8b;
}
/* Horizontal */
.snap-container-x {
scroll-snap-type: x mandatory;
overflow-x: scroll;
width: 100%;
height: 200px;
border: 2px solid #607d8b;
}
/* Les deux */
.snap-container-both {
scroll-snap-type: both mandatory;
overflow: scroll;
width: 400px;
height: 300px;
border: 2px solid #607d8b;
}
index.html
<div class="snap-container-y">
<div class="snap-item">A</div>
<div class="snap-item">B</div>
<div class="snap-item">C</div>
</div>
→ Voir l’exemple de la section 1.
scroll-snap-type: y mandatory; → snap vertical.scroll-snap-type: both mandatory; → snap horizontal ET vertical (grilles, tableaux complexes).
style.css
.snap-center {
scroll-snap-align: center;
}
.snap-end {
scroll-snap-align: end;
}
index.html
<div class="snap-container">
<div class="snap-item snap-center">CENTER</div>
<div class="snap-item snap-end">END</div>
</div>
start → aligne le début de l’élément avec le début de la zone de défilement.center → centre l’élément dans la zone visible → parfait pour les galeries “focus”.end → aligne la fin de l’élément.center + marges pour un effet “carte au centre”.
style.css
.snap-item-stop {
scroll-snap-stop: always; /* force l'arrêt ici, même si l'utilisateur scroll vite */
}
index.html
<div class="snap-container-y">
<div class="snap-item snap-center snap-item-stop">STOP 1</div>
<div class="snap-item snap-center snap-item-stop">STOP 2</div>
<div class="snap-item snap-center snap-item-stop">STOP 3</div>
</div>
scroll-snap-stop: always; → l’utilisateur doit s’arrêter à cet élément, même s’il scroll vite.normal → l’utilisateur peut “sauter” des snap points en scrollant rapidement.
style.css
.fullpage-container {
scroll-snap-type: y mandatory;
overflow-y: scroll;
height: 100vh;
scroll-behavior: smooth;
}
.fullpage-section {
scroll-snap-align: start;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
font-size: 3rem;
color: white;
}
index.html
<div class="fullpage-container">
<div class="fullpage-section" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);">SECTION 1</div>
<div class="fullpage-section" style="background: linear-gradient(135deg, #ff5722 0%, #4caf50 100%);">SECTION 2</div>
<div class="fullpage-section" style="background: linear-gradient(135deg, #2196f3 0%, #9c27b0 100%);">SECTION 3</div>
</div>
height: 100vh;.mandatory si le contenu est long → préfère proximity pour plus de liberté.
style.css
.snap-mandatory {
scroll-snap-type: x mandatory; /* Doit s'arrêter sur un snap point */
}
.snap-proximity {
scroll-snap-type: x proximity; /* S'arrête si proche, sinon libre */
}
index.html
<div class="snap-container">
<div class="snap-item snap-mandatory">MANDATORY</div>
<div class="snap-item snap-proximity">PROXIMITY</div>
</div>
mandatory → l’utilisateur doit s’arrêter sur un snap point → expérience contrôlée (carrousels, diaporamas).proximity → s’arrête seulement si le scroll s’arrête “près” d’un snap point → plus de liberté (galerie, portfolio).proximity pour les contenus longs ou complexes → meilleure accessibilité.
| Propriété | Valeurs | Description |
|---|---|---|
scroll-snap-type | x mandatory, y proximity, both mandatory | Active le snap sur un/des axes + comportement |
scroll-snap-align | start, center, end | Où l’élément s’aligne dans la zone de défilement |
scroll-snap-stop | normal, always | Force l’arrêt à cet élément |
scroll-behavior | smooth | Scroll fluide (pas obligatoire, mais recommandé) |
Les filtres CSS permettent d’appliquer des effets graphiques comme le flou, la saturation, ou la luminosité — directement dans le navigateur.
Les modes de fusion (blend-mode) permettent de mélanger les couleurs entre éléments ou avec l’arrière-plan.
Le tout, sans Photoshop, sans JavaScript.
style.css
.img-blur {
filter: blur(5px);
}
.img-grayscale {
filter: grayscale(100%);
}
.img-brightness {
filter: brightness(1.5); /* 1 = normal, 0.5 = plus sombre, 1.5 = plus clair */
}
.img-contrast {
filter: contrast(200%); /* 100% = normal, 200% = plus contrasté */
}
blur(5px)
grayscale(100%)
brightness(1.5)
contrast(200%)
filter: blur(5px); → flou gaussien.grayscale(100%) → noir et blanc complet.brightness(0.5) → assombrit, brightness(2) → éclaircit.contrast(50%) → réduit le contraste, contrast(200%) → l’augmente.filter: blur(2px) brightness(1.2);
style.css
.img-hue-rotate {
filter: hue-rotate(90deg); /* Change la teinte (0deg à 360deg) */
}
.img-saturate {
filter: saturate(300%); /* 100% = normal, 0% = désaturé, 300% = ultra saturé */
}
.img-invert {
filter: invert(100%); /* Inverse les couleurs → négatif photo */
}
.img-sepia {
filter: sepia(100%); /* Effet photo ancienne */
}
hue-rotate(90deg)
saturate(300%)
invert(100%)
sepia(100%)
hue-rotate(180deg) → change la teinte (comme dans Photoshop → Teinte/Saturation).saturate(0%) → équivalent à grayscale(100%).invert(100%) → négatif photo → utile pour le “mode nuit” rapide.sepia(100%) → effet vintage.filter: invert(1) hue-rotate(180deg); → simulateur de daltonisme.
style.css
.img-dramatic {
filter:
brightness(0.8)
contrast(120%)
saturate(150%)
hue-rotate(-10deg);
}
.img-vintage {
filter:
sepia(80%)
saturate(150%)
brightness(1.1)
contrast(90%);
}
.img-night-mode {
filter: invert(1) hue-rotate(180deg); /* Mode nuit accessible */
}
Filtre “dramatique”
Filtre “vintage”
Mode nuit (invert + hue-rotate)
blur() hue-rotate() ≠ hue-rotate() blur().--filter-theme: brightness(0.9) saturate(110%);
style.css
.card-backdrop {
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px); /* Floute ce qui est derrière la carte */
-webkit-backdrop-filter: blur(10px); /* Safari */
border: 1px solid rgba(255,255,255,0.3);
padding: 30px;
color: white;
font-weight: bold;
text-align: center;
}
.hero-backdrop {
background: rgba(0,0,0,0.4);
backdrop-filter: blur(8px);
padding: 50px;
color: white;
text-align: center;
}
backdrop-filter: blur(10px);backdrop-filter → applique un filtre à tout ce qui est derrière l’élément.-webkit-backdrop-filter pour Safari.
style.css
.blend-container {
background: linear-gradient(45deg, #ff9a9e, #fecfef, #ff9a9e);
padding: 50px;
position: relative;
text-align: center;
}
.blend-text {
font-size: 3rem;
font-weight: bold;
color: #2196f3;
mix-blend-mode: multiply; /* ou screen, overlay, difference... */
position: relative;
z-index: 1;
}
mix-blend-mode → mélange l’élément avec tout ce qui est en dessous (arrière-plan, autres éléments).multiply → assombrit, garde les noirs.screen → éclaircit, garde les blancs.overlay → combine multiply + screen.difference → effet “négatif” créatif.
style.css
.blend-bg {
background:
url('https://images.pexels.com/photos/414612/pexels-photo-414612.jpeg?auto=compress&cs=tinysrgb&w=400'),
linear-gradient(45deg, rgba(255,0,0,0.5), rgba(0,0,255,0.5));
background-size: cover;
background-blend-mode: overlay; /* mélange les deux fonds entre eux */
width: 300px;
height: 200px;
margin: 0 auto;
}
background-blend-mode → mélange les couches d’arrière-plan entre elles (image + dégradé, dégradé + dégradé...).mix-blend-mode : multiply, screen, overlay, etc.mix-blend-mode → mélange avec tout ce qui est en dessous (y compris d’autres éléments).background-blend-mode → mélange uniquement les fonds de l’élément.
blur() élevé) sur des éléments animés ou scrollants → peut causer des lags.grayscale ou hue-rotate sur du texte → peut nuire à la lisibilité.background-blend-mode pour des effets de texture ou de lumière.--filter-hover: brightness(1.1) saturate(120%);| Propriété | Valeurs courantes | Description |
|---|---|---|
filter | blur(5px), grayscale(100%), brightness(1.5) | Effets sur l’élément |
backdrop-filter | blur(10px), grayscale(50%) | Effets sur l’arrière-plan (verre dépoli) |
mix-blend-mode | multiply, screen, overlay, difference | Mélange avec les éléments en-dessous |
background-blend-mode | multiply, screen, overlay | Mélange les fonds entre eux |
hue-rotate() | hue-rotate(90deg) | Change la teinte |
saturate() | saturate(200%) | Augmente/diminue la saturation |
invert() | invert(100%) | Inversion des couleurs (négatif) |
Voici quelques ressources utiles pour approfondir votre compréhension du CSS :
click here to download
html_css.pdf