Menu

Tag nav HTML: barre di navigazione, menu e breadcrumb

L'elemento <nav> indica un blocco di link di navigazione principali. Scopri come costruire una barra di navigazione con <nav> e una lista, come indicare la pagina corrente, come etichettare più nav nella stessa pagina e come creare un menu a comparsa per mobile.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Una barra di navigazione con nav

Racchiudi il menu in <nav> e metti i link in una lista. Flexbox trasforma la lista in una barra orizzontale:

list-style: none e padding: 0 tolgono i punti elenco e il rientro. display: block su ogni link fa sì che il suo padding occupi davvero spazio nella barra, quindi l'area cliccabile è tutto il riquadro con il padding. Cancella la riga display: flex e lo stesso menu diventa una lista verticale, cioè l'aspetto di un menu laterale.

<nav> da solo non si vede. Il suo compito è il significato: gli screen reader lo espongono come landmark di navigazione, così un utente può saltare al menu, o oltre, con un solo tasto.

Indicare la pagina corrente

Aggiungi aria-current="page" al link della pagina mostrata. Dice agli screen reader "sei qui", e dà al CSS un aggancio per evidenziare il link:

Sposta aria-current="page" su un altro link e l'evidenziazione lo segue. Dare lo stile all'attributo invece che a una classe .active tiene sincronizzati aspetto e accessibilità: non puoi avere l'uno senza l'altra.

Più nav nella stessa pagina: etichette e breadcrumb

Una pagina può avere un menu principale, i breadcrumb e un indice, ognuno nel suo <nav>. Dai a ognuno un aria-label, così uno screen reader annuncia "navigazione Breadcrumb" invece di tre voci "navigazione" identiche:

I breadcrumb usano una lista ordinata <ol> perché l'ordine conta. Le barre vengono da ::before del CSS, così gli screen reader non leggono "barra" tra una voce e l'altra. L'ultima voce è la pagina corrente e non è un link.

Un indice

Anche una lista di link verso le sezioni della stessa pagina è navigazione. I link #id saltano all'elemento con quell'id; provali nell'anteprima:

Qui l'etichetta viene da un titolo visibile tramite aria-labelledby, che è meglio di aria-label quando il titolo è già sullo schermo.

Un menu a comparsa per mobile

Sugli schermi stretti i menu di solito si nascondono dietro un pulsante. Usa un vero <button> con aria-expanded, e tieni i link dentro <nav>:

aria-expanded dice a uno screen reader se il menu è aperto, e l'attributo hidden toglie la lista sia dallo schermo sia dall'albero di accessibilità finché è chiuso. Sugli schermi larghi mostreresti la lista con una media query e nasconderesti il pulsante.

Errori comuni

  • Racchiudere ogni gruppo di link in <nav>. Usalo per il menu principale, i breadcrumb, la paginazione e gli indici. I link dentro il testo non sono blocchi di navigazione.
  • Un pulsante del menu fatto con un <div>. Non riceve il focus e non si può premere con la tastiera. Usa <button>.
  • Più nav senza etichette. Aggiungi aria-label o aria-labelledby a ognuno così si possono distinguere.
  • Colorare soltanto il link corrente. Aggiungi aria-current="page"; il colore da solo non viene annunciato e potrebbe non essere visibile a tutti.
  • Link con href="#" in produzione. In una demo vanno bene, ma le voci di un menu vero hanno bisogno di URL veri, così funzionano anche quando vengono aperte in una nuova scheda. La pagina sui link spiega come funzionano i valori di href.

Domande frequenti

Cos'è il tag nav in HTML?

<nav> è un elemento semantico che racchiude un blocco di link di navigazione principali, come il menu del sito, un indice o i breadcrumb. Gli screen reader lo elencano come landmark di navigazione così gli utenti possono saltarci direttamente.

I link dentro nav devono stare in una lista?

È lo schema più comune ed è un buono schema: un <ul> di voci <li> permette agli screen reader di annunciare quanti link ha il menu. Anche i link messi direttamente dentro <nav> sono validi, per esempio per due o tre link in riga.

Ogni gruppo di link ha bisogno di un elemento nav?

No. Usa <nav> solo per i blocchi di navigazione principali. Qualche link in un paragrafo o una breve lista di link legali nel footer non ne hanno bisogno, e troppi landmark di navigazione rendono ognuno più difficile da trovare.

Come creo una barra di navigazione orizzontale?

Metti i link in un <ul> dentro <nav>, poi dai alla lista display: flex; list-style: none; padding: 0; e un gap. Flexbox dispone le voci in riga.

Come mostro la pagina corrente in una navbar?

Aggiungi aria-current="page" al link della pagina in cui si trova l'utente, e dagli uno stile con il selettore [aria-current="page"]. Così anche gli screen reader la annunciano come pagina corrente.

Una pagina può avere più di un nav?

Sì, per esempio un menu principale, un percorso di breadcrumb e un indice. Dai a ognuno un aria-label diverso, come "Main" o "Breadcrumb", così chi usa uno screen reader li può distinguere.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA