← Retour à l'accueil

Le langage HTML 5

01. Introduction — qu'est-ce que le HTML ?

HTML se traduit littéralement par « langage de balisage hypertexte ». Ce n'est pas un langage de programmation à proprement parler : on ne lui demande pas de calculer, mais de décrire la structure d'un document — un peu comme un plan d'architecte décrit les pièces d'une maison sans en dicter la décoration.

Chaque page web repose sur trois technologies complémentaires :

La version en vigueur aujourd'hui est HTML 5. Elle apporte des balises sémantiques modernes, la prise en charge native de l'audio et de la vidéo, et des formulaires enrichis.

Bon à savoir : le HTML est interprété par le navigateur — il n'est jamais compilé. On peut donc modifier un fichier .html et le recharger immédiatement pour voir le résultat.
↑ Retour au sommaire

02. Anatomie d'une balise

Une balise est un mot-clé placé entre chevrons (< et >) qui indique au navigateur comment interpréter le contenu qui la suit. On distingue deux grandes familles : les balises par paire et les balises auto-fermantes.

Sensibles à la casse : par convention et pour rester compatible avec tous les navigateurs, les balises HTML s'écrivent toujours en minuscules.

2.1 Balises ouvrantes et fermantes

Ces balises fonctionnent par paire pour encadrer un contenu :

Exemple avec un titre de premier niveau :

<h1>Bienvenue chez AI29</h1>

Bienvenue chez AI29

Ici, <h1> ouvre l'élément, </h1> le ferme, et le texte entre les deux — Bienvenue chez AI29 — est le contenu réellement affiché sur la page.

2.2 Balises auto-fermantes

Certaines balises n'entourent pas de contenu : elles se suffisent à elles-mêmes. On les appelle auto-fermantes (ou « orphelines »). Elles servent typiquement à insérer un élément ponctuel : une image, un saut de ligne, un séparateur horizontal.

Exemple pour insérer un saut de ligne :

<br />

Ou pour insérer une image :

<img src="photo.jpg" alt="Ordinateur assemblé par AI29" />
Ordinateur assemblé par AI29
Note HTML 5 : la barre oblique finale (/>) est facultative en HTML 5. Écrire <br> ou <br /> revient au même. On garde la barre par cohérence visuelle avec les balises par paire.
↑ Retour au sommaire

03. Les attributs

Un attribut est une information supplémentaire que l'on attache à une balise pour préciser son comportement ou ses caractéristiques. Il se place toujours dans la balise ouvrante (ou dans la balise auto-fermante), jamais dans la balise fermante.

La syntaxe est simple :

<balise nom-attribut="valeur">

Exemple concret — un lien hypertexte qui pointe vers une adresse :

<a href="https://ai29.tech" title="Site officiel AI29">Visiter le site</a>

Visiter le site

Autre exemple — une image avec plusieurs attributs :

<img src="logo.png" alt="Logo AI29" width="200" height="200" />
Logo AI29
Attributs universels : certains attributs peuvent être appliqués à quasiment toutes les balises. Les plus courants sont id (identifiant unique), class (regroupement pour le style), title (info-bulle) et lang (langue du contenu).
↑ Retour au sommaire

04. Le squelette d'une page HTML

Toute page HTML repose sur une structure minimale que le navigateur s'attend à retrouver. Ces quelques balises forment le squelette :

Mis bout à bout dans un fichier, cela donne :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

</body>
</html>

Page blanche : le <body> est encore vide. Seul le <title> apparaît, dans l'onglet.

C'est le point de départ de toute nouvelle page : un <head> qui contient les métadonnées (encodage, viewport, titre de l'onglet…) et un <body> encore vide, prêt à recevoir le contenu visible.

Décryptage des méta : charset="UTF-8" garantit un affichage correct des caractères accentués (é, è, à, ç…). viewport indique au navigateur mobile qu'il doit adapter la largeur à celle de l'écran — sans ça, les téléphones affichent une version « bureau » réduite illisible.
↑ Retour au sommaire

05. Les commentaires

Un commentaire est un texte que l'on inscrit dans le code source pour l'expliquer ou pour laisser une note à un collègue (ou à toi-même dans six mois). Le navigateur les ignore complètement : ils n'apparaissent jamais dans la page rendue.

Syntaxe :

<!-- Ceci est un commentaire -->

Un commentaire peut aussi s'étendre sur plusieurs lignes :

<!--
    Section « À propos » — à revoir avec Stéphane
    avant la mise en ligne du site.
-->

Rien ne s'affiche : le navigateur ignore les deux commentaires.

À quoi servent-ils, concrètement ?

À ne pas oublier : les commentaires HTML sont visibles par toute personne qui affiche la source de la page (clic droit → « Afficher la source »). Ne jamais y écrire de mot de passe, de clé d'API ou d'information confidentielle.
↑ Retour au sommaire

06. Titres et paragraphes

Pour structurer un texte, HTML propose six niveaux de titres et une balise dédiée au paragraphe.

6.1 Les titres — de <h1> à <h6>

Il existe six niveaux hiérarchiques, du plus important (<h1>) au moins important (<h6>) :

<h1>Titre principal de la page</h1>
<h2>Grande section</h2>
<h3>Sous-section</h3>
<h4>Sous-sous-section</h4>
<h5>Niveau intermédiaire</h5>
<h6>Niveau le plus bas</h6>

