Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Sezioni e Struttura di un Documento HTML5

La specifica HTML5 rende disponibili numerosi nuovi elementi agli sviluppatori, permettendo ad essi di descrivere la struttura di un documento web tramite una semantica standard. Questa pagina descrive i nuovi elementi e spiega come usarli per definire la struttura di qualsiasi documento.

Struttura di un Documento in HTML 4

La struttura di un documento, cioè la struttura semantica di ciò che si trova tra <body> e </body>, è fondamentale nella presentazione della pagina all'utente. HTML 4 usa le nozioni di sezione e sotto-sezione di un documento per descrivere la sua struttura. Una sezione è definita da un Elemento HTML di Divisione ( <div> ) con un Elemento HTML di Intestazione ( <h1>, <h2>, <h3>, <h4>, <h5>, o <h6> ) al suo interno, che ne definisce il titolo. La relazione tra gli Elementi HTML di Divisione e gli Elementi HTML di Intestazione genera la struttura del documento.

Dunque il seguente mark-up:

<div class="section" id="elefanti-delle-foreste" >
<h1>Elefanti delle foreste</h1>
<p>In questa sezione, parliamo dei poco noti elefanti delle foreste.
...la sezione continua...
<div class="subsection" id="elefanti-habitat" >
<h2>Habitat</h2>
<p>Gli elefanti delle foreste non vivono su gli alberi, ma tra di essi.
...la sotto-sezione continua...
</div>
</div>

genera la seguente struttura:

1. Elefanti delle foreste
   1.1 Habitat

L'elemento <div> non è strettamente necessario per definire una nuova sezione. La mera presenza di un Elemento HTML di Intestazione è abbastanza per indicare una nuova sezione. Perciò:

<h1>Elefanti delle foreste</h1>
<p>In questa sezione, parliamo dei poco noti elefanti delle foreste.
...la sezione continua...
<h2>Habitat</h2>
<p>Gli elefanti delle foreste non vivono su gli alberi, ma tra di essi.
...la sotto-sezione continua...
<h2>Dieta</h2>
<h1>Gerbilli della Mongolia</h1>

genera la seguente struttura:

1. Elefanti delle foreste
   1.1 Habitat
   1.2 Dieta
2. Gerbilli della Mongolia

Problemi Risolti da HTML5

La definizione della struttura di un documento di HTML 4 è molto approssimativa e causa numerosi problemi:

  1. L'uso di un <div> per definire sezioni semantiche, senza la definizione di valori specifici nell'attributo class, rende impossibile per un algoritmo automatico definire la struttura ("Questo <div> è parte della struttura della pagina, definisce una sezione o una sotto-sezione?" o "è solo un <div> inserito ai fini di presentazione, usato per scopi estetici?"). In altri termini, la specifica HTML4 è poco precisa riguardo a cosa è una sezione e come definire il suo scopo. La generazione automatica di una struttura è importante, in modo particolare per le tecnologie assistive, che sono in grado di adattare la presentazione delle informazioni alla struttura del documento. HTML5 rimuove l'elemento <div> dall'algoritmo che genera la struttura, introducendo l'elemento <section>, cioè un Elemento HTML di Sezione.
  2. Unire più documenti è difficile: inserire un sotto-documento in un documento principale richiede di cambiare il "grado" delle intestazioni in modo che la struttura venga mantenuta. Questo problema viene risolto in HTML5, grazie ai nuovi elementi di sezionamento ( <article> , <section> , <nav> e <aside> ) che sono sempre sotto-sezioni della sezione che li contiene, indipendentemente dalle sezioni create dagli Elementi HTML di Intestazione.
  3. Poiché ogni Elemento HTML di Intestazione cambia la struttura, non è possibile assegnare un sotto-titolo o un titolo secondario (es., <h1>Justine</h1><h2>Les Malheurs de la Vertu</h2> genera la struttura 1. Justine 1.1 Les Malheurs de la Vertu). HTML5 introduce l'elemento <hgroup> che "nasconde" tutti gli elementi di intestazione tranne quello di grado più elevato (es., <hgroup><h1>Justine</h1><h2>Les Malheurs de la Vertu</h2></hgroup> genera la struttura 1. Justine).
  4. Nel HTML4, ogni sezione è parte della struttura del documento. Ma spesso i documenti non sono così lineari. Un documento può avere sezioni speciali contenenti informazioni che non fanno parte del flusso principale, anche se correlati ad esso, come una pubblicità o un approfondimento. HTML5 introduce l'elemento <aside> permettendo a questo tipo di sezioni di rimanere estranee al flusso principale.
  5. Ancora, nel HTML4, dato che ogni sezione è parte della struttura del documento, non c'è modo di avere sezioni relative non al documento ma a tutto il sito, come il logo, i menu, una tabella dei contenuti, o le informazioni legali e sul copyright. A tal fine, HTML5 introduce tre elementi per altrettante sezioni specifiche: <nav> per i gruppi di links, come le tabelle dei contenuti, <footer> e <header> per le informazioni correlate al sito.

Più in generale HTML5 aggiunge precisione alle funzionalità di sezionamento ed intestazione, permettendo una struttura del documento prevedibile e utilizzata dai browser per migliorare l'esperienza utente.

L'Algoritmo della Struttura di HTML5

Definire Sezioni nel HTML5

Tutto il contenuto dell'elemento <body> appartiene ad una sezione. Le sezioni HTML5 possono essere nidificate. Accanto alla sezione principale, definita dall'elemento <body>, i confini delle sezioni vengono definiti esplicitamente o implicitamente. Le sezioni esplicite sono contenute negli elementi <body>, <section>, <article>, <aside>, <footer>, <header>, e <nav>.

Nota: Ogni sezione può avere la propria gerarchia di intestazioni. Quindi anche un elemento nidificato può avere un'intestazione <h1>. Vedi Definire le Intestazioni in HTML5.

Esempio:

<section>
  <h1>Elefanti delle foreste</h1> 
  <section>
    <h1>Introduzione</h1>
    <p>In questa sezione, parliamo dei poco noti elefanti delle foreste.
  </section>
  <section>
    <h1>Habitat</h1>
    <p>Gli elefanti delle foreste non vivono su gli alberi, ma tra di essi.
  </section>
  <aside>
    <p>pubblicità
  </aside>
</section>
<footer>
  <p>(c) 2010 Esempi S.P.A.
</footer>

Questo frammento di HTML definisce due sezioni di primo livello:

<section>
  <h1>Elefanti delle foreste</h1>    
  <section>     
    <h1>Introduzione</h1>     
    <p>In questa sezione, parliamo dei poco noti elefanti delle foreste.
  </section>   
  <section>     
    <h1>Habitat</h1>
    <p>Gli elefanti delle foreste non vivono su gli alberi, ma tra di essi. 
  </section>
   <aside>
    <p>pubblicità
  </aside>
</section>

<footer>
  <p>(c) 2010 Esempi S.P.A.
</footer>

La prima sezione ha tre sotto-sezioni:

<section>
  <h1>Elefanti delle foreste</h1>
 
  <section>     
    <h1>Introduzione</h1>     
    <p>In questa sezione, parliamo dei poco noti elefanti delle foreste.
  </section>

  <section>     
    <h1>Habitat</h1>
    <p>Gli elefanti delle foreste non vivono su gli alberi, ma tra di essi. 
  </section>

  <aside>
    <p>pubblicità
  </aside>
</section>

<footer>
  <p>(c) 2010 Esempi S.P.A.
</footer>

Il che genera la seguente struttura:

1. Elefanti delle foreste
   1.1 Introduzione
   1.2 Habitat
   1.3 Sezione (aside)

Definire le Intestazioni in HTML5

L'Elemento HTML di Sezione definisce la struttura del documento, ma c'è bisogno anche delle intestazioni. La regola di base è semplice: il primo Elemento HTML di Intestazione (uno tra <h1>, <h2>, <h3>, <h4>, <h5>, <h6> ) definisce l'intestazione della sezione corrente.

Gli elementi di intestazione hanno un grado dato dal numero nell'elemento, dove <h1> è il grado più alto, e <h6> quello più basso. Il grado relativo ha importanza solo all'interno di una sezione; è la struttura delle sezioni a determinare lo schema definitivo, non il grado di ciascuna intestazione. Per esempio, questo codice:

<section>
  <h1>Elefanti delle foreste</h1>    
  <p>In questa sezione, parliamo dei poco noti elefanti delle foreste. 
    ...la sezione continua...
  <section>
    <h2>Habitat</h2>  
    <p>Gli elefanti delle foreste non vivono su gli alberi, ma tra di essi. 
        ...la sotto-sezione continua...
  </section>
</section>
<section>
  <h3>Gerbilli della Mongolia</h3>
  <p>In questa sezione, parliamo dei famosi gerbilli della Mongolia. 
     ...la sezione continua...
</section>

genera la seguente struttura:

1. Elefanti delle foreste
   1.1 Habitat
2. Gerbilli della Mongolia

Notare come il grado delle intestazioni (nell'esempio <h1> per la prima sezione di primo livello, <h2> per la sotto-sezione e <h3> per la seconda sezione di primo livello) non conta. (Qualsiasi grado può essere utilizzato come intestazione di una sezione esplicitamente definita, anche se questa pratica non è consigliata.)

Sezionamento implicito

Poiché gli elementi HTML5 di sezionamento non sono obbligatori per definire una struttura, c'è un modo per definire sezioni senza di essi, per mantenere la compatibilità con la rete esistente dominata da HTML4. Questa tecnica è chiamata sezionamento implicito.

Gli Elementi HTML di Intestazione da ( <h1> a <h6> ) definiscono una nuova sezione implicita quando non sono la prima voce del loro contenitore, che è sempre una sezione esplicita. Il modo in cui questa sezione implicita viene posizionata nella struttura è definito dal suo grado relativo all'intestazione precedente nella sezione che le contiene. Se il grado è inferiore rispetto all'intestazione precedente, viene aperta una sotto-sezione implicita. Questo codice:

<section>
  <h1>Elefanti delle foreste</h1>  
  <p>In questa sezione, parliamo dei poco noti elefanti delle foreste.
    ...la sezione continua...
  <h3 class="implicit subsection">Habitat</h3>
  <p>Gli elefanti delle foreste non vivono su gli alberi, ma tra di essi. 
    ...la sotto-sezione continua...
</section>

genera la seguente struttura:

1. Elefanti delle foreste
   1.1 Habitat (implicitly defined by the h3 element)

Se l'intestazione ha lo stesso grado di quella precedente, la sezione corrente viene chiusa (anche se esplicita!) e se ne apre una nuova, implicita, dello stesso livello:

<section>
  <h1>Elefanti delle foreste</h1>  
  <p>In questa sezione, parliamo dei poco noti elefanti delle foreste.
    ...la sezione continua...
  <h1 class="implicit section">Gerbilli della Mongolia</h1>
  <p>Gerbilli della Mongolia are cute little mammals.
    ...la sezione continua...
</section>

genera la seguente struttura: 

1. Elefanti delle foreste
2. Gerbilli della Mongolia (implicitamente definita dall'elemento h1, che allo stesso tempo ha chiuso la sezione precedente)

Se ha grado superiore all'intestazione precedente, chiude la sezione corrente e ne apre una nuova, implicita, di livello superiore:

<body>
  <h1>Mammiferi</h1>
  <h2>Balene</h2>
  <p>In questa sezione, parliamo delle balene nuotatrici.
    ...la sezione continua...
  <section>
    <h3>Elefanti delle foreste</h3>  
    <p>In questa sezione, parliamo dei poco noti elefanti delle foreste.
      ...la sezione continua...
    <h3>Gerbilli della Mongolia</h3>
      <p>Hordes of gerbils have spread their range far beyond Mongolia.
         ...la sotto-sezione continua...
    <h2>Rettili</h2>
      <p>I rettili sono animali dal sangue freddo.
          ...la sotto-sezione continua...
  </section>
</body>

genera la seguente struttura:

1. Mammiferi
   1.1 Balene (definita implicitamente dall'elemento h2)
   1.2 Elefanti delle foreste (definita esplicitamente dall'elemento section)
   1.3 Gerbilli della Mongolia (definita implicitamente dall'elemento h3, che allo stesso tempo chiude la sezione precedente)
   1.4 Rettili (definita implicitamente dall'elemento h2, che allo stesso tempo chiude la sezione precedente)

Questa non è la struttura che ci si potrebbe aspettare dopo un rapido sguardo alle intestazioni. Per rendere il vostro markup comprensibile all'uomo, è una buona pratica usare sezioni esplicite, e far combaciare il grado dell'intestazione con il livello di nidificazione previsto. Tuttavia, ciò non è richiesto dalla specifica HTML5. Se si riscontra che i browser rendono la struttura del vostro documento in modi inaspettati, verificare se alcune sezioni vengono chiuse implicitamente dagli elementi di intestazione.

Un'eccezione alla regola empirica che il grado dell'intestazione deve corrispondere al livello di nidificazione della sezione avviene per le sezioni che vengono riutilizzate in più documenti. Per esempio, una sezione potrebbe essere memorizzata in un sistema di gestione dei contenuti ed inserita nel documento in fase di runtime. In questo caso, una buona pratica è partire sempre da un elemento <h1> per la prima intestazione della sezione. Il livello di nidificazione della sezione riutilizzabile sarà determinato dalla struttura del documento in cui appare. I tag di sezione esplicita sono comunque utili in questi casi.

Sovrascrivere il Sezionamento Implicito

A volte, una sezione ha bisogno di avere più intestazioni. Alcuni casi comuni sono:

  • una sezione su un libro o un film, che ha un titolo secondario:
    <section>
      <h1>Justine</h1>
      <h2>Les Malheurs de la vertu</h2>
    </section>

    genera la seguente struttura:

    1. Justine
       1.1 Les Malheurs de la vertu
    
  • un elenco di tag:
    <section>
      <h1>Strutture e Schemi di un documento</h1>
      <h2>HTML, HTML5, Sezioni, Schemi</h2>
    </section>

    genera la seguente struttura:

    1. Strutture e schemi di un documento
       1.1 HTML, HTML5, Sezioni, Schemi

A causa del sezionamento implicito, questo non è possibile senza l'aiuto dell'Elemento HTML di Raggruppamento delle Intestazioni ( <hgroup> ) introdotto da HTML5. Esso "nasconde" tutte le intestazioni dalla struttura, eccetto la prima, consentendo di evitare il sezionamento implicito. Grazie a questo elemento l'esempio del libro secondario:

<section>
  <hgroup>
    <h1>Justine</h1>
    <h2>Les Malheurs de la vertu</h2>
  </hgroup>
  ... Contenuti ...
</section>

genera la seguente struttura:

1. Justine

Sezioni "root"

Una sezione "root" (radice) è un elemento HTML che può avere una propria struttura, ma le sezioni ed intestazioni interne ad esso non interferiscono con la struttura del suo contenitore. Oltre al <body> che è la sezione "root" logica di un documento, le sezioni root sono spesso elementi che aggiungono contenuto esterno alla pagina: <blockquote>, <details>, <fieldset>, <figure> e <td>.

Esempio:

<section>
  <h1>Elefanti delle foreste</h1> 
  <section>
    <h2>Introduzione</h2>
    <p>In questa sezione, parliamo dei poco noti elefanti delle foreste.
  </section>
  <section>
    <h2>Habitat</h2>
    <p>Gli elefanti delle foreste non vivono su gli alberi, ma tra di essi.
       Vediamo cosa dicono gli scienziati in "<cite>Gli elefanti delle foreste nel Borneo</cite>":
    <blockquote>
       <h1>Borneo
       <p>L'elemento foresta vive nel Borneo...
    </blockquote>
  </section>
</section>

Questo esempio genera la seguente struttura:

1. Elefanti delle foreste
   1.1 Introduzione
   1.2 Habitat

La struttura principale non contiene la struttura interna dell'elemento <blockquote>, che, trattandosi di una citazione esterna, è un elemento di sezione "root", perciò la sua struttura interna viene isolata.

Sezioni oltre la struttura

HTML5 introduce quattro nuovi elementi che permettono di definire sezioni che non fanno parte della struttura principale del documento:

  1. L'Elemento HTML di Sezione Aside ( <aside> ) definisce una sezione che, anche se correlata all'elemento principale, non appartiene al flusso principale, come un box di approfondimento o una pubblicità. Ha la sua propria struttura, ma non appartiene a quella principale.
  2. L'Elemento HTML di Sezione Navigazione ( <nav> ) definisce una sezione che contiene i link di navigazione. In un documento possono essere presenti molti elementi di navigazione, ad esempio: uno con i link interni alla pagina, come le tabelle dei contenuti, e un altro con i link di navigazione del sito. Questi links non fanno parte del flusso o della struttura principale e generalmente il loro rendering viene eseguito per ultimo dagli screen readers e da tecnologie assistive simili.
  3. L'Elemento HTML di Sezione Header ( <header> ) definisce la testata di una pagina, che generalmente contiene il logo e il nome del sito, occasionalmente una barra di navigazione. A dispetto del nome, non viene necessariamente posizionato all'inizio del documento.
  4. L'Elemento HTML di Sezione Footer ( <footer> ) definisce il piè di pagina, che generalmente contiene il copyright, le informazioni legali ed a volte altri links. A dispetto del nome, non viene necessariamente posizionato alla fine del documento.

Indirizzi e data di pubblicazione negli elementi di sezionamento

L'autore di un documento spesso vuole pubblicare alcune informazioni personali, come nome e indirizzo dell'autore. HTML4 lo permetteva tramite l'elemento <address>, che è stato esteso in HTML5.

Un documento può essere fatto di diverse sezioni scritte da diversi autori. Una sezione curata da un autore diverso rispetto alla sezione principale può essere definita da un elemento <article>. Di conseguenza, l'elemento <address> è ora riferito al più vicino tra gli elementi <body> e <article> che lo contengono.

In modo simile, il nuovo elemento <time>, con il suo set di attributi pubdate, rappresenta la data di pubblicazione di tutto il documento, rispettivamente all'articolo, legato al più vicino contenitore <body> o <article>.

Usare Elementi HTML5 nei Browser Non-HTML5

Sezioni ed intestazioni dovrebbero funzionare nella maggior parte dei browser non-HTML5-compatibili. Anche se non supportati, non necessitano di una interfaccia DOM specifica ma solo di uno stile CSS dedicato, perché agli elementi sconosciuti viene assegnato display:inline di default:

section, article, aside, footer, header, nav, hgroup {
  display:block;
}

Naturalmente lo sviluppatore può assegnargli uno stile differente, ma tenendo a mente che nei browser non compatibili con HTML5 il rendering di default è diverso da quel che ci si potrebbe aspettare. Notare che l'elemento <time> non è stato incluso di proposito, perché in questo caso il rendering di default dei browser non-HTML5-compatibili corrisponde a quello previsto.

Questo metodo però ha delle limitazioni, perché alcuni browser non permettono di applicare stili CSS agli elementi non supportati. È il caso di Internet Explorer (versione 8 e precedenti), che necessita di uno script per abilitare il rendering di tali elementi:

<!--[if lt IE 9]>
  <script>
    document.createElement("header");
    document.createElement("footer");
    document.createElement("section"); 
    document.createElement("aside");

    document.createElement("nav");
    document.createElement("article"); 
    document.createElement("hgroup");
    document.createElement("time");
  </script>
<![endif]-->

Questo significa che, in caso di Internet Explorer (8 e precedenti), javascript deve essere abilitato affinché gli elementi HTML vengano visualizzati correttamente. Altrimenti essi non verranno visualizzati (o verranno visualizzati senza stili applicati NdT), il che potrebbe rivelarsi problematico, dato che si tratta di elementi che definiscono la struttura dell'intera pagina. Ecco perché un elemento <noscript> dovrebbe essere aggiunto per questi casi specifici, come nell'esempio di seguito:

<noscript>
   <strong>Attenzione !</strong>
   Dato che il tuo browser non supporta HTML5, alcuni elementi vengono simulati usando JScript.
   Sfortunatamente il tuo browser ha disattivato lo scripting. Per favore abilita JScript per visualizzare la pagina.
</noscript>

Ciò ci porta al seguente codice per permettere il supporto delle sezioni e delle intestazioni HTML5 nei browser non-HTML5, anche nel caso di Internet Explorer (8 e precedenti), con un fallback adeguato nel caso in il browser non permetta l'esecuzione di javascript:

<!--[if lt IE 9]>
  <script>
    document.createElement("header");
    document.createElement("footer");
    document.createElement("section"); 
    document.createElement("aside");
    document.createElement("nav");
    document.createElement("article"); 
    document.createElement("hgroup");
    document.createElement("time");
  </script>
  <noscript>
   <strong>Attenzione !</strong>
   Dato che il tuo browser non supporta HTML5, alcuni elementi vengono simulati usando JScript.
   Sfortunatamente il tuo browser ha disattivato lo scripting. Per favore abilita JScript per visualizzare la pagina.
</noscript>
<![endif]-->

Conclusioni

Le nuove sezioni e intestazioni introdotte in HTML5 danno agli sviluppatori la capacità di descrivere la struttura di un documento web in maniera standard. Portano un grande vantaggio per le persone che hanno browser supportanti HTML5 e che hanno bisogno della struttura per comprendere la pagina, per esempio le le persone che necessitano l'aiuto di una tecnologia assistiva. I nuovi elementi semantici sono semplici da usare e, con pochi aggiustamenti, funzionano anche nei browser non-HTML5. Pertanto possono essere utilizzati senza restrizioni.

Tag del documento e collaboratori

 Hanno collaborato alla realizzazione di questa pagina: teoli, Giona
 Ultima modifica di: teoli,