Chapitre 1627 minDébutant
Exercices corrigés HTML et CSS type examen
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- dire où HTML et CSS sont évalués au BTS SIO ;
- reproduire une maquette avec méthode ;
- traiter des exercices de structure, de formulaire, de cascade, de mise en page et d'audit.
8 exercices corrigés
Ce chapitre rassemble des exercices corrigés de HTML et de CSS à faire après le cours, du plus guidé au plus complet : une page à structurer, un formulaire, un calcul de spécificité, une maquette à reproduire en Flexbox et en Grid, un audit d'accessibilité et de référencement, puis les questions qu'un jury de l'E5 pose sur la présence en ligne. Chaque corrigé explique les choix, pour que tu puisses les justifier à l'oral.
Où HTML et CSS servent au BTS SIO
| Épreuve ou situation | Ce qu'on attend de toi |
|---|---|
| Ateliers de professionnalisation, première année | des pages et des sites complets, validés, responsives : souvent ton portfolio et un site pour une organisation |
| E5, oral du bloc 1, commun aux deux options | la compétence « Développer la présence en ligne de l'organisation » : image en ligne, mentions légales, référencement et mesure de visibilité, évolution d'un site (cours sur l'E5) |
| E6 SLAM, épreuve d'option | les interfaces web de tes applications : formulaires, tableaux de données, mise en page, accessibilité ; tu peux devoir les faire évoluer pendant la réalisation (cours sur l'E6 SLAM) |
| E7, écrit de cybersécurité | la sécurité côté serveur de ce que le HTML envoie : validation des saisies, failles XSS et CSRF (cours sécurité, cours E7 SLAM) |
Les exercices qui suivent couvrent ces situations. Fais-les sans regarder le cours, dans un vrai fichier, puis valide ton code au W3C et teste-le dans le navigateur avant d'ouvrir le corrigé.
Méthode : reproduire une maquette
Face à une maquette (une image, une capture, un dessin sur papier), procède toujours dans cet ordre :
- Repère les zones et nomme-les : en-tête, menu, contenu, colonne, pied ; puis, dans chaque zone, les composants (carte, bouton, formulaire). Entoure-les sur la maquette.
- Écris tout le HTML d'abord, sans aucun CSS, avec les balises sémantiques et les vrais contenus. Vérifie qu'il se lit bien dans le navigateur sans style.
- Pose les variables de la charte : couleurs, police, espacements, rayons.
- Mets en page de l'extérieur vers l'intérieur : la grille de la page (Grid), puis l'intérieur des zones (Flexbox ou Grid), puis les détails (typographie, bordures, ombres).
- Commence par la version mobile, élargis la fenêtre, et ajoute un point de rupture quand la mise en page le demande.
- Vérifie : validateur, clavier, contraste, zoom à 200 %, largeur de 320 px.
Exercices
Exercice 1 sur 8 1. Structurer la page « Agenda » Réussi À revoir
Écris le HTML complet de la page agenda.html de la médiathèque (sans CSS) : un en-tête avec le logo-lien et le menu de quatre liens (la page active signalée) ; un contenu principal avec le titre « Agenda des ateliers », un paragraphe d'introduction, puis un tableau de trois ateliers (colonnes : atelier, date, public, places restantes) ; une colonne « À ne pas manquer » ; un pied de page avec l'adresse et les liens légaux. Ajoute le lien d'évitement.
Voir la réponseMasquer la réponse de l'exercice 1
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Agenda des ateliers – Médiathèque des Tilleuls</title>
<meta name="description" content="Les ateliers gratuits de la médiathèque des Tilleuls : dates, public et places restantes. Inscription en ligne ou à l'accueil.">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<a class="lien-evitement" href="#contenu">Aller au contenu</a>
<header>
<a href="index.html"><img src="images/logo.svg" alt="Médiathèque des Tilleuls – accueil" width="180" height="48"></a>
<nav aria-label="Menu principal">
<ul>
<li><a href="index.html">Accueil</a></li>
<li><a href="agenda.html" aria-current="page">Agenda</a></li>
<li><a href="catalogue.html">Catalogue</a></li>
<li><a href="infos.html">Infos pratiques</a></li>
</ul>
</nav>
</header>
<main id="contenu">
<h1>Agenda des ateliers</h1>
<p>Tous les ateliers sont gratuits, sur inscription en ligne ou à l'accueil.</p>
<table>
<caption>Ateliers de juin 2026</caption>
<thead>
<tr>
<th scope="col">Atelier</th>
<th scope="col">Date</th>
<th scope="col">Public</th>
<th scope="col">Places restantes</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Initiation à l'ordinateur</th>
<td><time datetime="2026-06-03T10:00">3 juin, 10 h</time></td>
<td>Adultes</td>
<td>2</td>
</tr>
<tr>
<th scope="row">Club lecture ados</th>
<td><time datetime="2026-06-06T14:30">6 juin, 14 h 30</time></td>
<td>12 à 17 ans</td>
<td>Complet</td>
</tr>
<tr>
<th scope="row">Démarches en ligne</th>
<td><time datetime="2026-06-10T10:00">10 juin, 10 h</time></td>
<td>Adultes</td>
<td>6</td>
</tr>
</tbody>
</table>
</main>
<aside>
<h2>À ne pas manquer</h2>
<p>Festival « Lire en été », du 1<sup>er</sup> au 15 juillet.</p>
</aside>
<footer>
<address>Médiathèque des Tilleuls, 12 rue des Écoles – <a href="tel:+33123456789">01 23 45 67 89</a></address>
<ul>
<li><a href="mentions-legales.html">Mentions légales</a></li>
<li><a href="donnees-personnelles.html">Données personnelles</a></li>
<li><a href="accessibilite.html">Accessibilité : partiellement conforme</a></li>
</ul>
</footer>
</body>
</html>
Les points qui comptent : lang, charset, viewport, un <title> et une description propres à la page ; un seul <h1> ; le tableau avec caption, th et scope (le nom de l'atelier est l'en-tête de sa ligne) ; « Complet » écrit en toutes lettres, pas seulement signalé par une couleur ; aria-current="page" sur le lien de l'agenda. L'<aside> est placé ici hors du <main>, comme une colonne de la page : les deux placements sont acceptés si tu les justifies.
Tu avais trouvé ?
Exercice 2 sur 8 2. Le formulaire d'adhésion Réussi À revoir
Écris le formulaire d'adhésion en ligne de la médiathèque, envoyé en POST à adhesion.php :
- civilité facultative (Madame, Monsieur, non précisé) en boutons radio ;
- prénom et nom, obligatoires ;
- adresse e-mail, obligatoire ;
- code postal, obligatoire, 5 chiffres ;
- formule : « Individuelle », « Famille » ou « Étudiant », dans une liste déroulante, obligatoire ;
- une case obligatoire « J'accepte le règlement intérieur », avec un lien vers le règlement ;
- un bouton d'envoi.
Les champs doivent être accessibles et remplissables automatiquement. Ajoute la mention RGPD.
Voir la réponseMasquer la réponse de l'exercice 2
<form action="adhesion.php" method="post">
<p>Les champs marqués « (obligatoire) » doivent être remplis.</p>
<fieldset>
<legend>Civilité (facultatif)</legend>
<input type="radio" id="civ-mme" name="civilite" value="mme">
<label for="civ-mme">Madame</label>
<input type="radio" id="civ-m" name="civilite" value="m">
<label for="civ-m">Monsieur</label>
<input type="radio" id="civ-np" name="civilite" value="" checked>
<label for="civ-np">Non précisé</label>
</fieldset>
<label for="prenom">Prénom (obligatoire)</label>
<input type="text" id="prenom" name="prenom" required maxlength="50" autocomplete="given-name">
<label for="nom">Nom (obligatoire)</label>
<input type="text" id="nom" name="nom" required maxlength="50" autocomplete="family-name">
<label for="email">Adresse e-mail (obligatoire)</label>
<input type="email" id="email" name="email" required autocomplete="email">
<label for="cp">Code postal, 5 chiffres (obligatoire)</label>
<input type="text" id="cp" name="cp" required inputmode="numeric" pattern="[0-9]{5}"
autocomplete="postal-code">
<label for="formule">Formule (obligatoire)</label>
<select id="formule" name="formule" required>
<option value="">-- Choisir une formule --</option>
<option value="individuelle">Individuelle</option>
<option value="famille">Famille</option>
<option value="etudiant">Étudiant</option>
</select>
<input type="checkbox" id="reglement" name="reglement" value="oui" required>
<label for="reglement">J'accepte le <a href="reglement-interieur.html">règlement intérieur</a> (obligatoire)</label>
<button type="submit">Envoyer ma demande d'adhésion</button>
<p class="rgpd">Vos données servent à gérer votre adhésion et sont conservées tant que
vous êtes adhérent, puis un an. <a href="donnees-personnelles.html">Vos données et vos droits</a>.</p>
</form>
La première <option> a une valeur vide : avec required, le navigateur refuse l'envoi tant qu'une vraie formule n'est pas choisie. La civilité est facultative et propose « Non précisé » : on ne force pas une personne à répondre à une question non nécessaire. Côté serveur, adhesion.php revérifie tout, y compris que formule vaut bien une des trois valeurs autorisées.
Tu avais trouvé ?
Exercice 3 sur 8 3. La cascade en action Réussi À revoir
Donne la couleur et la taille du texte de chacun des trois liens, et justifie.
<nav id="menu" class="menu">
<a href="index.html" class="lien">Accueil</a>
<a href="agenda.html" class="lien actif">Agenda</a>
<a href="contact.html" class="lien" style="color: purple">Contact</a>
</nav>
a { color: blue; font-size: 1rem; }
.menu a { color: black; }
#menu .lien { color: green; }
.menu .lien.actif { color: red; font-size: 1.25rem; }
nav a.actif { font-size: 1.125rem; }
.lien { color: orange !important; }
Voir la réponseMasquer la réponse de l'exercice 3
Spécificités : a (0,0,1) ; .menu a (0,1,1) ; #menu .lien (1,1,0) ; .menu .lien.actif (0,3,0) ; nav a.actif (0,1,2) ; .lien (0,1,0) mais !important.
- Couleur : les trois liens ont la classe
lien, etcolor: orange !importantpasse devant toutes les déclarations normales, y compris l'attributstyledu lien Contact. Les trois liens sont orange. - Taille : Accueil et Contact n'ont que
a { font-size: 1rem }: 1rem. Agenda reçoit trois déclarations :1rem(0,0,1),1.25rem(0,3,0) et1.125rem(0,1,2). (0,3,0) bat (0,1,2) en deuxième colonne : 1,25rem.
Sans le !important, Accueil serait vert (#menu .lien, (1,1,0)), Agenda aussi (l'id bat les trois classes), Contact violet (l'attribut style passe avant toute feuille de style). Ce !important est un bon exemple de ce qu'il ne faut pas faire : il écrase même la couleur du lien actif.
Tu avais trouvé ?
Exercice 4 sur 8 4. Reproduire une carte d'atelier Réussi À revoir
Reproduis cette carte, décrite en mots : une carte blanche à coins arrondis de 8 px, bordure grise d'1 px, ombre légère, 20rem de large au maximum. En haut, une image en 16/9 qui occupe toute la largeur. Dessous, avec 1rem de marge intérieure : une étiquette « Numérique » (petit texte blanc en majuscules sur fond vert #0f766e, coins arrondis), le titre « Initiation à l'ordinateur », la date, une description, puis, en bas de la carte, à gauche « 2 places » et à droite un bouton « S'inscrire ». Le bouton reste en bas même si la description est courte. Écris le HTML et le CSS.
Voir la réponseMasquer la réponse de l'exercice 4
<article class="carte">
<img class="carte__image" src="images/atelier-initiation.webp" alt="" width="640" height="360">
<div class="carte__corps">
<p class="carte__etiquette">Numérique</p>
<h3 class="carte__titre">Initiation à l'ordinateur</h3>
<p class="carte__date"><time datetime="2026-06-03T10:00">Mercredi 3 juin, 10 h</time></p>
<p>Allumer, naviguer, envoyer un e-mail : les premiers pas, à votre rythme.</p>
<div class="carte__pied">
<p>2 places</p>
<a class="bouton" href="inscription.html?atelier=initiation">S'inscrire<span class="visuellement-masque"> à l'initiation à l'ordinateur</span></a>
</div>
</div>
</article>
.carte {
display: flex;
flex-direction: column;
max-width: 20rem;
background-color: #ffffff;
border: 1px solid #cbd5e1;
border-radius: 8px;
box-shadow: 0 2px 6px rgb(0 0 0 / 10%);
overflow: hidden; /* l'image suit les coins arrondis */
}
.carte__image {
width: 100%;
height: auto;
aspect-ratio: 16 / 9;
object-fit: cover; /* recadre l'image sans la déformer */
}
.carte__corps {
display: flex;
flex-direction: column;
flex: 1; /* le corps prend toute la hauteur restante */
gap: 0.5rem;
padding: 1rem;
}
.carte__corps p,
.carte__titre {
margin: 0;
}
.carte__etiquette {
align-self: flex-start; /* l'étiquette garde sa largeur */
padding: 0.125rem 0.5rem;
border-radius: 999px;
background-color: #0f766e;
color: #ffffff;
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.carte__pied {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: auto; /* pousse le pied en bas de la carte */
}
.bouton {
padding: 0.5rem 1rem;
border-radius: 4px;
background-color: #0f766e;
color: #ffffff;
text-decoration: none;
font-weight: 600;
}
Les choix à savoir justifier : alt="" parce que l'image illustre sans informer (le titre dit tout) ; un lien et non un bouton, parce que « S'inscrire » mène à une autre page ; la fin du texte du lien masquée visuellement, pour que le lien soit explicite dans la liste des liens ; margin-top: auto dans une colonne flex pour coller le pied en bas ; object-fit: cover avec aspect-ratio pour un cadrage identique sur toutes les cartes. L'étiquette « Numérique » est écrite en majuscules par le CSS, pas dans le HTML : un lecteur d'écran ne l'épellera pas.
Tu avais trouvé ?
Exercice 5 sur 8 5. La grille des ateliers Réussi À revoir
Place six cartes d'atelier (exercice 4) dans une section « Ateliers de la semaine » : une colonne sur téléphone, puis autant de colonnes de 18rem minimum que l'écran le permet, avec 1.5rem d'espace. Toutes les cartes d'une rangée doivent avoir la même hauteur. Le contenu de la page ne dépasse jamais 72rem de large et reste centré, avec 1rem d'air de chaque côté sur mobile.
Voir la réponseMasquer la réponse de l'exercice 5
<section class="contenu">
<h2>Ateliers de la semaine</h2>
<div class="grille-ateliers">
<article class="carte">…</article>
<!-- cinq autres cartes -->
</div>
</section>
.contenu {
width: min(100% - 2rem, 72rem);
margin-inline: auto;
}
.grille-ateliers {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(18rem, 100%), 1fr));
gap: 1.5rem;
}
.grille-ateliers .carte {
max-width: none; /* la carte suit la largeur de sa colonne */
}
Aucune media query : auto-fill et minmax() calculent le nombre de colonnes. Le min(18rem, 100%) évite qu'une colonne de 18rem déborde sur un écran plus étroit que 18rem + les marges (un vieux téléphone de 320 px, ou un zoom à 200 %). Les cartes ont la même hauteur grâce au stretch par défaut de Grid, et leur bouton reste en bas grâce au margin-top: auto de l'exercice 4.
Tu avais trouvé ?
Exercice 6 sur 8 6. Audit d'une page Réussi À revoir
Un stagiaire a livré cette page d'accueil. Fais-en l'audit : trouve au moins dix problèmes, classés en quatre familles (validité, accessibilité, référencement, droit), et propose une correction pour chacun.
<html>
<head>
<title>Accueil</title>
<meta name="keywords" content="médiathèque, livres, ateliers">
<link href="https://fonts.googleapis.com/css2?family=Lobster" rel="stylesheet">
<style>
body { font-family: Lobster; font-size: 12px; color: #999; }
a:focus { outline: none; }
</style>
</head>
<body>
<div class="header"><img src="logo.png"></div>
<h3>Bienvenue !</h3>
<p>Les ateliers en <span style="color:green">vert</span> sont ouverts aux enfants.</p>
<img src="photo-atelier.png" width="4000">
<p>Pour vous inscrire, <a href="inscription.html">cliquez ici</a>.</p>
<div class="footer">© Médiathèque</div>
</body>
</html>
Voir la réponseMasquer la réponse de l'exercice 6
Validité et structure
- Pas de
<!DOCTYPE html>: mode de compatibilité. L'ajouter en première ligne. - Pas de
<meta charset="utf-8">: accents à risque. L'ajouter en tête du<head>. - Pas de balise
viewport: page minuscule sur mobile. - Des
<div class="header">et<div class="footer">à la place de<header>,<main>et<footer>.
Accessibilité
- Pas de
lang="fr"sur<html>. - Images sans
alt:alt="Médiathèque des Tilleuls"pour le logo (et un lien vers l'accueil), une description oualt=""pour la photo. - Pas de
<h1>, et un<h3>en premier titre :<h1>Bienvenue à la médiathèque des Tilleuls</h1>. - Texte
#999sur blanc : contraste de 2,85:1, sous le seuil de 4,5:1. Prendre au moins#767676, idéalement#1f2937. font-size: 12px: trop petit et en pixels. Écrire1rem.outline: noneau focus : la navigation au clavier devient impossible à suivre. Supprimer la règle, ou la remplacer par un:focus-visiblebien visible.- L'information « ouvert aux enfants » est donnée par la couleur seule : l'écrire (« Atelier ouvert aux enfants dès 8 ans »).
- Lien « cliquez ici » : « Inscrivez-vous aux ateliers ».
- Police décorative Lobster pour tout le texte : peu lisible en texte courant ; la garder pour le logo ou les grands titres.
Référencement et performance
<title>Accueil</title>: titre unique et descriptif, « Médiathèque des Tilleuls : livres, ateliers et jeux ».- Pas de meta description ; la meta
keywordsest ignorée par Google, la supprimer. - Photo en PNG de 4 000 px de large, sans hauteur : la convertir en WebP, la redimensionner, proposer un
srcset, déclarerwidthetheightdans les proportions réelles (sinon l'image est déformée ou la page saute).
Droit
- Police chargée depuis Google Fonts : transfert de l'adresse IP des visiteurs à Google. Héberger la police sur le site.
- Pas de liens vers les mentions légales, la politique de confidentialité et la déclaration d'accessibilité (obligatoire pour un site public) dans le pied de page.
Dix problèmes suffisaient ; en trouver plus de quinze, c'est un audit de professionnel.
Tu avais trouvé ?
Exercice 7 sur 8 7. Questions de jury sur la présence en ligne Réussi À revoir
Prépare une réponse orale de trois ou quatre phrases à chacune de ces questions, telles qu'un jury de l'E5 peut les poser sur une réalisation « site de la médiathèque ».
- « Que doivent contenir les mentions légales du site ? »
- « Comment avez-vous mesuré la visibilité du site ? »
- « Pourquoi le site est-il en HTTPS ? Comment l'avez-vous mis en place ? »
- « Votre site est-il accessible ? Comment le savez-vous ? »
- « Pourquoi ne pas avoir mis de bandeau de cookies ? »
Voir la réponseMasquer la réponse de l'exercice 7
- « L'identité de l'éditeur, ici la commune pour sa médiathèque, avec son adresse et son téléphone ; le nom du directeur de la publication, le maire ; le nom, l'adresse et le téléphone de l'hébergeur. C'est l'article 1-1 de la LCEN, depuis la loi SREN de 2024. J'ai ajouté les renvois vers la politique de confidentialité et la déclaration d'accessibilité, et le lien est dans le pied de toutes les pages. »
- « J'ai déclaré le site et son sitemap dans la Search Console. J'ai comparé les impressions, les clics et le taux de clic de la page des ateliers sur deux trimestres, avant et après la réécriture des titres et des descriptions : le taux de clic est passé de 1,5 % à 4 %. J'ai les captures datées dans mon portfolio. »
- « HTTPS chiffre les échanges, notamment les données du formulaire d'inscription, et prouve au visiteur qu'il est sur le bon site ; c'est aussi un signal pour Google. L'hébergeur fournit un certificat Let's Encrypt renouvelé automatiquement ; j'ai ajouté la redirection 301 de HTTP vers HTTPS et vérifié qu'il ne restait aucun contenu mixte. »
- « Il est partiellement conforme au RGAA. J'ai vérifié les points principaux : structure des titres, alternatives des images, étiquettes des formulaires, contrastes, navigation au clavier, et je l'ai testé avec NVDA. Les outils automatiques comme Lighthouse ne suffisent pas, ils ne détectent qu'une partie des problèmes. La déclaration d'accessibilité liste ce qui reste à corriger. »
- « Parce que le site ne dépose aucun traceur soumis au consentement : les polices sont hébergées sur le site, les vidéos sont des liens et non des contenus intégrés, et l'outil de statistiques est configuré dans les conditions où la CNIL l'exempte de consentement. Pas de traceur, donc pas de bandeau : c'est plus respectueux des visiteurs et plus simple à maintenir. »
Tu avais trouvé ?
Exercice 8 sur 8 8. Vrai ou faux express Réussi À revoir
- Une page peut avoir plusieurs
<h1>sans aucun inconvénient. alt=""est valide pour une image décorative.<b>et<strong>sont strictement équivalents.- La validation
requiredempêche un pirate d'envoyer un champ vide au serveur. - Avec
box-sizing: border-box,widthinclut la marge extérieure. - Dix classes ne battent pas un identifiant.
justify-contentagit toujours horizontalement.loading="lazy"est recommandé sur l'image principale du haut de page.- La meta description améliore directement le classement Google.
- Un site vitrine doit comporter des mentions légales.
Voir la réponseMasquer la réponse de l'exercice 8
- Faux : c'est valide, mais la bonne pratique reste un seul
<h1>, qui annonce le sujet de la page ; plusieurs<h1>brouillent le plan pour les lecteurs d'écran. - Vrai : il dit « image décorative, ignore-la ».
- Faux : même rendu par défaut, mais
<strong>exprime une importance,<b>non. - Faux : la validation côté client se contourne ; seul le serveur protège.
- Faux :
border-boxinclut le padding et la bordure, jamais la marge. - Vrai : la spécificité se compare colonne par colonne, et l'identifiant est dans la première.
- Faux : il agit sur l'axe principal, vertical avec
flex-direction: column. - Faux : c'est l'image à charger en priorité (
fetchpriority="high") ; le chargement différé dégrade le LCP. - Faux : elle influence le taux de clic, pas le classement.
- Vrai : tout éditeur d'un service de communication au public en ligne doit s'identifier (un particulier non professionnel peut se limiter à indiquer son hébergeur).
Tu avais trouvé ?