Titre principal de la page

Grande section

Sous-section

Sous-sous-section

Niveau intermédiaire
Niveau le plus bas
Règle d'or : un seul <h1> par page — c'est le titre principal, celui qui résume le sujet. Les titres suivants doivent respecter la hiérarchie logique (on ne saute pas de h2 à h5). Les moteurs de recherche et les lecteurs d'écran s'en servent pour comprendre la structure du document.

6.2 Les paragraphes — <p>

Un paragraphe se déclare avec la balise <p> :

<p>Le paragraphe est l'unité de base pour organiser du texte. Le navigateur ajoute automatiquement un espacement au-dessus et en dessous.</p>

Le paragraphe est l'unité de base pour organiser du texte. Le navigateur ajoute automatiquement un espacement au-dessus et en dessous.

6.3 Le saut de ligne — <br>

Pour forcer un retour à la ligne à l'intérieur d'un paragraphe, sans en créer un nouveau, on utilise la balise auto-fermante <br /> :

<p>Vente, montage, réparation.<br />
Maintenance et conseil sur mesure.</p>

Vente, montage, réparation.
Maintenance et conseil sur mesure.

À éviter : enchaîner plusieurs <br> pour aérer une page. Cela mélange contenu et présentation. Pour espacer, on utilisera plus tard le CSS (marges, padding).
↑ Retour au sommaire

07. Mise en forme du texte

HTML propose plusieurs balises pour enrichir le texte : mettre en valeur un mot, souligner un extrait important, indiquer une correction… La plupart ont une signification sémantique (elles décrivent la nature de l'accentuation), et non purement décorative.

7.1 Emphase et importance

<p>Le diagnostic est <strong>gratuit</strong>,
et le devis vous est remis <em>avant</em> toute intervention.</p>

Le diagnostic est gratuit, et le devis vous est remis avant toute intervention.

7.2 Barrer, souligner, modifier

Exemple :

<p>Nettoyage complet : <s>50 €</s> 40 € ce mois-ci (tarif fictif).</p>
<p>L'atelier ouvre le <del>lundi</del> <ins>mardi</ins> à 9 h.</p>

Nettoyage complet : 50 € 40 € ce mois-ci (tarif fictif).

L'atelier ouvre le lundi mardi à 9 h.

7.3 Indices et exposants

Pour écrire une formule chimique ou mathématique, on dispose de deux balises :

<p>La formule de l'eau est H<sub>2</sub>O.</p>
<p>Un octet vaut 2<sup>8</sup> = 256 valeurs.</p>

La formule de l'eau est H2O.

Un octet vaut 28 = 256 valeurs.

Sémantique avant apparence : <strong> et <b> donnent tous deux du gras à l'affichage, mais leur sens diffère : strong = importance réelle, b = simple mise en avant visuelle sans importance supplémentaire (peu utilisé aujourd'hui). Même distinction entre em (emphase) et i (italique décoratif).
↑ Retour au sommaire

08. Les liens hypertextes

Le lien hypertexte est probablement l'élément le plus emblématique du web : c'est lui qui permet de naviguer d'une page à une autre, d'un site à un autre, d'une section à une autre. Sans lui, le web ne serait qu'une collection de documents isolés.

La balise concernée est <a> (pour anchor — ancre). Son attribut principal est href (pour hypertext reference) : il contient la destination du lien.

8.1 Syntaxe de base

<a href="destination">Texte du lien</a>

Le texte du lien (entre les balises ouvrante et fermante) est ce que l'utilisateur voit et sur quoi il clique. La destination (dans href) est ce que le navigateur ouvre au clic.

8.2 Les différents types de destinations

Lien vers un site externe — on utilise une URL complète :

<a href="https://ai29.tech">Site officiel AI29</a>

Site officiel AI29

Lien vers une autre page du même site — chemin relatif :

<a href="../index.html">Retour à l'accueil</a>

Retour à l'accueil

Lien vers une ancre dans la même page — on préfixe l'identifiant par un dièse :

<a href="#haut">Retour en haut</a>

Retour en haut

👉 Clique dessus : celui-ci fonctionne vraiment, car le titre de cette page porte l'identifiant haut.

À condition, bien sûr, qu'un élément de la page porte l'identifiant cible :

<h1 id="haut">Titre principal</h1>

Lien vers une adresse email — préfixe mailto: :

<a href="mailto:contact@ai29.tech">Nous écrire</a>

Nous écrire

Lien vers un numéro de téléphone — préfixe tel: (pratique sur mobile) :

<a href="tel:+33612345678">Nous appeler</a>

Nous appeler

Lien désactivé ici : le numéro de l'exemple est fictif.

8.3 Ouvrir dans un nouvel onglet

L'attribut target contrôle l'endroit où s'ouvre la destination. La valeur _blank demande au navigateur d'ouvrir un nouvel onglet.

<a href="https://ai29.tech" target="_blank" rel="noopener">Ouvrir dans un nouvel onglet</a>

Ouvrir dans un nouvel onglet

Sécurité : quand on utilise target="_blank", il est fortement recommandé d'ajouter rel="noopener". Sans ça, la page ouverte peut, dans certains cas, prendre le contrôle de l'onglet d'origine (technique dite du tabnabbing).

8.4 Info-bulle avec title

