Lesson 6/8 7 min

Semantic HTML

Give meaning to your HTML structure with semantic tags: header, nav, main, article, section, aside, footer.

FR EN

Pourquoi le HTML sémantique ?

Avant HTML5, tout était construit avec des <div>. Des <div> partout : pour le menu, pour le contenu, pour le pied de page. Résultat ? Impossible de savoir ce qui était quoi juste en lisant le code.

Les balises sémantiques donnent du sens à la structure. Google comprend votre page, les lecteurs d'écran permettent aux personnes malvoyantes de naviguer, et les développeurs lisent le code plus facilement.

Pensez-y comme ça : un <div>, c'est une boîte sans étiquette. Un <nav>, c'est une boîte marquée « navigation ». Même contenu, mais tout le monde sait ce qu'il y a dedans.

Les 7 balises à connaître

  • <header> : en-tête de page ou de section (logo, titre, nav)
  • <nav> : navigation principale (menu, liens de navigation)
  • <main> : contenu principal de la page (un seul par page)
  • <article> : contenu autonome (article de blog, commentaire, produit)
  • <section> : regroupement thématique avec un titre
  • <aside> : contenu secondaire (sidebar, encadré, publicité)
  • <footer> : pied de page (copyright, liens légaux, contact)

Exemple complet : une page bien structurée

Voici comment ces balises s'imbriquent pour former une page complète :

<header>
  <nav>...</nav>
</header>
<main>
  <article>
    <section>...</section>
    <section>...</section>
  </article>
  <aside>...</aside>
</main>
<footer>...</footer>

Chaque balise a un rôle clair. Pas besoin de deviner, pas besoin de lire les classes CSS pour comprendre la structure.

Why semantic HTML?

Before HTML5, everything was built with <div> tags. Divs everywhere: for the menu, for the content, for the footer. The result? Impossible to tell what was what just by reading the code.

Semantic tags give meaning to the structure. Google understands your page, screen readers let visually impaired people navigate, and developers read the code more easily.

Think of it this way: a <div> is an unlabeled box. A <nav> is a box labeled "navigation". Same content, but everyone knows what's inside.

The 7 tags you need to know

  • <header> — page or section header (logo, title, nav)
  • <nav> — main navigation (menu, navigation links)
  • <main> — main content of the page (only one per page)
  • <article> — self-contained content (blog post, comment, product)
  • <section> — thematic grouping with a heading
  • <aside> — secondary content (sidebar, callout, ad)
  • <footer> — page footer (copyright, legal links, contact)

Full example: a well-structured page

Here's how these tags nest together to form a complete page:

<header>
  <nav>...</nav>
</header>
<main>
  <article>
    <section>...</section>
    <section>...</section>
  </article>
  <aside>...</aside>
</main>
<footer>...</footer>

Each tag has a clear role. No guessing needed, no reading CSS classes to understand the structure.

Essayez vous-même
Avec l'IA

Copiez ce prompt dans Claude ou ChatGPT :

Prends ce code HTML et remplace tous les div par les bonnes balises sémantiques : [coller le code]. Explique chaque remplacement.
Ré-explique sans regarder

Sans relire la réponse de l'IA : avec tes mots, comment décides-tu si un bloc doit être un <div> ou une balise sémantique (<nav>, <article>, etc.) ?

Une bonne explication dit : on choisit une balise sémantique dès qu'elle décrit le rôle du bloc (navigation → <nav>, contenu autonome → <article>, contenu principal unique → <main>). Le <div> reste le dernier recours : un simple conteneur neutre pour grouper ou positionner, quand aucune balise sémantique ne correspond. Le bénéfice n'est pas visuel (le rendu est identique) mais lisible par Google, les lecteurs d'écran et les autres devs.
Exercice : Corrigez le code de l'IA

L'IA a généré une page en utilisant <div class="header">, <div class="nav">, <div class="main"> au lieu des vraies balises sémantiques. Remplacez chaque div par la bonne balise.

Corrigez le code
Accepter ou rejeter le code de l'IA

L'IA te propose ce menu de navigation. Ton rôle de relecteur : l'accepter tel quel ou le rejeter, et dire pourquoi.

<div class="nav">
  <span class="lien" onclick="go('/')">Accueil</span>
  <span class="lien" onclick="go('/blog')">Blog</span>
</div>
À rejeter. Deux problèmes : ce bloc de navigation devrait être un <nav>, pas un <div class="nav"> ; et surtout, des <span> cliquables ne sont pas des liens. Un vrai <a href> est focusable au clavier, annoncé comme lien par les lecteurs d'écran, ouvrable dans un nouvel onglet et suivi par Google. Le bon code : <nav> avec des <a href="/">. Réécrire des comportements natifs en JS est un classique de code généré : refuse-le.
Rappel libre

Sans remonter dans la leçon : qu'apporte une balise sémantique qu'un <div> n'apporte pas, et peux-tu citer trois balises sémantiques avec leur rôle ?

Une balise sémantique décrit le sens du bloc, ce qu'un <div> neutre ne fait pas : Google comprend mieux la page (SEO) et les lecteurs d'écran peuvent naviguer par zones. Trois exemples : <nav> (navigation), <main> (contenu principal unique, un seul par page), <article> (contenu autonome qui a du sens seul). Le rendu visuel, lui, reste identique au <div>.
Combien de <main> peut-il y avoir par page ?
Quelle balise utiliser pour un menu de navigation ?
<article> est utilisé pour :
Next step

Your semantic tags give meaning to the page. What's missing is interaction with the visitor: the next lesson dives into forms, input fields, buttons and everything that lets you collect information from your users.

Lesson 7: Forms →
Besoin d'un développeur pour votre projet ?

Réponse sous 24h · Sans engagement