HTML & CSS — Cours Complet
Les fondamentaux et la maîtrise de la mise en page
Avec des exemples mathématiques en MathML
📑 Sommaire
- Partie 1 : Les fondamentaux du HTML et CSS
- 1. Distinguer HTML et CSS
- 2. Éléments HTML et attributs
- 3. Balises sémantiques
- 4. Éléments bloc vs inline
- 5. Identifier les informations clés
- 6. Syntaxe CSS
- 7. Appliquer le CSS
- Partie 2 : Maîtrise de la mise en page
- 8. Le modèle de boîte (Box Model)
- 9. Flexbox
- 10. CSS Grid
- 11. Styliser liens, listes et formulaires
- 12. Responsive design
- 13. Animations et transitions
- Partie 3 : Exercice pratique complet
Partie 1 : Les fondamentaux du HTML et CSS
1. Distinguer HTML et CSS et identifier leurs usages respectifs
1.1. Qu'est-ce que le HTML ?
HTML (HyperText Markup Language) est le langage de structure d'une page web. Il sert à définir le contenu et sa hiérarchie.
- HTML = Les fondations, les murs, l'ossature d'une maison.
- HTML = Le squelette d'un corps humain.
Ce que fait le HTML :
- Il crée des titres, des paragraphes, des listes, des liens, des images.
- Il dit : "Ceci est un titre", "Ceci est un paragraphe", "Ceci est un lien".
1.2. Qu'est-ce que le CSS ?
CSS (Cascading Style Sheets) est le langage de présentation d'une page web. Il sert à définir l'apparence visuelle du contenu.
- CSS = La peinture, la déco, l'aménagement intérieur de la maison.
- CSS = La peau, les vêtements, la coiffure du corps humain.
Ce que fait le CSS :
- Il change les couleurs, les polices, les tailles, les marges, les positions.
- Il dit : "Ce titre doit être en bleu", "Ce paragraphe doit être en gras".
1.3. Résumé de la distinction
| Critère | HTML | CSS |
|---|---|---|
| Rôle | Structure / Contenu | Style / Apparence |
| Question | "Qu'est-ce que c'est ?" | "À quoi ça ressemble ?" |
| Fichier | .html |
.css |
2. Reconnaître les éléments HTML courants et leurs attributs
2.1. La structure de base d'une page HTML
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Mon premier site</title>
</head>
<body>
<!-- Le contenu visible de la page va ici -->
</body>
</html>
<!DOCTYPE html>: Indique au navigateur qu'il s'agit de HTML5.<html>: La racine du document.<head>: Contient des informations sur la page (titre, encodage).<body>: Contient tout ce qui est visible par l'utilisateur.
2.2. Les éléments HTML courants
| Balise | Utilité | Exemple |
|---|---|---|
<h1> à <h6> |
Titres | <h1>Bienvenue</h1> |
<p> |
Paragraphe | <p>Texte</p> |
<a> |
Lien | <a href="#">Cliquez</a> |
<img> |
Image | <img src="photo.jpg" alt="Description"> |
<ul> / <ol> |
Listes | <ul><li>Item</li></ul> |
<div> |
Conteneur bloc | <div>...</div> |
<span> |
Conteneur inline | <span>...</span> |
2.3. Les attributs HTML
| Attribut | Utilisé sur | Utilité |
|---|---|---|
href |
<a> |
Destination du lien |
src |
<img> |
Source de l'image |
alt |
<img> |
Texte alternatif |
class |
Toutes | Cible un groupe en CSS |
id |
Toutes | Cible un élément unique en CSS |
3. Expliquer comment les balises sémantiques structurent une page web
Avant HTML5, on utilisait des <div> pour tout. Les balises sémantiques donnent du sens à la structure.
| Balise | Signification | Utilisation |
|---|---|---|
<header> |
En-tête | Logo, titre, navigation |
<nav> |
Navigation | Menu principal |
<main> |
Contenu principal | Contenu central unique |
<section> |
Section | Regroupe un thème |
<article> |
Article | Contenu indépendant |
<aside> |
À côté | Contenu secondaire |
<footer> |
Pied de page | Mentions légales, copyright |
<body>
<header>
<h1>Mon Site</h1>
<nav>
<a href="#">Accueil</a>
<a href="#">Blog</a>
</nav>
</header>
<main>
<section>
<h2>Articles</h2>
<article>
<h3>Article 1</h3>
<p>Contenu...</p>
</article>
</section>
</main>
<footer>
<p>© 2026</p>
</footer>
</body>
- Accessibilité : Les lecteurs d'écran comprennent mieux la page.
- SEO : Google comprend mieux le contenu.
- Maintenance : Le code est plus lisible.
4. Distinguer les éléments en bloc des éléments en ligne
4.1. Les éléments en bloc (block elements)
- Prennent toute la largeur disponible.
- Provoquent un retour à la ligne.
- Peuvent avoir
widthetheight.
Exemples : <div>, <p>, <h1>, <section>, <header>.
4.2. Les éléments en ligne (inline elements)
- Prennent uniquement la largeur de leur contenu.
- Ne provoquent pas de retour à la ligne.
- Ne peuvent pas avoir
widthouheight.
Exemples : <a>, <span>, <img>, <strong>.
| Élément bloc | Élément en ligne |
|---|---|
| Occupe toute la largeur | Occupe seulement sa largeur |
| Retour à la ligne | Pas de retour à la ligne |
Peut avoir width/height |
Ne peut pas avoir width/height |
Ex: <div>, <p> |
Ex: <span>, <a> |
5. Utiliser des balises et attributs pour identifier les informations clés
5.1. Utiliser les attributs class et id
class: Identifie un groupe d'éléments.id: Identifie un élément unique.
<h1 id="titre-principal">Bienvenue</h1>
<p class="intro">Introduction 1</p>
<p class="intro">Introduction 2</p>
5.2. Les attributs ARIA (accessibilité)
<nav role="navigation" aria-label="Menu principal">...</nav>
<button aria-label="Fermer">X</button>
5.3. Micro-données Schema.org
<div itemscope itemtype="http://schema.org/Product">
<h2 itemprop="name">Casque audio</h2>
<span itemprop="price" content="99.99">99.99 €</span>
</div>
6. Identifier et utiliser la syntaxe CSS correcte
6.1. La syntaxe de base
selecteur {
propriete: valeur;
}
6.2. Les sélecteurs CSS
| Sélecteur | Syntaxe | Exemple |
|---|---|---|
| Élément | balise |
p { color: red; } |
| Classe | .nomClasse |
.intro { font-weight: bold; } |
| ID | #nomId |
#titre { font-size: 40px; } |
| Universel | * |
* { margin: 0; } |
6.3. Où écrire le CSS ?
- Externe (recommandé) :
<link rel="stylesheet" href="style.css"> - Interne :
<style> p { color: blue; } </style> - En ligne (à éviter) :
<p style="color: blue;">
7. Appliquer le CSS aux éléments HTML
7.1. Exemple : Carte de visite
<div class="carte">
<h1 id="nom">Jean Dupont</h1>
<p class="titre">Développeur Web</p>
<a class="bouton" href="#">Me contacter</a>
</div>
.carte {
background: white;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
padding: 30px;
text-align: center;
width: 300px;
}
#nom {
color: #2c3e50;
font-size: 24px;
}
.titre {
color: #3498db;
font-weight: bold;
}
.bouton {
background: #3498db;
color: white;
padding: 10px 20px;
border-radius: 5px;
transition: background 0.3s;
}
.bouton:hover {
background: #2980b9;
}
Partie 2 : Maîtrise de la mise en page
8. Comprendre le modèle de boîte (Box Model)
8.1. Qu'est-ce que le Box Model ?
Largeur totale = largeur du contenu + padding gauche + padding droit + bordure gauche + bordure droite
L t o t a l = L c o n t e n t + p a d d i n g _ l e f t + p a d d i n g _ r i g h t + b o r d e r _ l e f t + b o r d e r _ r i g h tAvec box-sizing: border-box, le padding et la bordure sont inclus dans la largeur :
/* Règle universelle recommandée */
* {
box-sizing: border-box;
}
9. Utiliser Flexbox pour des mises en page flexibles
9.1. Qu'est-ce que Flexbox ?
Flexbox permet de répartir l'espace et d'aligner les éléments sur un seul axe.
.conteneur {
display: flex;
}
9.2. Propriétés du conteneur Flex
| Propriété | Valeurs courantes | Effet |
|---|---|---|
flex-direction |
row, column |
Axe principal |
justify-content |
center, space-between |
Alignement axe principal |
align-items |
center, stretch |
Alignement axe secondaire |
flex-wrap |
wrap, nowrap |
Retour à la ligne |
9.3. Exemple : Barre de navigation
<nav class="navbar">
<div class="logo">MonSite</div>
<ul class="menu">
<li><a href="#">Accueil</a></li>
<li><a href="#">Services</a></li>
</ul>
<div class="auth"><a href="#">Connexion</a></div>
</nav>
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
background: #2c3e50;
padding: 15px 30px;
}
.menu {
display: flex;
list-style: none;
gap: 20px;
}
.menu a { color: white; text-decoration: none; }
10. Utiliser CSS Grid pour des mises en page en 2 dimensions
10.1. Qu'est-ce que CSS Grid ?
CSS Grid permet de créer des grilles en 2 dimensions (lignes ET colonnes).
.grille {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 100px 200px;
gap: 10px;
}
Répartition de l'espace avec les unités fr
Chaque 1fr = 14 de l'espace total
10.2. Exemple : Galerie d'images
.galerie {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 15px;
}
.item1 {
grid-column: 1 / 3;
grid-row: 1 / 3;
}
10.3. Flexbox vs Grid
| Flexbox (1D) | Grid (2D) |
|---|---|
| Alignement sur un axe | Mise en page complète |
| Navigation, cartes, boutons | Structure globale, galeries |
11. Styliser les liens, les listes et les formulaires
11.1. Styliser les liens
a { color: #3498db; text-decoration: none; }
a:hover { color: #e74c3c; }
a:visited { color: #8e44ad; }
a:active { color: #2c3e50; }
11.2. Styliser les listes
ul { list-style: none; padding: 0; }
ul.horizontal { display: flex; gap: 20px; }
11.3. Styliser les formulaires
<form class="contact-form">
<div class="form-group">
<label for="nom">Nom :</label>
<input type="text" id="nom" placeholder="Votre nom">
</div>
<div class="form-group">
<label for="email">Email :</label>
<input type="email" id="email" placeholder="votre@email.com">
</div>
<button type="submit">Envoyer</button>
</form>
.form-group { margin-bottom: 20px; }
input, textarea {
width: 100%;
padding: 10px 15px;
border: 2px solid #ddd;
border-radius: 5px;
transition: border-color 0.3s;
}
input:focus { border-color: #3498db; }
12. Comprendre les bases du responsive design
12.1. La balise viewport
<meta name="viewport" content="width=device-width, initial-scale=1.0">
12.2. Les unités relatives
| Unité | Description | Exemple |
|---|---|---|
% |
Pourcentage du parent | width: 50%; |
em |
Relatif à la police du parent | font-size: 2em; |
rem |
Relatif à la police racine | font-size: 1.5rem; |
vw |
1% de la largeur de la fenêtre | width: 50vw; |
vh |
1% de la hauteur de la fenêtre | height: 100vh; |
Conversion des unités relatives
1 r e m = t a i l l e _ p o l i c e _ r a c i n e (généralement 16px) 1 v w = 1 100 × l a r g e u r _ f e n e t r e12.3. Les media queries
/* Mobile first */
body { font-size: 16px; }
/* Tablette */
@media (min-width: 768px) {
body { font-size: 18px; }
}
/* Ordinateur */
@media (min-width: 1024px) {
body { font-size: 20px; }
}
Règle des points de rupture (breakpoints) :
B r e a k p o i n t s = { 480 p x , 768 p x , 1024 p x , 1440 p x }13. Ajouter des animations et transitions
13.1. Les transitions
.bouton {
background: #3498db;
transition: background 0.3s ease, transform 0.2s ease;
}
.bouton:hover {
background: #e74c3c;
transform: scale(1.1);
}
Fonction de transition :
t r a n s i t i o n = p r o p r i e t e + d u r e e + f o n c t i o n + d e l a i13.2. Les animations keyframes
@keyframes bounce {
0% { transform: translateY(0); }
50% { transform: translateY(-30px); }
100% { transform: translateY(0); }
}
.animation-bounce {
animation: bounce 1s infinite;
}
Modélisation d'un rebond :
y ( t ) = A × sin ( ω t )où A = amplitude, ω = pulsation
Partie 3 : Exercice pratique complet
Objectif
Créer une page de présentation de services avec :
- Une navigation responsive (Flexbox + media query).
- Une grille de services (CSS Grid).
- Des cartes animées au survol.
- Un formulaire de contact stylisé.
Structure souhaitée
┌──────────────────────────────────────────┐
│ Logo Accueil Services Contact │ ← Navbar
├──────────────────────────────────────────┤
│ │
│ [Grand titre de bienvenue] │
│ [Sous-titre] │ ← Hero section
│ [Bouton CTA] │
│ │
├──────────────────────────────────────────┤
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │Service│ │Service│ │Service│ │ ← Grid 3 colonnes
│ │ 1 │ │ 2 │ │ 3 │ │
│ └──────┘ └──────┘ └──────┘ │
├──────────────────────────────────────────┤
│ Formulaire de contact │ ← Formulaire
│ [Nom] [Email] [Message] [Envoyer] │
├──────────────────────────────────────────┤
│ © 2026 - Mentions légales │ ← Footer
└──────────────────────────────────────────┘
Correction complète
HTML (index.html)
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mes Services</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- Navbar -->
<nav class="navbar">
<div class="logo">MonAgence</div>
<ul class="menu">
<li><a href="#">Accueil</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<!-- Hero -->
<header class="hero">
<h1>Des solutions sur mesure</h1>
<p>Nous vous accompagnons dans la création de votre projet digital.</p>
<a href="#" class="btn-cta">Commencer</a>
</header>
<!-- Services -->
<section class="services">
<h2>Nos services</h2>
<div class="grille-services">
<div class="service-card">
<div class="icone">💻</div>
<h3>Développement web</h3>
<p>Création de sites vitrines et applications sur mesure.</p>
</div>
<div class="service-card">
<div class="icone">📱</div>
<h3>Mobile</h3>
<p>Applications mobiles natives et hybrides.</p>
</div>
<div class="service-card">
<div class="icone">🎨</div>
<h3>Design UX/UI</h3>
<p>Interfaces modernes et expériences utilisateur optimisées.</p>
</div>
</div>
</section>
<!-- Contact -->
<section class="contact">
<h2>Contactez-nous</h2>
<form>
<div class="form-group">
<label for="name">Nom</label>
<input type="text" id="name" placeholder="Votre nom" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" placeholder="votre@email.com" required>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" rows="4" placeholder="Votre message..."></textarea>
</div>
<button type="submit" class="btn-submit">Envoyer</button>
</form>
</section>
<footer>
<p>© 2026 MonAgence - Tous droits réservés.</p>
</footer>
</body>
</html>
CSS (style.css)
/* Reset */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
color: #333;
line-height: 1.6;
}
/* Navbar */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 30px;
background: #2c3e50;
color: white;
}
.logo {
font-size: 24px;
font-weight: bold;
}
.menu {
display: flex;
list-style: none;
gap: 30px;
}
.menu a {
color: white;
text-decoration: none;
transition: color 0.3s;
}
.menu a:hover {
color: #3498db;
}
/* Hero */
.hero {
background: linear-gradient(135deg, #2c3e50, #3498db);
color: white;
text-align: center;
padding: 80px 20px;
}
.hero h1 {
font-size: 48px;
margin-bottom: 20px;
}
.hero p {
font-size: 20px;
margin-bottom: 30px;
}
.btn-cta {
display: inline-block;
padding: 15px 40px;
background: white;
color: #2c3e50;
text-decoration: none;
border-radius: 50px;
font-weight: bold;
transition: transform 0.3s, box-shadow 0.3s;
}
.btn-cta:hover {
transform: scale(1.05);
box-shadow: 0 10px 20px rgba(0,0,0,0.2);
}
/* Services */
.services {
padding: 60px 30px;
max-width: 1100px;
margin: 0 auto;
}
.services h2 {
text-align: center;
font-size: 36px;
margin-bottom: 40px;
color: #2c3e50;
}
.grille-services {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 30px;
}
.service-card {
background: #f8f9fa;
padding: 30px;
border-radius: 10px;
text-align: center;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.service-card:hover {
transform: translateY(-10px);
box-shadow: 0 10px 20px rgba(0,0,0,0.1);
}
.icone {
font-size: 48px;
margin-bottom: 15px;
}
/* Contact */
.contact {
background: #ecf0f1;
padding: 60px 30px;
}
.contact h2 {
text-align: center;
font-size: 36px;
margin-bottom: 40px;
color: #2c3e50;
}
.contact form {
max-width: 500px;
margin: 0 auto;
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
font-weight: bold;
margin-bottom: 5px;
}
.form-group input,
.form-group textarea {
width: 100%;
padding: 10px 15px;
border: 2px solid #ddd;
border-radius: 5px;
font-size: 16px;
transition: border-color 0.3s;
}
.form-group input:focus,
.form-group textarea:focus {
border-color: #3498db;
outline: none;
}
.btn-submit {
width: 100%;
padding: 12px;
background: #3498db;
color: white;
border: none;
border-radius: 5px;
font-size: 18px;
font-weight: bold;
cursor: pointer;
transition: background 0.3s, transform 0.2s;
}
.btn-submit:hover {
background: #2980b9;
}
.btn-submit:active {
transform: scale(0.98);
}
/* Footer */
footer {
background: #2c3e50;
color: white;
text-align: center;
padding: 20px;
}
/* Responsive */
@media (max-width: 768px) {
.navbar {
flex-direction: column;
gap: 15px;
}
.menu {
gap: 15px;
}
.hero h1 {
font-size: 32px;
}
.grille-services {
grid-template-columns: 1fr;
}
}
Cours n°1 — Fondamentaux
| Étape | Compétence acquise |
|---|---|
| 1 | HTML = structure, CSS = style |
| 2 | Balises et attributs de base |
| 3 | Structure sémantique |
| 4 | Bloc vs inline |
| 5 | class et id |
| 6 | Syntaxe CSS |
| 7 | Appliquer le CSS |
- ✅ JavaScript — pour rendre vos pages interactives
- ✅ SASS/LESS — pour des CSS plus puissants
- ✅ Bootstrap/Tailwind — pour des frameworks CSS rapides