Se hai già letto la guida completa su HTML vs HTML5, sai che la semantica è la differenza più importante introdotta da HTML5. Ma sapere che esistono <header>, <main>, <article> e <section> è solo il punto di partenza.
Il vero problema è capire quando usare ciascuno — perché usarli male è peggio che usare <div> ovunque. Introduce rumore semantico, confonde Google e non porta nessun vantaggio reale.
In questa guida trovi la spiegazione di ogni tag semantico HTML5 con regole chiare, esempi pratici e i casi in cui non dovresti usarli.
Cosa sono i tag semantici HTML5 e perché esistono
In HTML 4 l’unico elemento strutturale era <div> — un contenitore generico senza significato. Per dare struttura a una pagina si usavano classi e ID arbitrari come id="header", class="content", id="footer". Questi nomi avevano senso per lo sviluppatore, ma per il browser, per Google e per gli screen reader erano tutti identici: contenitori anonimi.
HTML5 ha risolto questo problema introducendo elementi con significato intrinseco. Ogni tag semantico comunica il ruolo di quel blocco nella pagina — indipendentemente dal nome della classe o dall’ID assegnato.
Il risultato pratico:
- Il browser può costruire un modello della pagina più accurato.
- Google può distinguere contenuto principale, navigazione ed elementi accessori senza dover fare inferenze.
- Gli screen reader possono navigare la pagina per landmark, migliorando l’accessibilità per utenti con disabilità visive.
La mappa completa dei tag semantici HTML5
| Tag | Ruolo | Quante volte per pagina |
|---|---|---|
<header> | Intestazione di pagina o sezione | Più di uno (uno per <article>) |
<nav> | Navigazione principale o secondaria | Più di uno |
<main> | Contenuto principale della pagina | Uno solo |
<article> | Contenuto autonomo e redistribuibile | Più di uno |
<section> | Sezione tematica con heading proprio | Più di uno |
<aside> | Contenuto correlato ma non essenziale | Più di uno |
<footer> | Piè di pagina o di sezione | Più di uno (uno per <article>) |
<figure> + <figcaption> | Contenuto illustrativo con didascalia | Più di uno |
<time> | Data o orario leggibile dalla macchina | Più di uno |
<address> | Informazioni di contatto dell’autore | Più di uno |
<header>: intestazione di pagina o di sezione
<header> rappresenta l’intestazione introduttiva di una pagina o di una sezione. Tipicamente contiene logo, titolo del sito, navigazione principale e — se dentro un <article> — il titolo dell’articolo, l’autore e la data.
<!-- Header di pagina -->
<header>
<a href="/" aria-label="Homepage">
<img src="logo.svg" alt="Logo Sito">
</a>
<nav aria-label="Navigazione principale">
<ul>
<li><a href="/blog">Blog</a></li>
<li><a href="/chi-sono">Chi sono</a></li>
</ul>
</nav>
</header>
<!-- Header dentro un article -->
<article>
<header>
<h1>Titolo dell'articolo</h1>
<p>Di <a href="/autore">Fabio Gulotta</a> — <time datetime="2026-02-23">23 febbraio 2026</time></p>
</header>
<!-- corpo dell'articolo -->
</article>
Regole pratiche
- Puoi avere più
<header>nella stessa pagina — uno per la pagina, uno per ogni<article>. <header>non è obbligatoriamente il primo elemento della pagina. È l’intestazione del suo elemento padre.- Non annidare
<header>dentro un altro<header>.
<nav>: navigazione principale e secondaria
<nav> identifica un blocco di link di navigazione. Non tutti i gruppi di link richiedono <nav> — solo quelli che rappresentano navigazione significativa della pagina o del sito.
<!-- Navigazione principale -->
<nav aria-label="Navigazione principale">
<ul>
<li><a href="/blog">Blog</a></li>
<li><a href="/guide">Guide</a></li>
<li><a href="/contatti">Contatti</a></li>
</ul>
</nav>
<!-- Navigazione secondaria (breadcrumb) -->
<nav aria-label="Breadcrumb">
<ol>
<li><a href="/">Home</a></li>
<li><a href="/html">HTML</a></li>
<li aria-current="page">Tag semantici HTML5</li>
</ol>
</nav>
Regole pratiche
- Usa
aria-labelper distinguere più<nav>nella stessa pagina — gli screen reader lo annunciano all’utente. - Non usare
<nav>per i link nel footer di copyright, per i link social o per link isolati in un paragrafo. - I link di paginazione (
< Precedente / Successivo >) meritano un<nav>.
<main>: il contenuto principale — uno solo per pagina
<main> identifica il contenuto principale della pagina — quello unico per quella URL, escluso header, footer e sidebar. È l’elemento più importante per SEO e accessibilità: dice a Google e agli screen reader esattamente dove inizia il contenuto editoriale.
<body>
<header>...</header>
<nav>...</nav>
<main>
<h1>Tag Semantici HTML5: Come Usarli Davvero</h1>
<p>Contenuto principale dell'articolo...</p>
</main>
<aside>...</aside>
<footer>...</footer>
</body>
Regole pratiche
- Un solo
<main>per pagina — questa è l’unica regola assoluta dei tag semantici HTML5. - Non inserire mai
<main>dentro<header>,<footer>,<article>,<aside>o<nav>. - Gli screen reader usano
<main>come punto di salto diretto al contenuto — senza di esso, l’utente deve scorrere tutta la navigazione ogni volta.
<article>: contenuto autonomo e redistribuibile
<article> rappresenta un contenuto che ha senso anche isolato dal resto della pagina — un post di blog, una scheda prodotto, un commento, una notizia, una recensione. La domanda da porsi è: questo contenuto avrebbe senso pubblicato altrove, in un feed RSS o condiviso sui social? Se sì, è un <article>.
<main>
<article>
<header>
<h1>Come usare Flexbox in CSS</h1>
<time datetime="2026-01-15">15 gennaio 2026</time>
</header>
<p>Flexbox è un sistema di layout CSS che...</p>
<section>
<h2>Proprietà del container</h2>
<p>...</p>
</section>
<section>
<h2>Proprietà degli item</h2>
<p>...</p>
</section>
<footer>
<p>Autore: <a href="/fabio">Fabio Gulotta</a></p>
</footer>
</article>
</main>
<article> annidati: commenti e contenuti correlati
Gli <article> possono essere annidati — i commenti a un post sono <article> dentro l’<article> principale:
<article>
<h1>Titolo del post</h1>
<p>Corpo del post...</p>
<section>
<h2>Commenti</h2>
<article>
<header>
<p>Mario Rossi — <time datetime="2026-02-01">1 febbraio 2026</time></p>
</header>
<p>Ottimo articolo, molto chiaro!</p>
</article>
<article>
<header>
<p>Laura Bianchi — <time datetime="2026-02-02">2 febbraio 2026</time></p>
</header>
<p>Grazie, mi ha risolto un dubbio che avevo da tempo.</p>
</article>
</section>
</article>
Regole pratiche
- Se il contenuto non ha senso isolato, non è un
<article>— usa<section>o<div>. - Un
<article>dovrebbe avere quasi sempre un heading (<h1>o<h2>a seconda del contesto). - Le card prodotto in una lista e-commerce sono
<article>— ognuna è un’unità indipendente.
<section>: sezione tematica con heading proprio
<section> raggruppa contenuto tematicamente correlato all’interno di un <article> o della pagina. A differenza di <article>, il contenuto di una <section> non ha senso isolato — dipende dal contesto in cui si trova.
<article>
<h1>Guida completa a CSS Grid</h1>
<section>
<h2>Cos'è CSS Grid</h2>
<p>CSS Grid è un sistema di layout bidimensionale...</p>
</section>
<section>
<h2>Grid container e grid items</h2>
<p>Per attivare Grid, applica display: grid al container...</p>
</section>
<section>
<h2>Esempi pratici</h2>
<p>Vediamo tre layout comuni realizzati con Grid...</p>
</section>
</article>
<section> vs <div>: la regola d’oro
La distinzione più difficile da capire è questa. Usa <section> se:
- Il blocco ha un heading proprio (H2, H3…).
- Il blocco rappresenta una parte tematica distinta del contenuto.
- Comparirebbe come voce separata in un sommario della pagina.
Usa <div> se stai solo raggruppando elementi per ragioni di stile o layout, senza significato tematico.
<!-- ✅ Corretto: section con heading tematico -->
<section>
<h2>Requisiti di sistema</h2>
<p>Per installare il software hai bisogno di...</p>
</section>
<!-- ❌ Sbagliato: section senza heading, solo per layout -->
<section class="flex-container">
<img src="foto.jpg" alt="...">
<p>Descrizione immagine</p>
</section>
<!-- ✅ Corretto per il caso sopra: div -->
<div class="flex-container">
<img src="foto.jpg" alt="...">
<p>Descrizione immagine</p>
</div>
<aside>: contenuto correlato ma non essenziale
<aside> rappresenta contenuto tangenzialmente correlato al contenuto principale — una sidebar, un box di approfondimento, una citazione, una pubblicità, widget correlati. Se rimuovessi l’<aside>, il contenuto principale avrebbe ancora senso completo.
<main>
<article>
<h1>Introduzione a JavaScript</h1>
<p>JavaScript è il linguaggio di programmazione del web...</p>
<aside>
<h2>Sapevi che?</h2>
<p>JavaScript è stato creato in soli 10 giorni da Brendan Eich nel 1995.</p>
</aside>
<p>Le variabili in JavaScript si dichiarano con let, const o var...</p>
</article>
<!-- Sidebar globale della pagina -->
<aside aria-label="Sidebar">
<h2>Articoli correlati</h2>
<ul>
<li><a href="/typescript">Introduzione a TypeScript</a></li>
<li><a href="/nodejs">Node.js: guida per iniziare</a></li>
</ul>
</aside>
</main>
Regole pratiche
<aside>dentro un<article>→ correlato a quell’articolo.<aside>figlio diretto di<body>o<main>→ sidebar globale della pagina.- Non usare
<aside>per contenuto essenziale alla comprensione del testo principale.
<footer>: piè di pagina o di sezione
<footer> contiene informazioni di chiusura per il suo elemento padre — copyright, link legali, informazioni sull’autore, link correlati. Come <header>, può comparire più volte nella stessa pagina.
<!-- Footer di pagina -->
<footer>
<p>© 2026 Fabio Gulotta — <a href="/privacy">Privacy Policy</a></p>
<nav aria-label="Link footer">
<a href="/contatti">Contatti</a>
<a href="/chi-sono">Chi sono</a>
</nav>
</footer>
<!-- Footer di un article -->
<article>
<h1>Titolo articolo</h1>
<p>Corpo...</p>
<footer>
<p>Pubblicato da <a href="/autore">Fabio Gulotta</a></p>
<p>Tag: <a href="/tag/html5">HTML5</a>, <a href="/tag/seo">SEO</a></p>
</footer>
</article>
<figure> e <figcaption>: immagini con contesto
<figure> racchiude contenuto illustrativo — immagini, grafici, snippet di codice, video — che è referenziato dal testo principale ma che potrebbe essere spostato senza interrompere il flusso del contenuto. <figcaption> fornisce la didascalia.
<figure>
<img src="struttura-html5.png"
alt="Diagramma della struttura semantica di una pagina HTML5">
<figcaption>
La struttura semantica di una pagina HTML5 con i principali elementi di layout.
</figcaption>
</figure>
<!-- Figure con blocco di codice -->
<figure>
<pre><code>
const saluto = 'Hello, HTML5!';
console.log(saluto);
</code></pre>
<figcaption>Esempio di dichiarazione di variabile in JavaScript moderno.</figcaption>
</figure>
<time>: date leggibili dalla macchina
<time> marca date e orari in modo che siano leggibili sia dagli utenti che dalle macchine. L’attributo datetime fornisce il valore in formato ISO — fondamentale per i rich snippet di Google (data di pubblicazione, eventi).
<!-- Data di pubblicazione -->
<p>Pubblicato il <time datetime="2026-02-23">23 febbraio 2026</time></p>
<!-- Data e ora -->
<p>Evento il <time datetime="2026-03-15T10:00">15 marzo 2026 alle 10:00</time></p>
<!-- Durata -->
<p>Tempo di lettura: <time datetime="PT8M">8 minuti</time></p>
La struttura completa di una pagina HTML5 semantica
Mettendo insieme tutto, una pagina HTML5 ben strutturata si presenta così:
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tag Semantici HTML5 | fabiogulotta.it</title>
</head>
<body>
<header>
<a href="/" aria-label="Homepage">
<img src="logo.svg" alt="Fabio Gulotta">
</a>
<nav aria-label="Navigazione principale">
<ul>
<li><a href="/blog">Blog</a></li>
<li><a href="/guide">Guide</a></li>
</ul>
</nav>
</header>
<main>
<article>
<header>
<h1>Tag Semantici HTML5: Come Usarli Davvero</h1>
<p>Di <a href="/autore">Fabio Gulotta</a> —
<time datetime="2026-02-23">23 febbraio 2026</time></p>
</header>
<section>
<h2>Cosa sono i tag semantici</h2>
<p>...</p>
</section>
<section>
<h2>Quando usare article vs section</h2>
<p>...</p>
<aside>
<p>💡 Regola rapida: se il contenuto ha senso isolato, è un article.</p>
</aside>
</section>
<footer>
<p>Tag: <a href="/tag/html5">HTML5</a></p>
</footer>
</article>
<aside aria-label="Sidebar">
<h2>Articoli correlati</h2>
<ul>
<li><a href="/html-vs-html5">HTML vs HTML5: guida completa</a></li>
</ul>
</aside>
</main>
<footer>
<p>© 2026 fabiogulotta.it — <a href="/privacy">Privacy Policy</a></p>
</footer>
</body>
</html>
Errori comuni da evitare
❌ Usare <section> come <div> stilistico
<!-- ❌ Sbagliato -->
<section class="hero-banner">
<img src="hero.jpg" alt="...">
</section>
<!-- ✅ Corretto -->
<div class="hero-banner">
<img src="hero.jpg" alt="...">
</div>
❌Omettere aria-label con più <nav> o <aside>
Senza aria-label, gli screen reader annunciano semplicemente “navigazione” per ogni <nav> — l’utente non sa quale sia la principale.
❌ Mettere l’<h1> fuori dall’<article>
In una pagina con un solo articolo, l’<h1> va dentro l’<article>, non come figlio diretto di <main>.
❌ Usare <article> per ogni card di una lista
Se le card in una lista hanno senso solo nel contesto della lista (es. i passaggi di un tutorial), non sono <article> — sono <li> dentro <ol>.
Conclusione
I tag semantici HTML5 non sono decorazioni. Sono un contratto tra te e chi legge la tua pagina — browser, Google, screen reader, altri sviluppatori.
Usarli correttamente richiede una domanda prima di ogni blocco: qual è il ruolo di questo contenuto nella pagina? Non qual è il suo stile, non come appare — ma cosa significa.
Una volta che hai questa mentalità, la struttura semantica viene naturale. E il codice che scrivi diventa più chiaro, più accessibile e più comprensibile per i motori di ricerca — senza trucchi.
Esplora tutta la serie su HTML5
- HTML vs HTML5: Differenze, Esempi e Guida Completa 2026 ← Pilastro
- Tag semantici HTML5: header, main, section, article e quando usarli davvero ← Sei qui
- Struttura pagina HTML corretta: head, meta, viewport, charset e SEO base
- Form HTML5: input types, validazione nativa ed esempi pratici
- Audio e Video in HTML5: guida completa con esempi e fallback
- localStorage vs Cookie: differenze, sicurezza e quando usare cosa