L'attribut title ajoute une info-bulle qui apparaît au survol de la souris — utile pour donner un contexte supplémentaire.

<a href="https://ai29.tech" title="L'Atelier Informatique du Finistère">AI29</a>

AI29

👉 Laisse la souris immobile sur le lien pour voir apparaître l'info-bulle.

8.5 Bonnes pratiques

Texte explicite : le texte du lien doit décrire sa destination. On évite les génériques comme « cliquez ici » ou « lien » : ils sont mauvais pour l'accessibilité (les lecteurs d'écran listent parfois tous les liens hors contexte) et pour le référencement.
Préfère : « Consulter nos tarifs », « Télécharger la brochure », « Envoyer un message ».
↑ Retour au sommaire

09. Images et médias

Le web n'est pas fait que de texte : images, sons et vidéos enrichissent l'expérience. HTML 5 propose des balises dédiées pour chacun.

9.1 Les images — <img>

La balise <img> est auto-fermante. Elle prend deux attributs indispensables :

<img src="images/ordinateur.jpg" alt="PC de bureau assemblé par AI29" />
PC de bureau assemblé par AI29

Ici, le fichier n'existe pas : le navigateur affiche à sa place le texte de alt. C'est aussi ce texte que lit un lecteur d'écran.

L'attribut alt est obligatoire. Il rend le contenu accessible aux personnes malvoyantes qui utilisent un lecteur d'écran, et sert de repli quand l'image ne charge pas. Pour une image purement décorative, on peut laisser un alt vide (alt=""), mais on ne l'omet jamais.

Attributs utiles supplémentaires :

<img src="images/atelier.jpg"
     alt="Vue de l'atelier AI29 à Morlaix"
     width="800" height="600"
     loading="lazy" />
Vue de l'atelier AI29 à Morlaix

9.2 Choisir le bon format

9.3 Image légendée — <figure>

Quand une image est accompagnée d'une légende, on les enveloppe dans <figure> et on ajoute la légende dans <figcaption>.

<figure>
    <img src="images/pc-sur-mesure.jpg" alt="Configuration gamer AI29" />
    <figcaption>Une configuration gamer assemblée en atelier.</figcaption>
</figure>
Configuration gamer AI29
Une configuration gamer assemblée en atelier.

9.4 Le son — <audio>

Pour intégrer un fichier audio, on utilise la balise <audio> avec l'attribut controls pour afficher le lecteur intégré du navigateur.

<audio controls>
    <source src="medias/message.mp3" type="audio/mpeg" />
    Votre navigateur ne prend pas en charge la lecture audio.
</audio>

👉 Lance la lecture : le fichier de l'exemple est remplacé par un court bip, celui d'un PC qui démarre.

Le texte à l'intérieur de la balise (« Votre navigateur… ») sert de message de repli pour les navigateurs qui ne comprennent pas la balise.

9.5 La vidéo — <video>

Même logique pour la vidéo, avec la balise <video> :

<video controls width="640" height="360">
    <source src="medias/presentation.mp4" type="video/mp4" />
    Votre navigateur ne prend pas en charge la lecture vidéo.
</video>

Aucune vidéo n'est chargée ici : on voit le lecteur du navigateur et une image d'attente (attribut poster).

Attributs utiles pour audio et video :

Plusieurs sources pour un même média : on peut lister plusieurs balises <source> avec des formats différents (MP4, WebM, OGG…). Le navigateur choisit le premier format qu'il sait lire. C'est un filet de sécurité pour la compatibilité entre navigateurs.
↑ Retour au sommaire

10. Les listes

HTML propose trois familles de listes, chacune adaptée à un usage précis :

10.1 Liste non ordonnée — <ul>

Chaque élément de la liste est enveloppé dans une balise <li> (list item). Le navigateur affiche une puce ronde par défaut.

<ul>
    <li>Vente</li>
    <li>Montage</li>
    <li>Réparation</li>
    <li>Maintenance</li>
</ul>
Sémantique de la puce : l'apparence de la puce (rond plein, rond vide, carré, tiret…) sera modifiée plus tard avec le CSS (list-style-type). En HTML pur, on garde l'apparence par défaut du navigateur.

10.2 Liste ordonnée — <ol>

Même principe, mais les éléments sont automatiquement numérotés par le navigateur (1, 2, 3…).

<ol>
    <li>Réception de votre matériel</li>
    <li>Diagnostic gratuit</li>
    <li>Devis détaillé (20 € déductibles)</li>
    <li>Intervention après votre accord</li>
    <li>Restitution et explications</li>
</ol>
  1. Réception de votre matériel
  2. Diagnostic gratuit
  3. Devis détaillé (20 € déductibles)
  4. Intervention après votre accord
  5. Restitution et explications

La balise <ol> accepte plusieurs attributs utiles :

<ol type="A" start="3">
    <li>Troisième option (affichée « C »)</li>
    <li>Quatrième option (affichée « D »)</li>
</ol>
  1. Troisième option (affichée « C »)
  2. Quatrième option (affichée « D »)

10.3 Liste de descriptions — <dl>

Adaptée aux glossaires, définitions, spécifications techniques. Elle repose sur trois balises :

