Contenu Détaillé - L2 Génie Informatique
Qu'est-ce que le HTML ?
Anatomie d'une balise HTML
<balise></balise><img />, <br />Structure de base d'une page HTML
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ma première page</title>
</head>
<body>
<h1>Bonjour le monde !</h1>
<p>Ceci est ma première page web.</p>
</body>
</html>
Explication ligne par ligne :
<!DOCTYPE html> : Déclare le type de document (HTML5)<html lang="fr"> : Élément racine, lang définit la langue<head> : Métadonnées de la page (non visibles)<meta charset="UTF-8"> : Encodage des caractères<meta name="viewport"...> : Responsive design<title> : Titre dans l'onglet du navigateur<body> : Contenu visible de la pageCommentaires HTML
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Mon Site Personnel</title>
<!-- Les styles CSS seront ajoutés ici plus tard -->
</head>
<body>
<h1>Bienvenue sur mon site</h1>
<p>Je suis étudiant en génie informatique.</p>
</body>
</html>
Consignes :
index.htmlDurée : 30 minutes
! puis Tab pour générer automatiquement la structure HTML de base.
<h1>Titre principal</h1> <h2>Sous-titre niveau 2</h2> <h3>Sous-titre niveau 3</h3> <h4>Sous-titre niveau 4</h4> <h5>Sous-titre niveau 5</h5> <h6>Sous-titre niveau 6</h6>
<h1> par page pour le SEO. Respecter la hiérarchie (ne pas passer de h2 à h4).
<p>Ceci est un paragraphe. Le texte s'adapte automatiquement à la largeur de la fenêtre.</p> <p>Premier vers d'un poème<br> Deuxième vers du même paragraphe</p>
<strong>Texte important (gras)</strong> <em>Texte avec emphase (italique)</em> <mark>Texte surligné</mark> <small>Texte en petit</small> <del>Texte barré</del> <ins>Texte inséré (souligné)</ins> <sub>Indice</sub> H<sub>2</sub>O <sup>Exposant</sup> E=mc<sup>2</sup>
<strong> = importance sémantique (SEO)<b> = juste visuel (à éviter)<em> = emphase sémantique<i> = juste visuel (à éviter)
<ul>
<li>Premier élément</li>
<li>Deuxième élément</li>
<li>Troisième élément</li>
</ul>
<ol>
<li>Première étape</li>
<li>Deuxième étape</li>
<li>Troisième étape</li>
</ol>
<!-- Liste avec type spécifique -->
<ol type="A"> <!-- A, a, I, i, 1 -->
<li>Élément A</li>
<li>Élément B</li>
</ol>
<dl>
<dt>HTML</dt>
<dd>HyperText Markup Language</dd>
<dt>CSS</dt>
<dd>Cascading Style Sheets</dd>
</dl>
<ul>
<li>Langages Front-end
<ul>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
</li>
<li>Langages Back-end
<ul>
<li>PHP</li>
<li>Python</li>
<li>Node.js</li>
</ul>
</li>
</ul>
Créer un CV en HTML avec :
Durée : 45 minutes
<a href="https://www.example.com">Cliquez ici</a>
1. Lien Externe (absolu)
<a href="https://www.google.com">Aller sur Google</a>
2. Lien Interne Relatif
<!-- Fichier dans le même dossier --> <a href="contact.html">Contact</a> <!-- Fichier dans un sous-dossier --> <a href="pages/about.html">À propos</a> <!-- Revenir au dossier parent --> <a href="../index.html">Accueil</a>
3. Ancres (Liens vers une section)
<!-- Créer l'ancre --> <h2 id="services">Nos Services</h2> <!-- Lien vers l'ancre --> <a href="#services">Voir les services</a> <!-- Lien vers ancre sur autre page --> <a href="page.html#section2">Aller à la section 2</a>
4. Lien Email
<a href="mailto:contact@example.com">Nous contacter</a>
<!-- Avec sujet prédéfini -->
<a href="mailto:contact@example.com?subject=Demande d'information">
Envoyer un email
</a>
5. Lien Téléphone
<a href="tel:+1234567890">Appelez-nous</a>
<!-- Ouvrir dans nouvel onglet -->
<a href="https://example.com" target="_blank">Lien externe</a>
<!-- Info-bulle au survol -->
<a href="page.html" title="En savoir plus">Cliquez ici</a>
<!-- Télécharger un fichier -->
<a href="document.pdf" download>Télécharger PDF</a>
<!-- Lien sans référent (sécurité) -->
<a href="https://example.com" target="_blank" rel="noopener noreferrer">
Lien sécurisé
</a>
<nav>
<ul>
<li><a href="index.html">Accueil</a></li>
<li><a href="about.html">À propos</a></li>
<li><a href="services.html">Services</a></li>
<li><a href="contact.html">Contact</a></li>
</ul>
</nav>
<nav>
<ul>
<li><a href="#">Produits</a>
<ul>
<li><a href="web.html">Développement Web</a></li>
<li><a href="mobile.html">Applications Mobile</a></li>
<li><a href="design.html">Design</a></li>
</ul>
</li>
</ul>
</nav>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Mon Site</title>
</head>
<body>
<header>
<h1>Mon Site Web</h1>
<nav>
<ul>
<li><a href="#accueil">Accueil</a></li>
<li><a href="#services">Services</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<section id="accueil">
<h2>Bienvenue</h2>
<p>Contenu de la section accueil</p>
</section>
<section id="services">
<h2>Nos Services</h2>
<p>Contenu des services</p>
</section>
<section id="contact">
<h2>Contact</h2>
<p>Email : <a href="mailto:contact@site.com">contact@site.com</a></p>
</section>
</body>
</html>
Créer un site avec 4 pages :
Chaque page doit avoir :
Durée : 60 minutes
rel="noopener noreferrer" avec target="_blank"<img src="chemin/image.jpg" alt="Description de l'image">
Attributs essentiels :
src : chemin vers l'image (obligatoire)alt : texte alternatif (obligatoire pour accessibilité)width : largeur en pixelsheight : hauteur en pixelstitle : info-bulle au survol<!-- Image dans le même dossier --> <img src="photo.jpg" alt="Photo"> <!-- Image dans un sous-dossier --> <img src="images/photo.jpg" alt="Photo"> <!-- Image dans dossier parent --> <img src="../images/photo.jpg" alt="Photo"> <!-- Image en ligne (URL absolue) --> <img src="https://example.com/image.jpg" alt="Photo">
<figure>
<img src="photo.jpg" alt="Paysage de montagne">
<figcaption>Vue panoramique des Alpes en été</figcaption>
</figure>
<!-- Méthode simple avec CSS -->
<img src="photo.jpg" alt="Photo" style="max-width: 100%; height: auto;">
<!-- Balise picture pour différentes sources -->
<picture>
<source media="(min-width: 800px)" srcset="large.jpg">
<source media="(min-width: 400px)" srcset="medium.jpg">
<img src="small.jpg" alt="Image responsive">
</picture>
<audio controls>
<source src="audio.mp3" type="audio/mpeg">
<source src="audio.ogg" type="audio/ogg">
Votre navigateur ne supporte pas l'élément audio.
</audio>
<!-- Attributs utiles -->
<audio controls autoplay loop muted>
<source src="audio.mp3" type="audio/mpeg">
</audio>
<video width="640" height="360" controls>
<source src="video.mp4" type="video/mp4">
<source src="video.webm" type="video/webm">
Votre navigateur ne supporte pas la vidéo.
</video>
<!-- Avec poster (image avant lecture) -->
<video width="640" height="360" controls poster="thumbnail.jpg">
<source src="video.mp4" type="video/mp4">
</video>
<iframe width="560" height="315"
src="https://www.youtube.com/embed/VIDEO_ID"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen>
</iframe>
alt est crucial pour :
<img src="logo.png" alt="Logo de l'entreprise XYZ">
Créer une page de galerie photos avec :
Bonus : Créer un logo en SVG simple
Durée : 45 minutes
<img loading="lazy" src="...">
<table>
<tr> <!-- Table Row = ligne -->
<th>En-tête 1</th> <!-- Table Header = en-tête -->
<th>En-tête 2</th>
</tr>
<tr>
<td>Donnée 1</td> <!-- Table Data = cellule -->
<td>Donnée 2</td>
</tr>
<tr>
<td>Donnée 3</td>
<td>Donnée 4</td>
</tr>
</table>
<table>
<thead> <!-- En-tête du tableau -->
<tr>
<th>Produit</th>
<th>Prix</th>
<th>Quantité</th>
</tr>
</thead>
<tbody> <!-- Corps du tableau -->
<tr>
<td>Ordinateur</td>
<td>800€</td>
<td>2</td>
</tr>
<tr>
<td>Souris</td>
<td>25€</td>
<td>5</td>
</tr>
</tbody>
<tfoot> <!-- Pied du tableau -->
<tr>
<td colspan="2">Total</td>
<td>1725€</td>
</tr>
</tfoot>
</table>
colspan : Fusionner des colonnes horizontalement
<table>
<tr>
<th colspan="3">Titre sur 3 colonnes</th>
</tr>
<tr>
<td>Cellule 1</td>
<td>Cellule 2</td>
<td>Cellule 3</td>
</tr>
</table>
rowspan : Fusionner des lignes verticalement
<table>
<tr>
<td rowspan="2">Fusionne 2 lignes</td>
<td>Cellule A</td>
</tr>
<tr>
<td>Cellule B</td>
</tr>
</table>
Combinaison colspan et rowspan
<table>
<tr>
<th rowspan="2">Jour</th>
<th colspan="2">Horaires</th>
</tr>
<tr>
<th>Matin</th>
<th>Après-midi</th>
</tr>
<tr>
<td>Lundi</td>
<td>9h-12h</td>
<td>14h-17h</td>
</tr>
</table>
<table>
<caption>Résultats des examens - Semestre 1</caption>
<thead>
<tr>
<th scope="col">Étudiant</th>
<th scope="col">Note</th>
<th scope="col">Mention</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Jean Dupont</th>
<td>15/20</td>
<td>Bien</td>
</tr>
</tbody>
</table>
<caption> : Titre du tableauscope="col" : En-tête de colonnescope="row" : En-tête de ligne<table border="1" cellpadding="10" cellspacing="0">
<!-- border: bordure -->
<!-- cellpadding: espacement interne -->
<!-- cellspacing: espacement entre cellules -->
</table>
<table>
<caption>Emploi du Temps - Semaine du 20 Janvier</caption>
<thead>
<tr>
<th>Heure</th>
<th>Lundi</th>
<th>Mardi</th>
<th>Mercredi</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">8h-10h</th>
<td>HTML/CSS</td>
<td>JavaScript</td>
<td rowspan="2">Projet</td>
</tr>
<tr>
<th scope="row">10h-12h</th>
<td colspan="2">Algorithmique</td>
</tr>
</tbody>
</table>
Créer un tableau HTML représentant :
Durée : 50 minutes
<form action="traitement.php" method="post">
<!-- Champs du formulaire ici -->
</form>
Attributs de <form> :
action : URL où envoyer les donnéesmethod : GET (URL visible) ou POST (données cachées)enctype : Type d'encodage (pour upload de fichiers)<!-- Texte simple -->
<label for="nom">Nom :</label>
<input type="text" id="nom" name="nom" placeholder="Votre nom">
<!-- Email avec validation -->
<label for="email">Email :</label>
<input type="email" id="email" name="email" required>
<!-- Mot de passe -->
<label for="password">Mot de passe :</label>
<input type="password" id="password" name="password" minlength="8">
<!-- Numéro de téléphone -->
<label for="tel">Téléphone :</label>
<input type="tel" id="tel" name="tel" pattern="[0-9]{10}">
<!-- Nombre --> <label for="age">Âge :</label> <input type="number" id="age" name="age" min="18" max="100" step="1"> <!-- Range (curseur) --> <label for="volume">Volume :</label> <input type="range" id="volume" name="volume" min="0" max="100" value="50">
<!-- Date --> <label for="birthday">Date de naissance :</label> <input type="date" id="birthday" name="birthday"> <!-- Date et heure --> <label for="rdv">Rendez-vous :</label> <input type="datetime-local" id="rdv" name="rdv"> <!-- Heure --> <label for="heure">Heure :</label> <input type="time" id="heure" name="heure"> <!-- Mois --> <label for="mois">Mois :</label> <input type="month" id="mois" name="mois"> <!-- Semaine --> <label for="semaine">Semaine :</label> <input type="week" id="semaine" name="semaine">
<!-- URL --> <label for="site">Site web :</label> <input type="url" id="site" name="site" placeholder="https://..."> <!-- Recherche --> <label for="search">Rechercher :</label> <input type="search" id="search" name="search"> <!-- Couleur --> <label for="couleur">Couleur préférée :</label> <input type="color" id="couleur" name="couleur" value="#ff0000">
<!-- Méthode 1 : avec for et id (recommandée) -->
<label for="nom">Nom :</label>
<input type="text" id="nom" name="nom">
<!-- Méthode 2 : label englobant -->
<label>
Nom :
<input type="text" name="nom">
</label>
for du label doit correspondre à l'id de l'input.
<!-- Bouton de soumission --> <button type="submit">Envoyer</button> <input type="submit" value="Envoyer"> <!-- Bouton de réinitialisation --> <button type="reset">Réinitialiser</button> <!-- Bouton simple (JavaScript) --> <button type="button">Cliquez-moi</button>
<input type="text"
name="username" <!-- Nom pour traitement serveur -->
id="username" <!-- ID unique pour label -->
value="Valeur par défaut" <!-- Valeur pré-remplie -->
placeholder="Texte d'aide" <!-- Indication dans le champ -->
required <!-- Champ obligatoire -->
readonly <!-- Lecture seule -->
disabled <!-- Désactivé -->
maxlength="50" <!-- Longueur max -->
minlength="3" <!-- Longueur min -->
pattern="[A-Za-z]{3,}" <!-- Expression régulière -->
autocomplete="on" <!-- Autocomplétion -->
>
<form action="inscription.php" method="post">
<h2>Inscription</h2>
<label for="prenom">Prénom :</label>
<input type="text" id="prenom" name="prenom" required>
<label for="nom">Nom :</label>
<input type="text" id="nom" name="nom" required>
<label for="email">Email :</label>
<input type="email" id="email" name="email" required>
<label for="password">Mot de passe :</label>
<input type="password" id="password" name="password"
minlength="8" required>
<label for="birthday">Date de naissance :</label>
<input type="date" id="birthday" name="birthday" required>
<button type="submit">S'inscrire</button>
</form>
Créer un formulaire d'inscription complet avec :
Durée : 45 minutes
autocomplete pour améliorer l'UX<textarea>, <select> et <option><input type="file"><label for="message">Message :</label>
<textarea id="message" name="message" rows="4" cols="50"
placeholder="Écrivez votre message ici..."></textarea>
<textarea> : zone de texte sur plusieurs lignesrows : nombre de lignes visiblescols : largeur approximative (en caractères)width, height<label for="pays">Pays :</label>
<select id="pays" name="pays">
<option value="">-- Sélectionnez un pays --</option>
<option value="td">Tchad</option>
<option value="cm">Cameroun</option>
<option value="sn">Sénégal</option>
<option value="fr">France</option>
</select>
Liste déroulante avec sélection multiple :
<label for="langages">Langages préférés :</label>
<select id="langages" name="langages[]" multiple size="4">
<option value="html">HTML</option>
<option value="css">CSS</option>
<option value="js">JavaScript</option>
<option value="python">Python</option>
</select>
multiple : permet de sélectionner plusieurs options (Ctrl + clic)size : nombre d’options visiblesname="langages[]" : côté serveur, on récupère un tableau de valeurs<p>Centres d'intérêt :</p>
<label>
<input type="checkbox" name="interets" value="informatique">
Informatique
</label>
<label>
<input type="checkbox" name="interets" value="sport">
Sport
</label>
<label>
<input type="checkbox" name="interets" value="lecture">
Lecture
</label>
type="checkbox" : case à cochername<p>Genre :</p>
<label>
<input type="radio" name="genre" value="homme">
Homme
</label>
<label>
<input type="radio" name="genre" value="femme">
Femme
</label>
<label>
<input type="radio" name="genre" value="autre">
Autre
</label>
name<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="cv">Votre CV (PDF) :</label>
<input type="file" id="cv" name="cv" accept=".pdf">
<button type="submit">Envoyer</button>
</form>
type="file" : permet de sélectionner un fichierenctype="multipart/form-data" : obligatoire pour l’uploadaccept=".pdf,.docx,image/*" : filtre les types de fichiers<input type="text"
name="username"
required
minlength="3"
maxlength="20"
pattern="[A-Za-z0-9_]+"
title="3 à 20 caractères, lettres, chiffres ou underscore">
required : champ obligatoireminlength / maxlength : longueur min/maxpattern : expression régulière (regex)title : message d’aide affiché lors de la validation<form action="contact.php" method="post">
<h2>Formulaire de Contact</h2>
<label for="nom">Nom complet :</label>
<input type="text" id="nom" name="nom" required>
<label for="email">Email :</label>
<input type="email" id="email" name="email" required>
<label for="sujet">Sujet :</label>
<input type="text" id="sujet" name="sujet" required>
<label for="type">Type de demande :</label>
<select id="type" name="type" required>
<option value="">-- Sélectionnez --</option>
<option value="info">Informations</option>
<option value="support">Support technique</option>
<option value="autre">Autre</option>
</select>
<p>Souhaitez-vous recevoir une copie par email ?</p>
<label>
<input type="checkbox" name="copie" value="oui">
Oui, envoyer une copie
</label>
<label for="message">Message :</label>
<textarea id="message" name="message" rows="5" required></textarea>
<label for="fichier">Pièce jointe (optionnel) :</label>
<input type="file" id="fichier" name="fichier" accept=".pdf,.jpg,.png">
<button type="submit">Envoyer</button>
<button type="reset">Réinitialiser</button>
</form>
Créer un formulaire complet contenant :
<textarea>Durée : 45 minutes
<label> à chaque <input>placeholder : le label doit rester visible<header>, <main>, <section>, <article>, <aside>, <footer><header> : en-tête de page ou de section (logo, menu, titre)<nav> : zone de navigation (menu principal, liens importants)<main> : contenu principal unique de la page<section> : grande section thématique du document<article> : contenu autonome (article de blog, carte, post)<aside> : contenu secondaire (barre latérale, pub, infos complémentaires)<footer> : pied de page (copyright, liens légaux, contacts)<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Site d'exemple</title>
</head>
<body>
<header>
<h1>Mon Site Web</h1>
<nav>
<ul>
<li><a href="#accueil">Accueil</a></li>
<li><a href="#blog">Blog</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<section id="accueil">
<h2>Bienvenue</h2>
<p>Texte de présentation du site.</p>
</section>
<section id="blog">
<h2>Derniers Articles</h2>
<article>
<h3>Article 1</h3>
<p>Contenu du premier article...</p>
</article>
<article>
<h3>Article 2</h3>
<p>Contenu du deuxième article...</p>
</article>
</section>
<aside>
<h2>Informations</h2>
<p>Lien vers les réseaux sociaux, newsletter, etc.</p>
</aside>
</main>
<footer>
<p>© 2025 - Mon Site Web</p>
</footer>
</body>
</html>
<div> : conteneur générique, sans signification particulière<div> à l’intérieur des sections sémantiques pour la mise en page<header>, <main>, <footer> dans une page moderne.<div> (code difficile à lire et à maintenir).
<main>
<section id="presentation">
<h2>À propos de moi</h2>
<p>Étudiant en Génie Informatique, passionné par le web.</p>
</section>
<section id="projets">
<h2>Mes Projets</h2>
<article>
<h3>Projet 1 : Site de préinscription</h3>
<p>Description du projet...</p>
</article>
<article>
<h3>Projet 2 : Application de gestion</h3>
<p>Description du projet...</p>
</article>
</section>
</main>
Consignes :
<div>) ou créer une page simple<div> génériques par :
<header> pour le haut de page<nav> pour le menu<main> pour le contenu principal<section> pour les grandes parties<article> pour chaque bloc de contenu autonome<aside> pour les informations secondaires<footer> pour le bas de pageid pertinents pour permettre la navigation interne (ancres)Durée : 45 minutes
1. CSS en ligne (inline)
<h1 style="color: blue; font-size: 24px;">
Titre en bleu
</h1>
style directement sur la balise HTML2. CSS interne (dans <style>)
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>CSS Interne</title>
<style>
h1 {
color: darkred;
text-align: center;
}
</style>
</head>
<body>
<h1>Titre stylisé avec CSS interne</h1>
</body>
</html>
<style> du <head>3. CSS externe (fichier .css séparé)
<!-- index.html -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>CSS Externe</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Titre avec CSS externe</h1>
<p>Paragraphe stylisé.</p>
</body>
</html>
/* style.css */
h1 {
color: #2c3e50;
text-align: center;
}
p {
font-size: 16px;
line-height: 1.5;
}
sélecteur {
propriété: valeur;
autre-propriété: autre-valeur;
}
Exemple :
p {
color: green;
font-size: 18px;
}
p);/* Ceci est un commentaire en CSS */
h1 {
color: blue; /* Commentaire sur la même ligne */
}
; pour éviter des erreurs.
Fichier : index.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ma première page CSS</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>Bienvenue sur mon site</h1>
<p>Étudiant en Génie Informatique.</p>
</header>
<main>
<h2>Section principale</h2>
<p>Ceci est un paragraphe stylisé avec CSS.</p>
</main>
</body>
</html>
Fichier : style.css
body {
font-family: Arial, sans-serif;
background-color: #f4f6f8;
margin: 0;
padding: 20px;
}
h1 {
color: #2c3e50;
text-align: center;
}
h2 {
color: #34495e;
}
p {
font-size: 16px;
line-height: 1.5;
}
Consignes :
index.html avec une structure HTML5 correcte.style.css dans le même dossier.<head> avec <link rel="stylesheet" href="style.css">.style.css, définir :
background-color)font-family)Durée : 30–40 minutes
:hover, :focus, :first-child, :nth-child()::before, ::after, ::first-lettersélecteur {
propriété: valeur;
}
1. Sélecteur par élément (type selector)
p {
color: blue;
}
h1 {
text-align: center;
}
p, h1, ul…)2. Sélecteur par classe (class selector)
<p class="important">Texte important</p> <p class="important">Autre texte important</p>
.important {
font-weight: bold;
color: red;
}
. suivi du nom de la classe : .important3. Sélecteur par id (id selector)
<h1 id="titre-principal">Bienvenue</h1>
#titre-principal {
font-size: 32px;
text-transform: uppercase;
}
# suivi de l’id : #titre-principal4. Combiner type + classe
p.important {
color: darkred;
}
<p> qui ont la classe important1. Descendant : espace
article p {
color: #333;
}
<p> qui sont à l’intérieur de <article> (à n’importe quel niveau)2. Enfant direct : >
ul > li {
list-style-type: square;
}
<li> qui sont des enfants directs de <ul>3. Frère adjacent : +
h2 + p {
margin-top: 0;
}
<p> qui vient juste après un <h2>4. Frères généraux : ~
h2 ~ p {
color: gray;
}
<p> qui se trouvent après un <h2> au même niveauUne pseudo-classe cible un état particulier d’un élément.
1. :hover (au survol)
a {
color: blue;
}
a:hover {
color: red;
text-decoration: underline;
}
:hover : style appliqué quand la souris survole l’élément2. :focus (élément focalisé)
input:focus {
outline: 2px solid #3498db;
background-color: #ecf7ff;
}
:focus : quand le champ est actif (cliqué ou sélectionné au clavier)3. :first-child
ul li:first-child {
font-weight: bold;
}
<li> de chaque <ul>4. :nth-child()
tr:nth-child(odd) {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #ffffff;
}
odd = lignes impaires, even = lignes pairesnth-child(3), nth-child(2n)…Un pseudo-élément permet de styliser une partie d’un élément.
1. ::first-letter
p::first-letter {
font-size: 200%;
font-weight: bold;
}
2. ::before et ::after
h2::before {
content: "★ ";
color: gold;
}
h2::after {
content: " ★";
color: gold;
}
content est obligatoire avec ::before et ::afterclass pour réutiliser les styles sur plusieurs éléments.id pour des éléments uniques (ne pas en abuser).HTML :
<div class="carte-profil">
<h2>Mahamat Ali</h2>
<p class="role">Étudiant en Génie Informatique</p>
<ul class="infos">
<li>Ville : Abéché</li>
<li>Spécialité : Développement Web</li>
<li>Passion : Open Source</li>
</ul>
<a href="#" class="btn">Voir le portfolio</a>
</div>
CSS :
.carte-profil {
border: 1px solid #ddd;
padding: 16px;
border-radius: 8px;
max-width: 300px;
background-color: #ffffff;
}
.carte-profil h2 {
margin-top: 0;
}
.carte-profil .role {
color: #555;
font-style: italic;
}
.carte-profil .infos li:first-child {
font-weight: bold;
}
.carte-profil .infos li:nth-child(odd) {
background-color: #f7f7f7;
}
.carte-profil .btn {
display: inline-block;
margin-top: 10px;
padding: 8px 12px;
text-decoration: none;
background-color: #3498db;
color: #fff;
border-radius: 4px;
}
.carte-profil .btn:hover {
background-color: #2980b9;
}
Consignes :
<h1><h2> et plusieurs <p><ul>) avec au moins 4 éléments chacune<a> (internes et externes)p).important et l’appliquer à certains paragraphesid (par ex. #intro)section p):first-child:nth-child(odd) et :nth-child(even):hoverDurée : 45 minutes
.btn-primary, .carte-profil, .texte-important, etc.
font-family, font-size, font-weight, font-stylecolor, text-align, text-decoration, line-height, letter-spacingtext-shadow1. font-family (famille de police)
body {
font-family: Arial, Helvetica, sans-serif;
}
.titre-special {
font-family: "Times New Roman", serif;
}
serif, sans-serif, monospace2. font-size (taille de police)
p {
font-size: 16px;
}
h1 {
font-size: 32px;
}
px, em, rem, %1em = taille de la police de l’élément parent1rem = taille de la police de la racine (html)3. font-weight (graisse / épaisseur)
.gras {
font-weight: bold; /* ou 700 */
}
.fin {
font-weight: 300;
}
normal, bold, ou nombres (100 → 900)4. font-style (style de police)
.italique {
font-style: italic;
}
5. Raccourci font
p {
font: italic 16px/1.5 "Roboto", Arial, sans-serif;
}
font: font-style font-size/line-height font-family;1️⃣ Aller sur Google Fonts, choisir une police (ex : Poppins), copier le lien :
<!-- Dans <head> --> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap">
2️⃣ Utiliser dans le CSS :
body {
font-family: "Poppins", sans-serif;
}
1. color (couleur du texte)
p {
color: #333333;
}
2. text-align (alignement)
h1 {
text-align: center; /* left, right, center, justify */
}
3. text-decoration
a {
text-decoration: none;
}
.ligne {
text-decoration: underline;
}
none, underline, line-through, etc.4. line-height (interligne)
p {
line-height: 1.6;
}
5. letter-spacing (espacement des lettres)
.titre-large {
letter-spacing: 2px;
}
6. text-transform (transformation du texte)
.majuscule {
text-transform: uppercase; /* lowercase, capitalize */
}
.titre-ombre {
text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
}
text-shadow: décalage-x décalage-y flou couleur;HTML :
<section class="presentation">
<h1>Bienvenue sur mon Portfolio</h1>
<p class="sous-titre">
Étudiant en Génie Informatique, passionné par le Web.
</p>
<p>
Je développe des applications modernes avec une attention particulière
à l'ergonomie, la performance et la qualité du code.
</p>
</section>
CSS :
body {
font-family: "Poppins", Arial, sans-serif;
color: #2c3e50;
}
.presentation h1 {
font-size: 36px;
text-align: center;
text-transform: uppercase;
letter-spacing: 3px;
text-shadow: 1px 1px 2px rgba(0,0,0,0.2);
}
.presentation .sous-titre {
font-size: 18px;
font-style: italic;
text-align: center;
color: #7f8c8d;
}
.presentation p {
line-height: 1.7;
}
Consignes :
<h1><h2> ou paragraphe de descriptionline-height.important)text-shadow sur le titre principal.Durée : 45 minutes
line-height pour voir la différence de confort de lecture.background-color et background-imagelinear-gradient() et radial-gradient()1. Noms de couleurs
h1 {
color: red; /* blue, green, orange, purple... */
}
2. Hexadécimal (HEX)
p {
color: #3498db; /* #RRGGBB */
}
3. RGB
.texte {
color: rgb(52, 152, 219); /* rgb(r, g, b) entre 0 et 255 */
}
4. RGBA (avec transparence)
.fond-transparent {
background-color: rgba(0, 0, 0, 0.5); /* 0 = transparent, 1 = opaque */
}
5. HSL (Teinte, Saturation, Luminosité)
.titre {
color: hsl(200, 70%, 50%);
}
body {
background-color: #f5f5f5;
}
.entete {
background-color: #2c3e50;
color: white;
}
.hero {
background-image: url("images/banniere.jpg");
}
Contrôler la taille : background-size
.hero {
background-image: url("images/banniere.jpg");
background-size: cover; /* cover, contain ou valeurs (100px, 50%) */
}
cover : couvre toute la zone, l’image peut être coupéecontain : l’image est entièrement visible (peut laisser des espaces)Contrôler la répétition : background-repeat
.motif {
background-image: url("images/motif.png");
background-repeat: repeat; /* no-repeat, repeat-x, repeat-y */
}
Contrôler la position : background-position
.hero {
background-image: url("images/banniere.jpg");
background-position: center center; /* left, right, top, bottom */
}
Propriété raccourcie : background
.hero {
background: url("images/banniere.jpg") no-repeat center center / cover;
}
1. linear-gradient()
.banniere {
background: linear-gradient(90deg, #2980b9, #8e44ad);
}
2. radial-gradient()
.cercle {
background: radial-gradient(circle, #ffffff, #bdc3c7);
}
.section-fond {
background-image: url("images/fond.jpg");
background-size: cover;
background-attachment: fixed; /* l’image reste fixe au scroll */
}
HTML :
<section class="hero-section">
<h1>Numérisation d'Abéché</h1>
<p>Connectons notre ville grâce au numérique.</p>
<a href="#projets" class="btn-hero">Découvrir les projets</a>
</section>
CSS :
.hero-section {
padding: 80px 20px;
text-align: center;
color: #ffffff;
background: linear-gradient(135deg, #2980b9, #8e44ad);
}
.hero-section h1 {
font-size: 40px;
margin-bottom: 10px;
}
.hero-section p {
font-size: 18px;
margin-bottom: 20px;
}
.btn-hero {
display: inline-block;
padding: 10px 20px;
background-color: rgba(0,0,0,0.2);
color: #fff;
text-decoration: none;
border-radius: 4px;
}
.btn-hero:hover {
background-color: rgba(0,0,0,0.4);
}
Consignes :
Durée : 45 minutes
width, height, padding, border, marginbox-sizing: content-box et box-sizing: border-boxEn CSS, tout élément est une boîte composée de :
.boite {
width: 300px;
height: 150px;
}
.boite {
padding: 20px; /* tous les côtés */
padding-top: 10px;
padding-right: 15px;
padding-bottom: 10px;
padding-left: 15px;
}
Raccourcis :
padding: 10px 20px; /* haut/bas | gauche/droite */ padding: 10px 20px 15px 5px; /* haut | droite | bas | gauche */
.boite {
margin: 20px;
}
Centrer horizontalement un bloc :
.boite {
width: 400px;
margin: 0 auto; /* haut/bas = 0, gauche/droite = auto */
}
.boite {
border: 2px solid #2c3e50; /* width style color */
}
1. content-box (valeur par défaut)
.boite {
box-sizing: content-box;
}
width = seulement le contenu (content)2. border-box
.boite {
box-sizing: border-box;
}
width inclut le contenu + padding + borderBonne pratique globale :
*,
*::before,
*::after {
box-sizing: border-box;
}
Marges négatives :
.boite {
margin-top: -10px; /* remonte l’élément vers le haut */
}
Fusion des marges (margin collapsing) :
box-sizing: border-box pour simplifier le calcul des largeurs.HTML :
<div class="carte">
<h2>Titre de la carte</h2>
<p>
Ceci est une petite carte de contenu avec un padding,
une bordure et une marge externe.
</p>
</div>
CSS :
*,
*::before,
*::after {
box-sizing: border-box;
}
.carte {
width: 300px;
padding: 20px;
margin: 20px auto;
border: 1px solid #ccc;
background-color: #ffffff;
}
Consignes :
<div> avec des classes différentes (.box1, .box2, .box3).width / heightpaddingbordermarginbox-sizing: content-box et border-box.Durée : 40 minutes
* { outline: 1px solid red; }) pour bien voir les boîtes.border-width, border-style, border-color, border-radiusborder-top, border-right, etc.box-shadowborder et outline1. Propriétés de base
.bloc {
border-width: 2px;
border-style: solid; /* solid, dashed, dotted, double... */
border-color: #2c3e50;
}
2. Propriété raccourcie
.bloc {
border: 2px solid #2c3e50;
}
3. Bordures individuelles
.bloc {
border-top: 2px solid red;
border-right: 2px dashed green;
border-bottom: 2px dotted blue;
border-left: 4px solid black;
}
.bouton {
border-radius: 8px;
}
.cercle {
width: 100px;
height: 100px;
border-radius: 50%; /* cercle parfait */
}
px, % ou autres unitésCoins individuels :
.carte {
border-top-left-radius: 10px;
border-top-right-radius: 10px;
}
.carte {
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
box-shadow: offset-x offset-y flou étendue couleur;offset-x : déplacement horizontaloffset-y : déplacement verticalflou : adoucit l’ombreétendue (spread) : agrandit/réduit la zone de l’ombre (optionnel)Exemples :
.carte-leger {
box-shadow: 0 1px 3px rgba(0,0,0,0.15);
}
.carte-forte {
box-shadow: 0 8px 16px rgba(0,0,0,0.3);
}
.focus {
outline: 2px solid #3498db;
}
outline ne prend pas de place dans le box model (ne décale pas les autres éléments)Combiner bordures, radius et ombres pour créer des composants modernes.
HTML :
<div class="card-projet">
<h3>Projet : NaibiAfrica</h3>
<p>
Plateforme de préinscription en ligne pour les établissements
d'enseignement supérieur au Tchad.
</p>
<a href="#" class="btn-card">Voir les détails</a>
</div>
CSS :
.card-projet {
max-width: 320px;
margin: 20px auto;
padding: 20px;
border-radius: 12px;
border: 1px solid #e0e0e0;
box-shadow: 0 4px 10px rgba(0,0,0,0.08);
background-color: #ffffff;
}
.card-projet h3 {
margin-top: 0;
margin-bottom: 10px;
}
.card-projet p {
margin-bottom: 15px;
}
.btn-card {
display: inline-block;
padding: 8px 14px;
border-radius: 8px;
background-color: #3498db;
color: #fff;
text-decoration: none;
}
.btn-card:hover {
box-shadow: 0 2px 6px rgba(0,0,0,0.2);
}
Consignes :
border-radius pour arrondir les coinsbox-shadow légèreDurée : 45 minutes
box-shadow en direct.display)static, relative, absolute, fixed, stickytop, right, bottom, leftz-index1. display: block
.bloc {
display: block;
}
<div>, <p>, <h1>2. display: inline
.inline {
display: inline;
}
width / height<span>, <a>3. display: inline-block
.carte {
display: inline-block;
}
4. display: none
.cacher {
display: none;
}
1. position: static (par défaut)
.elt {
position: static;
}
2. position: relative
.boite {
position: relative;
top: 10px; /* décalage par rapport à sa position normale */
}
absolute3. position: absolute
.menu {
position: absolute;
top: 20px;
right: 20px;
}
4. position: fixed
.barre-haut {
position: fixed;
top: 0;
width: 100%;
}
5. position: sticky
.titre {
position: sticky;
top: 10px;
}
.elt {
position: absolute;
top: 50px;
left: 30px;
}
.avant {
position: relative;
z-index: 10;
}
.arriere {
position: relative;
z-index: 0;
}
margin: 0 auto; ou Flexbox.position: absolute se base toujours sur le premier parent positionné.absolute pour construire une page entière.
HTML :
<nav class="menu-fixe">
<a href="#">Accueil</a>
<a href="#">Services</a>
<a href="#">Contact</a>
</nav>
CSS :
.menu-fixe {
position: fixed;
top: 0;
left: 0;
width: 100%;
background-color: #34495e;
padding: 10px;
}
.menu-fixe a {
color: white;
margin-right: 20px;
}
position: fixedabsolute ou fixedDurée : 45 minutes
sticky fonctionne mieux dans les conteneurs ayant une hauteur suffisante.clearoverflow : visible, hidden, scroll, auto.gauche {
float: left;
width: 50%;
}
.droite {
float: right;
width: 50%;
}
.cleaner {
clear: both;
}
.bloc {
width: 200px;
height: 100px;
overflow: auto; /* visible, hidden, scroll, auto */
}
hidden = coupe ce qui dépassescroll = ajoute toujours des barres de défilementauto = ajoute des barres si nécessaire.bloc {
width: 300px;
margin: 0 auto;
}
Méthode 1 : line-height (pour du texte)
.texte {
height: 100px;
line-height: 100px;
}
Méthode 2 : position + transform
.centre {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.col {
width: 50%;
float: left;
padding: 10px;
}
<div class="col">Colonne 1</div> <div class="col">Colonne 2</div> <div class="cleaner"></div>
HTML :
<div class="colonne gauche">
<h2>Colonne 1</h2>
<p>Contenu colonne gauche</p>
</div>
<div class="colonne droite">
<h2>Colonne 2</h2>
<p>Contenu colonne droite</p>
</div>
<div class="cleaner"></div>
CSS :
.colonne {
width: 50%;
float: left;
padding: 10px;
}
.cleaner {
clear: both;
}
.colonne h2 {
margin-top: 0;
}
cleaner pour corriger le layout.overflow: auto; pour tester le défilement.Durée : 40 minutes
display: flex, flex-direction, flex-wrapjustify-contentalign-items et align-content.container {
display: flex; /* active le mode flex */
}
Les enfants directs de .container deviennent des flex-items.
.container {
display: flex;
flex-direction: row; /* row, row-reverse, column, column-reverse */
}
row : de gauche à droite (par défaut)column : de haut en bas.container {
display: flex;
flex-wrap: wrap; /* nowrap (défaut), wrap, wrap-reverse */
}
Combinaison utile :
.container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
/* équivalent à flex-flow: row wrap; */
}
.container {
justify-content: flex-start; /* flex-start, flex-end, center, space-between, space-around, space-evenly */
}
flex-start : éléments alignés au débutcenter : centrésspace-between : premier collé au début, dernier à la fin, espace égal entrespace-around : espace autour de chaque élément.container {
align-items: stretch; /* stretch, flex-start, flex-end, center, baseline */
}
center : centre verticalement (si row)flex-start : en hautflex-end : en bas.container {
flex-wrap: wrap;
align-content: center; /* space-between, space-around, flex-start, flex-end, stretch */
}
flex-direction.HTML :
<nav class="menu-flex">
<a href="#">Accueil</a>
<a href="#">À propos</a>
<a href="#">Projets</a>
<a href="#">Contact</a>
</nav>
CSS :
.menu-flex {
display: flex;
justify-content: center;
gap: 20px;
background-color: #2c3e50;
padding: 10px;
}
.menu-flex a {
color: white;
text-decoration: none;
}
.nav avec plusieurs liens.display: flex et justify-content pour centrer ou espacer les liens.flex-direction en column dans une media query pour l’affichage mobile.Durée : 45 minutes
justify-content et align-items pour bien comprendre les axes.flex-grow, flex-shrink, flex-basisflexorderalign-self1. flex-grow (croissance)
.item1 {
flex-grow: 1;
}
.item2 {
flex-grow: 2;
}
.item2 prendra 2x plus d’espace que .item12. flex-shrink (rétrécissement)
.item {
flex-shrink: 0; /* par défaut : 1 */
}
0 = ne se rétrécit pas3. flex-basis (base de calcul)
.item {
flex-basis: 200px;
}
4. Propriété raccourcie flex
.item {
flex: 1 0 200px; /* flex-grow flex-shrink flex-basis */
}
Cas fréquents :
.item {
flex: 1; /* flex: 1 1 0 */
}
.item-auto {
flex: 0 0 auto;
}
.item1 { order: 2; }
.item2 { order: 1; }
.item-special {
align-self: center; /* auto, flex-start, flex-end, center, stretch */
}
.layout {
display: flex;
}
.sidebar {
flex: 0 0 250px; /* largeur fixe */
}
.content {
flex: 1; /* prend tout l’espace restant */
}
order pour ne pas perdre la logique du HTML.flex: 1 est très pratique pour des éléments qui doivent se répartir l’espace également.HTML :
<section class="row-cartes">
<div class="carte">Carte 1</div>
<div class="carte">Carte 2</div>
<div class="carte">Carte 3</div>
</section>
CSS :
.row-cartes {
display: flex;
gap: 20px;
}
.carte {
flex: 1;
padding: 20px;
border-radius: 8px;
background-color: #ecf0f1;
}
Consignes :
order.Durée : 50 minutes
flex (0, 1, 2…) pour voir comment l’espace se répartit.grid-template-columns et grid-template-rowsfr et les fonctions repeat(), minmax()gap, row-gap, column-gap.grid {
display: grid;
}
.grid {
display: grid;
grid-template-columns: 200px 200px 200px; /* 3 colonnes */
grid-template-rows: 150px 150px; /* 2 lignes */
}
Utiliser des unités flexibles :
.grid {
grid-template-columns: 1fr 1fr 1fr; /* 3 colonnes égales */
}
repeat()
.grid {
grid-template-columns: repeat(3, 1fr); /* 3 colonnes de 1fr */
}
minmax()
.grid {
grid-template-columns: repeat(3, minmax(200px, 1fr));
}
.grid {
display: grid;
gap: 20px; /* espace lignes + colonnes */
/* row-gap: 20px; column-gap: 10px; */
}
HTML :
<section class="galerie">
<img src="img1.jpg" alt="Photo 1">
<img src="img2.jpg" alt="Photo 2">
<img src="img3.jpg" alt="Photo 3">
<img src="img4.jpg" alt="Photo 4">
<img src="img5.jpg" alt="Photo 5">
<img src="img6.jpg" alt="Photo 6">
</section>
CSS :
.galerie {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.galerie img {
width: 100%;
height: auto;
display: block;
}
gap entre les images.width: 100%.Durée : 45 minutes
minmax() et repeat().
grid-column et grid-rowgrid-template-areas.item1 {
grid-column: 1 / 3; /* de la colonne 1 à 3 (s'étend sur 2 colonnes) */
grid-row: 1 / 2; /* première ligne */
}
Numérotation simplifiée :
.item2 {
grid-column: 2 / span 2; /* commence à 2, occupe 2 colonnes */
}
.layout {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.content { grid-area: content; }
.footer { grid-area: footer; }
HTML :
<div class="layout">
<header class="header">Header</header>
<aside class="sidebar">Sidebar</aside>
<main class="content">Contenu</main>
<footer class="footer">Footer</footer>
</div>
Aligner tout le contenu :
.layout {
justify-items: stretch; /* start, end, center, stretch */
align-items: stretch;
}
Aligner la grille elle-même :
.layout {
justify-content: center; /* start, end, center, space-between... */
align-content: center;
}
grid-template-rows/columnsgrid-template-areas est très pratique pour visualiser la structure globale.HTML :
<div class="blog-layout">
<header class="blog-header">Mon Blog</header>
<aside class="blog-sidebar">Catégories</aside>
<main class="blog-content">Articles</main>
<footer class="blog-footer">© 2025</footer>
</div>
CSS :
.blog-layout {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
min-height: 100vh;
}
.blog-header { grid-area: header; }
.blog-sidebar { grid-area: sidebar; background-color: #ecf0f1; }
.blog-content { grid-area: content; }
.blog-footer { grid-area: footer; }
Consignes :
grid-template-areas pour définir la structure.Durée : 50 minutes
grid-template-areas..blog-content).
%, em, rem, vw, vh<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Site Responsive</title>
</head>
width=device-width : la largeur de la page = largeur de l’écraninitial-scale=1.0 : niveau de zoom initial (1 = 100%)Pour les largeurs :
.container {
width: 90%; /* 90% de la largeur de l’élément parent */
max-width: 1200px;
}
em et rem (texte, marges, etc.)
html {
font-size: 16px; /* base */
}
p {
font-size: 1rem; /* = 16px */
}
.small-text {
font-size: 0.875rem; /* ~14px */
}
vw et vh (viewport width / height)
.hero {
height: 100vh; /* 100% de la hauteur de la fenêtre */
}
@media (max-width: 768px) {
/* Styles pour les écrans <= 768px */
body {
background-color: #f0f0f0;
}
}
max-width : s’applique aux écrans plus petits que la valeurmin-width : s’applique aux écrans plus grands que la valeurmin-width pour les grands écransmax-width pour les petits écransCSS :
.container {
width: 90%;
max-width: 1200px;
margin: 0 auto;
background-color: #ffffff;
padding: 20px;
}
/* Sur petits écrans */
@media (max-width: 600px) {
.container {
width: 100%;
padding: 10px;
}
}
Consignes :
width: 90% et max-width.Durée : 40 minutes
clamp() et calc() pour une typographie fluideimg {
max-width: 100%;
height: auto;
display: block;
}
max-width: 100% : l’image ne dépasse jamais de son conteneurheight: auto : conserve les proportions<picture>
<source media="(min-width: 800px)" srcset="image-large.jpg">
<source media="(min-width: 400px)" srcset="image-medium.jpg">
<img src="image-small.jpg" alt="Image responsive">
</picture>
h1 {
font-size: clamp(24px, 5vw, 40px);
}
clamp(min, valeur idéale, max).bloc {
width: calc(100% - 40px);
}
<header class="header">
<div class="logo">MonSite</div>
<button class="btn-menu">☰</button>
<nav class="nav-links">
<a href="#">Accueil</a>
<a href="#">À propos</a>
<a href="#">Services</a>
<a href="#">Contact</a>
</nav>
</header>
CSS de base (desktop) :
.header {
display: flex;
justify-content: space-between;
align-items: center;
}
.btn-menu {
display: none; /* caché sur grand écran */
}
CSS (mobile) :
@media (max-width: 768px) {
.nav-links {
display: none; /* caché par défaut sur mobile (on pourrait l’ouvrir avec JS) */
}
.btn-menu {
display: block;
}
}
HTML :
<section class="services">
<article class="service">
<img src="service1.jpg" alt="Service 1">
<h3>Service 1</h3>
<p>Description du service 1.</p>
</article>
<article class="service">
<img src="service2.jpg" alt="Service 2">
<h3>Service 2</h3>
<p>Description du service 2.</p>
</article>
</section>
CSS :
.services {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
}
.service img {
width: 100%;
height: auto;
display: block;
}
/* Mobile */
@media (max-width: 600px) {
.services {
grid-template-columns: 1fr;
}
}
Consignes :
clamp() pour la taille du titre principal.Durée : 50 minutes
transition-property, transition-duration, transition-timing-function@keyframesanimation-name, animation-duration, animation-iteration-countDéclaration simple :
.btn {
background-color: #3498db;
transition: background-color 0.3s;
}
.btn:hover {
background-color: #2980b9;
}
transition: propriété durée;Plusieurs propriétés :
.carte {
transition: transform 0.3s, box-shadow 0.3s;
}
.btn {
transition: background-color 0.3s ease-in-out;
}
linear, ease, ease-in, ease-out, ease-in-outExemple : effet de "pulse"
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.btn-pulse {
animation-name: pulse;
animation-duration: 1s;
animation-iteration-count: infinite;
}
.btn-pulse {
animation: pulse 1s infinite ease-in-out;
}
Options :
animation-delay : délai avant le débutanimation-direction : normal, reverse, alternateanimation-fill-mode : forwards, backwards, bothHTML :
<div class="card-anim">
<h3>Titre de la carte</h3>
<p>Contenu de la carte.</p>
</div>
CSS :
.card-anim {
padding: 20px;
border-radius: 10px;
background-color: #ffffff;
box-shadow: 0 2px 6px rgba(0,0,0,0.1);
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.card-anim:hover {
transform: translateY(-5px);
box-shadow: 0 8px 20px rgba(0,0,0,0.2);
}
Consignes :
scale)Durée : 45 minutes
translate(), rotate(), scale(), skew()transform-originrotateX(), rotateY(), perspective1. translate() (déplacement)
.box {
transform: translate(10px, 20px); /* x, y */
}
2. rotate() (rotation)
.box {
transform: rotate(15deg);
}
3. scale() (agrandissement/réduction)
.box {
transform: scale(1.2); /* 120% */
}
4. skew() (inclinaison)
.box {
transform: skew(10deg, 0deg); /* x, y */
}
Combiner plusieurs transformations :
.box {
transform: translateY(-5px) scale(1.05);
}
.box {
transform-origin: center center; /* par défaut */
}
.box-coin {
transform-origin: left top;
}
rotateX() / rotateY()
.box3d {
transform: rotateY(20deg);
}
perspective
.scene {
perspective: 800px;
}
.scene .box3d {
transform: rotateY(25deg);
}
HTML :
<div class="card-3d">
<h3>Projet Numérique</h3>
<p>Description du projet.</p>
</div>
CSS :
.card-3d {
background-color: #ffffff;
border-radius: 10px;
padding: 20px;
box-shadow: 0 4px 10px rgba(0,0,0,0.1);
transition: transform 0.3s ease, box-shadow 0.3s ease;
transform-origin: center;
}
.card-3d:hover {
transform: translateY(-5px) scale(1.02) rotateX(3deg);
box-shadow: 0 10px 25px rgba(0,0,0,0.2);
}
Consignes :
translateY()scale()Durée : 45 minutes
scale(1.03), translateY(-3px)) pour garder un design subtil.