<dl>
    <dt>SSD</dt>
    <dd>Disque de stockage à base de mémoire flash, plus rapide qu'un disque dur classique.</dd>

    <dt>RAM</dt>
    <dd>Mémoire vive dans laquelle le système et les logiciels travaillent en direct.</dd>

    <dt>GPU</dt>
    <dd>Processeur dédié au calcul graphique, indispensable pour le jeu et la création visuelle.</dd>
</dl>
SSD
Disque de stockage à base de mémoire flash, plus rapide qu'un disque dur classique.
RAM
Mémoire vive dans laquelle le système et les logiciels travaillent en direct.
GPU
Processeur dédié au calcul graphique, indispensable pour le jeu et la création visuelle.

Un même terme peut être suivi de plusieurs <dd> (plusieurs définitions ou précisions), et inversement plusieurs <dt> peuvent partager une même définition.

10.4 Imbrication de listes

On peut placer une liste à l'intérieur d'un <li> pour créer une arborescence. Il faut simplement veiller à bien fermer les balises dans le bon ordre.

<ul>
    <li>Vente
        <ul>
            <li>Ordinateurs de bureau</li>
            <li>Ordinateurs portables</li>
            <li>Périphériques</li>
        </ul>
    </li>
    <li>Réparation
        <ul>
            <li>Panne matérielle</li>
            <li>Panne logicielle</li>
        </ul>
    </li>
</ul>
Combiner ul et ol : rien n'empêche d'imbriquer une liste ordonnée dans une non ordonnée (ou l'inverse). L'indentation dans le code source (comme dans l'exemple ci-dessus) rend la structure lisible pour l'humain — le navigateur, lui, ne s'en occupe pas.
Piège classique : un <li> ne peut être direct enfant que d'un <ul>, <ol> ou <menu>. Écrire un <li> tout seul, sans conteneur, est invalide.
↑ Retour au sommaire

11. Les tableaux

Un tableau HTML sert à présenter des données organisées en lignes et colonnes : tarifs, plannings, résultats, comparatifs de configurations… tout ce qui se prête naturellement à une lecture en grille.

Usage historique à éviter : dans les années 1990-2000, les tableaux étaient détournés pour positionner les éléments d'une page (en-tête à gauche, menu à droite, etc.). Cette pratique est aujourd'hui obsolète : on réservera <table> aux vraies données tabulaires. Pour la mise en page, on utilisera plus tard le CSS (Flexbox, Grid).

11.1 Structure de base

Un tableau se construit avec quatre balises principales :

Exemple — quelques tarifs indicatifs de dépannage :

<table>
    <tr>
        <th>Prestation</th>
        <th>Durée</th>
        <th>Tarif</th>
    </tr>
    <tr>
        <td>Diagnostic en atelier</td>
        <td>30 min</td>
        <td>Gratuit</td>
    </tr>
    <tr>
        <td>Nettoyage complet</td>
        <td>1 h</td>
        <td>40 €</td>
    </tr>
</table>
Prestation Durée Tarif
Diagnostic en atelier 30 min Gratuit
Nettoyage complet 1 h 40 €
À retenir : les cellules se lisent ligne par ligne, pas colonne par colonne. On déclare une <tr>, puis les cellules qu'elle contient, puis on ferme la ligne, et on passe à la suivante.

11.2 Structurer avec <thead>, <tbody>, <tfoot>

Pour les tableaux plus riches, on peut regrouper les lignes en trois zones sémantiques :

Visuellement, le rendu par défaut change peu — mais la structure est bien plus claire, et les lecteurs d'écran s'y repèrent mieux. Le CSS pourra plus tard figer l'en-tête au défilement.

<table>
    <thead>
        <tr>
            <th>Composant</th>
            <th>Quantité</th>
            <th>Prix</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Boîtier ATX</td>
            <td>1</td>
            <td>75 €</td>
        </tr>
        <tr>
            <td>SSD 1 To NVMe</td>
            <td>1</td>
            <td>90 €</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <td>Total</td>
            <td>–</td>
            <td>165 €</td>
        </tr>
    </tfoot>
</table>
Composant Quantité Prix
Boîtier ATX 1 75 €
SSD 1 To NVMe 1 90 €
Total – 165 €

11.3 La légende — <caption>

La balise <caption> donne un titre au tableau. Elle se place juste après l'ouverture de <table>, avant toute autre balise. Elle est particulièrement importante pour l'accessibilité : c'est ce que les lecteurs d'écran annoncent en premier.

<table>
    <caption>Composants disponibles en atelier</caption>
    <tr>
        <th>Référence</th>
        <th>État</th>
    </tr>
    <tr>
        <td>Écran 24″ Full HD</td>
        <td>Neuf</td>
    </tr>
</table>
Composants disponibles en atelier
Référence État
Écran 24″ Full HD Neuf

11.4 Fusionner des cellules — colspan et rowspan

Deux attributs permettent d'étendre une cellule sur plusieurs colonnes ou plusieurs lignes :

Attention à ne pas « ajouter » de cellules dans les autres lignes pour compenser la fusion : le navigateur s'en charge tout seul.

<table>
    <caption>Planning atelier — semaine 1</caption>
    <tr>
        <th>Jour</th>
        <th>Matin</th>
        <th>Après-midi</th>
    </tr>
    <tr>
        <th>Lundi</th>
        <td colspan="2">Fermé</td>
    </tr>
    <tr>
        <th>Mardi</th>
        <td rowspan="2">Diagnostic</td>
        <td>Réparation</td>
    </tr>
    <tr>
        <th>Mercredi</th>
        <td>Montage</td>
    </tr>
</table>
Planning atelier — semaine 1
Jour Matin Après-midi
Lundi Fermé
Mardi Diagnostic Réparation
Mercredi Montage
Note sur ce rendu : remarque que « Mardi » et « Mercredi » n'ont chacun qu'une seule cellule <td> — la colonne « Matin » est déjà occupée par le rowspan="2" de la cellule « Diagnostic ».

11.5 Accessibilité — l'attribut scope

Pour aider les lecteurs d'écran à associer chaque <th> aux bonnes cellules, on utilise l'attribut scope :

<tr>
    <th scope="col">Prestation</th>
    <th scope="col">Tarif</th>
</tr>
<tr>
    <th scope="row">Diagnostic</th>
    <td>Gratuit</td>
</tr>
Prestation Tarif
Diagnostic Gratuit

Aucune différence visible : scope sert aux lecteurs d'écran.

Bonne habitude : combiner un <caption>, une structure thead/tbody et des scope sur les th garantit un tableau correctement lu par les technologies d'assistance — sans effort supplémentaire côté rendu visuel.
↑ Retour au sommaire

12. Les formulaires

Un formulaire permet à l'utilisateur d'envoyer des données au site : recherche, contact, inscription, commande, demande de devis… C'est le principal point d'entrée d'un site interactif.

À propos des exemples ci-dessous : les formulaires présentés dans cette section sont volontairement inertes. Ils ne sont reliés à aucun serveur : cliquer sur « Envoyer » n'aura aucun effet. On étudie ici la structure HTML ; le traitement des données côté serveur relève d'un autre chapitre (backend, PHP, Node…).

12.1 La balise <form>

Tout formulaire est enveloppé dans une balise <form>. Elle porte deux attributs importants :

<form action="/traiter-devis" method="post">
    <!-- Les champs se placent ici -->
</form>
GET ou POST ? Retiens la règle simple : GET pour lire (rechercher, filtrer), POST pour écrire (créer, modifier, envoyer un message, uploader un fichier).

12.2 Les champs de saisie — <input>

La balise <input> est auto-fermante et couvre à elle seule la plupart des champs, grâce à son attribut type.

Panorama des types les plus courants :

Types de champs <input> essentiels
type Usage
text Texte court sur une seule ligne (nom, prénom…)
email Adresse email (validation basique intégrée)
password Mot de passe (caractères masqués à la saisie)
tel Numéro de téléphone (clavier numérique sur mobile)
url Adresse web
number Valeur numérique (avec flèches d'incrément)
date Sélecteur de date
checkbox Case à cocher (choix multiples possibles)
radio Bouton radio (un seul choix parmi un groupe)
file Sélection d'un fichier à téléverser
submit Bouton d'envoi du formulaire
hidden Champ invisible, transmis au serveur (token, id…)

Exemple — un champ texte simple :

<input type="text" name="prenom" placeholder="Votre prénom" />
L'attribut name est essentiel : c'est ce nom qui identifie la donnée quand elle arrive au serveur. Sans name, la valeur du champ n'est pas envoyée du tout.

12.3 Attributs communs aux champs

La plupart des inputs partagent une palette d'attributs :

<input type="email" name="email" id="email"
       placeholder="vous@exemple.fr"
       required autocomplete="email" />
Attributs booléens : certains attributs comme required, disabled, readonly ou checked n'ont pas besoin de valeur : leur simple présence suffit à les activer.

12.4 L'étiquette — <label>

Un champ isolé n'est pas utilisable sans indication. La balise <label> associe un texte descriptif à un champ, ce qui améliore l'accessibilité et l'ergonomie (cliquer sur le label active le champ associé).

Deux syntaxes possibles :

Version A — le label pointe vers l'id du champ :

<label for="prenom">Prénom :</label>
<input type="text" id="prenom" name="prenom" />

👉 Clique sur « Prénom : » : le curseur se place dans le champ.

Version B — le label englobe le champ (pas besoin d'id) :

<label>
    Prénom :
    <input type="text" name="prenom" />
</label>
Toujours utiliser un label : pour chaque champ de formulaire. Les lecteurs d'écran s'en servent pour annoncer clairement chaque champ. C'est aussi ce qui permet, sur mobile, d'agrandir la zone cliquable (utile pour les cases à cocher et les boutons radio).

12.5 Cases à cocher et boutons radio

Les cases à cocher (type="checkbox") permettent de sélectionner plusieurs valeurs indépendantes.

<label><input type="checkbox" name="services" value="vente" /> Vente</label>
<label><input type="checkbox" name="services" value="montage" /> Montage</label>
<label><input type="checkbox" name="services" value="reparation" checked /> Réparation</label>

Les boutons radio (type="radio") permettent de choisir une seule valeur dans un groupe. Le regroupement se fait via l'attribut name : tous les radios qui partagent le même name forment un groupe exclusif.

<label><input type="radio" name="contact" value="email" checked /> Par email</label>
<label><input type="radio" name="contact" value="tel" /> Par téléphone</label>

12.6 Zone de texte multi-ligne — <textarea>

Pour un texte long (message, description), on utilise <textarea> — qui, elle, n'est pas auto-fermante. La valeur pré-remplie s'écrit entre les balises, pas dans un attribut value.

<label for="message">Votre message :</label>
<textarea id="message" name="message" rows="5" placeholder="Décrivez votre besoin…"></textarea>

12.7 Liste déroulante — <select>

Le menu déroulant offre un choix parmi une liste d'options prédéfinies. Il combine trois balises : <select> (le menu), <option> (chaque choix) et éventuellement <optgroup> pour grouper les options.

<label for="machine">Type de machine :</label>
<select id="machine" name="machine">
    <option value="">-- Choisir --</option>
    <optgroup label="Fixe">
        <option value="bureau">PC de bureau</option>
        <option value="gamer">PC gamer</option>
    </optgroup>
    <optgroup label="Mobile">
        <option value="portable">Ordinateur portable</option>
    </optgroup>
</select>
Sélection multiple : ajouter l'attribut multiple à <select> permet de choisir plusieurs options (Ctrl / Cmd + clic).

12.8 Le bouton — <button>

Les boutons se déclarent avec la balise <button> ou avec un <input> de type submit, reset ou button. Trois types de boutons :

<button type="submit">Envoyer la demande</button>
<button type="reset">Effacer</button>
<button> vs <input type="submit"> : les deux fonctionnent, mais <button> est plus flexible car il peut contenir du HTML (icône + texte, mise en forme…). On le préfère aujourd'hui.

12.9 Regrouper avec <fieldset> et <legend>

Pour organiser un long formulaire en sections logiques, on peut envelopper des groupes de champs dans <fieldset>, avec un titre de groupe dans <legend>.

<fieldset>
    <legend>Vos coordonnées</legend>
    <label>Nom : <input type="text" name="nom" /></label>
    <label>Email : <input type="email" name="email" /></label>
</fieldset>
Vos coordonnées

12.10 Exemple complet — demande de devis

Mettons tout bout à bout dans un formulaire réaliste de demande de devis :

<form action="/devis" method="post">
    <fieldset>
        <legend>Vos coordonnées</legend>
        <!-- Chaque div.champ regroupe une étiquette et son champ -->
        <div class="champ">
            <label for="nom">Nom complet <span aria-hidden="true">*</span></label>
            <input type="text" id="nom" name="nom" required />
        </div>
        <div class="champ">
            <label for="email">Adresse email <span aria-hidden="true">*</span></label>
            <input type="email" id="email" name="email" placeholder="vous@exemple.fr" required />
        </div>
        <div class="champ">
            <label for="tel">Téléphone</label>
            <input type="tel" id="tel" name="telephone" placeholder="06 12 34 56 78" />
        </div>
    </fieldset>

    <fieldset>
        <legend>Votre demande</legend>
        <div class="champ">
            <label for="type">Type de prestation</label>
            <select id="type" name="prestation">
                <option value="">-- Choisir --</option>
                <option value="vente">Vente de matériel</option>
                <option value="montage">Montage sur mesure</option>
                <option value="reparation">Réparation</option>
                <option value="maintenance">Maintenance</option>
            </select>
        </div>
        <div class="champ">
            <label for="date">Date souhaitée</label>
            <input type="date" id="date" name="date" />
        </div>
        <div class="champ">
            <label for="description">Description du besoin</label>
            <textarea id="description" name="description" rows="4" placeholder="Détaillez ce que vous recherchez…"></textarea>
        </div>
        <div class="champ">
            <span>Mode de contact préféré :</span>
            <label><input type="radio" name="contact" value="email" checked /> Email</label>
            <label><input type="radio" name="contact" value="tel" /> Téléphone</label>
        </div>
        <div class="champ">
            <label>
                <input type="checkbox" name="rgpd" required />
                J'accepte que mes coordonnées soient utilisées uniquement pour traiter ma demande.
            </label>
        </div>
    </fieldset>

    <button type="submit">Envoyer la demande</button>
    <button type="reset">Tout effacer</button>
</form>
Vos coordonnées
Votre demande
Mode de contact préféré :
Étapes suivantes : le HTML ne fait que collecter les données. Pour les traiter (envoyer un email, enregistrer en base, générer un devis PDF…), il faut un langage côté serveur (PHP, Node.js, Python…) ou un service tiers (Formspree, Netlify Forms…). Cela sera abordé plus tard.
↑ Retour au sommaire

13. Les balises sémantiques

HTML 5 a apporté un ensemble de balises dont le seul rôle est de décrire la nature d'une zone de la page. Elles ne changent rien à l'apparence par défaut, mais elles permettent au navigateur, aux moteurs de recherche et aux lecteurs d'écran de comprendre la structure du document.

Sémantique = du sens : utiliser <nav> plutôt que <div class="menu"> ne change pas le rendu pour un œil humain — mais un lecteur d'écran saura annoncer « navigation », un moteur de recherche saura que la zone contient des liens de navigation, et un développeur reprenant ton code comprendra plus vite l'intention.

13.1 <header> — en-tête

La balise <header> regroupe les éléments introductifs d'une page ou d'une section : logo, titre, sous-titre, barre de navigation principale, moteur de recherche, formule d'accueil…

<header>
    <h1>L'Atelier Informatique du Finistère</h1>
    <p>Vente, montage, réparation à Morlaix.</p>
</header>

L'Atelier Informatique du Finistère

Vente, montage, réparation à Morlaix.

Une page peut contenir plusieurs <header> : un pour la page entière (en tête du document), et un par <article> ou <section> pour les introduire.

13.2 <nav> — navigation

<nav> délimite une zone de navigation principale — typiquement le menu du site. Elle ne s'utilise pas pour n'importe quelle liste de liens (par exemple les liens de bas de page peuvent tout à fait rester dans le <footer>).

<nav aria-label="Navigation principale">
    <ul>
        <li><a href="/">Accueil</a></li>
        <li><a href="/services">Services</a></li>
        <li><a href="/contact">Contact</a></li>
    </ul>
</nav>

Une simple liste de liens : <nav> n'ajoute aucune mise en forme (les couleurs viennent de l'habillage du cours). Liens inactifs ici.

Plusieurs navigations sur une même page ? Oui, c'est autorisé (menu principal + fil d'Ariane + table des matières…). Dans ce cas, on distingue chacune avec l'attribut aria-label pour que les lecteurs d'écran les nomment clairement.

13.3 <main> — contenu principal

<main> délimite le contenu unique et principal de la page — ce qui la distingue des autres pages du site. Elle ne doit apparaître qu'une seule fois par page, et ne doit pas contenir de header, footer ou nav de site (ces éléments partagés se placent en dehors).

<body>
    <header>...</header>
    <main>
        <!-- Le contenu propre à cette page -->
    </main>
    <footer>...</footer>
</body>

13.4 <section> — regroupement thématique

<section> regroupe un ensemble de contenus liés par un même thème. Chaque section devrait naturellement pouvoir porter un titre (<h2>, <h3>…).

<section>
    <h2>Nos services</h2>
    <p>Description des services proposés…</p>
</section>

<section>
    <h2>Notre atelier</h2>
    <p>Situé à Morlaix, ouvert du mardi au samedi…</p>
</section>

Nos services

Description des services proposés…

Notre atelier

Situé à Morlaix, ouvert du mardi au samedi…

13.5 <article> — contenu autonome

<article> délimite un contenu qui pourrait être extrait de la page et exister par lui-même : un billet de blog, une fiche produit, un commentaire, une actualité…

<article>
    <header>
        <h2>Comment nettoyer son PC de bureau</h2>
        <p>Publié le 15 octobre par Stéphane</p>
    </header>
    <p>Un nettoyage régulier prolonge la durée de vie…</p>
    <footer>
        <p>Mots-clés : entretien, poussière, ventilateur</p>
    </footer>
</article>

Comment nettoyer son PC de bureau

Publié le 15 octobre par Stéphane

Un nettoyage régulier prolonge la durée de vie…

Mots-clés : entretien, poussière, ventilateur

<section> ou <article> ? Bonne question pédagogique. Cas des blogs : la page liste des <article>, chacun peut contenir plusieurs <section> (introduction, développement, conclusion).

13.6 <aside> — contenu latéral

<aside> représente un contenu connexe ou secondaire par rapport à ce qui l'entoure : encadré, note, liens complémentaires, publicité, biographie de l'auteur…

<article>
    <h2>Choisir son SSD</h2>
    <p>Le SSD est aujourd'hui incontournable…</p>

    <aside>
        <h3>Le saviez-vous ?</h3>
        <p>Le premier SSD grand public est apparu en 2007.</p>
    </aside>
</article>

Choisir son SSD

Le SSD est aujourd'hui incontournable…

13.7 <footer> — pied de page

<footer> regroupe les éléments de clôture d'une page ou d'une section : mentions légales, contact, copyright, liens secondaires, informations sur l'auteur…

<footer>
    <p>© 2026 AI29 — L'Atelier Informatique du Finistère</p>
    <p>
        <a href="/mentions-legales">Mentions légales</a>
    </p>
</footer>

Comme le <header>, le <footer> peut apparaître au niveau de la page mais aussi à l'intérieur d'articles ou de sections.

13.8 Structure typique d'une page

Mises bout à bout, ces balises dessinent une structure claire d'une page moderne :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>AI29 — Accueil</title>
</head>
<body>

    <header>
        <h1>AI29</h1>
        <nav aria-label="Menu principal">
            <ul>
                <li><a href="/">Accueil</a></li>
                <li><a href="/services">Services</a></li>
                <li><a href="/contact">Contact</a></li>
            </ul>
        </nav>
    </header>

    <main>
        <section>
            <h2>Nos services</h2>
            <p>Description…</p>
        </section>

        <section>
            <h2>Derniers articles</h2>
            <article>
                <h3>Choisir son SSD</h3>
                <p>Aperçu de l'article…</p>
            </article>
        </section>

        <aside>
            <h2>Nous contacter</h2>
            <p>contact@ai29.tech</p>
        </aside>
    </main>

    <footer>
        <p>© 2026 AI29</p>
    </footer>

</body>
</html>

AI29

Nos services

Description…

Derniers articles

Choisir son SSD

Aperçu de l'article…

© 2026 AI29

Les contours cuivre et les étiquettes sont ajoutés pour ce cours : sans CSS, ces zones sont invisibles et la page ressemble à une simple suite de titres et de paragraphes.

À retenir : dans le doute, on privilégie toujours une balise sémantique quand elle existe. On garde <div> pour ce qui n'a pas de rôle particulier (voir chapitre suivant).
↑ Retour au sommaire

14. Les balises génériques — <div> et <span>

Après tout ce panorama de balises spécialisées, il reste deux « jokers » sans aucune signification : les balises génériques. Elles sont neutres — ni titre, ni paragraphe, ni article — mais elles servent à regrouper des éléments pour les manipuler ensemble, notamment pour les styler avec CSS ou les cibler avec JavaScript.

14.1 Bloc ou en-ligne — la distinction fondamentale

Avant de plonger dans les deux balises, une notion à comprendre : en HTML, les éléments se comportent de deux manières.

Pour bien voir la différence, ce rendu entoure chaque élément :

<h3>Réparation express</h3>
<p>Diagnostic <strong>gratuit</strong> et <a href="#generiques">devis détaillé</a> avant toute intervention.</p>

Réparation express

Diagnostic gratuit et devis détaillé avant toute intervention.

Bleu : éléments bloc, qui prennent toute la largeur. Cuivre : éléments en-ligne, qui suivent le texte.

<div> est la version bloc du conteneur neutre. <span> est sa version en-ligne. C'est leur seule vraie différence.

14.2 <div> — le conteneur bloc

<div> (pour division) regroupe plusieurs éléments dans un bloc logique. Il n'apporte aucune information sémantique, mais il sert de « boîte » à laquelle on peut appliquer un style commun, une position, ou une visibilité conditionnelle.

<div class="carte-service">
    <h3>Réparation</h3>
    <p>Diagnostic gratuit, devis détaillé avant intervention.</p>
    <a href="/reparation">En savoir plus</a>
</div>

Réparation

Diagnostic gratuit, devis détaillé avant intervention.

En savoir plus

La <div> elle-même est invisible : rien ne distingue encore la carte du reste. Le cours CSS lui donnera un fond, une bordure et une ombre.

Ici, la <div> permettra plus tard, avec le CSS, de dessiner une vraie carte (fond, bordure, ombre, arrondi…) autour du titre, du paragraphe et du lien — comme un bloc unique.

14.3 <span> — le conteneur en-ligne

<span> est l'équivalent de <div> mais à l'intérieur du texte. Il permet de cibler un mot, un chiffre ou un fragment sans casser la ligne.

<p>
    Votre PC est prêt : nous avons remplacé le disque dur par un
    <span class="mise-en-avant">SSD NVMe 1 To</span>
    et ajouté <span class="mise-en-avant">16 Go de RAM</span>.
</p>

Votre PC est prêt : nous avons remplacé le disque dur par un SSD NVMe 1 To et ajouté 16 Go de RAM.

On pourra ensuite, avec le CSS, mettre en valeur les fragments marqués mise-en-avant (couleur cuivre, gras…) sans changer la structure du paragraphe.

Piège à éviter : un <div> ne peut pas se placer à l'intérieur d'un <p> ou d'un <span> — les blocs ne s'imbriquent pas dans les éléments en-ligne. Le navigateur, s'il rencontre ce cas, ferme automatiquement l'élément parent avant d'ouvrir le bloc, ce qui produit un rendu inattendu.

14.4 Les attributs class et id

Une <div> ou un <span> tout nu ne sert pas à grand-chose : c'est un conteneur invisible. La vraie utilité vient quand on lui attache un identifiant :

<div id="hero" class="banniere principale">
    <h1>Bienvenue chez AI29</h1>
</div>

Bienvenue chez AI29

Ici, la <div> porte l'id unique hero (pour la cibler avec une ancre #hero par exemple) et deux classes, banniere et principale, réutilisables ailleurs.

Convention de nommage : en général on écrit les classes et les id en minuscules, sans accent ni espace, avec des tirets pour séparer les mots (carte-service, bouton-primaire). C'est ce qu'on appelle le kebab-case. Cette convention rend le CSS plus lisible et cohérent.

14.5 Quand utiliser <div> plutôt qu'une balise sémantique ?

Presque jamais. Le réflexe doit être : « existe-t-il une balise sémantique qui décrit ce que je fais ? ». Si oui, on la préfère. Le <div> ne doit apparaître que si aucune balise plus précise ne convient.

Réflexe sémantique avant <div>
Besoin Balise à préférer
En-tête de page <header>
Menu de navigation <nav>
Contenu principal <main>
Regroupement thématique <section>
Billet, produit, actualité <article>
Pied de page <footer>
Encart latéral <aside>
Rien de spécifique — juste grouper <div>
La règle d'or : <div> et <span> sont des outils de dernier recours quand le sens sémantique importe peu. Ils prendront toute leur importance dans la partie CSS pour organiser la mise en page.
↑ Retour au sommaire

Et maintenant ?

Voilà : les fondamentaux du HTML sont couverts. Tu sais désormais :

La suite logique est CSS : mettre en couleur, positionner, animer, adapter à toutes les tailles d'écran. Une page comme celle que tu lis actuellement combine déjà HTML (pour le contenu) et un peu de CSS (pour la lisibilité) — on s'y attaque vraiment dans le cours CSS.

Conseil pratique : le meilleur moyen de mémoriser le HTML n'est pas de le lire — c'est de l'écrire. Recrée une page simple à partir de zéro (une page « à propos », un CV, une fiche produit) sans regarder ce cours : les blocages que tu rencontreras t'apprendront plus que dix relectures.

À bientôt pour la suite. 👋

↑ Retour au sommaire