Accessibilità

Breadcrumb accessibile

Un breadcrumb accessibile è un nav con un nome, una lista ordinata, aria-current sull'ultimo elemento e un JSON-LD con la stessa gerarchia della pagina.

In sintesi

  • Il breadcrumb va dentro un nav con aria-label, in una lista ordinata: la struttura arriva dall'HTML, non dagli attributi.
  • L'ultimo elemento porta aria-current="page" e non è un link verso sé stesso.
  • I separatori sono decorativi e non devono finire nel nome accessibile del link.

Un breadcrumb accessibile è un <nav> con un nome, una lista ordinata di link e aria-current="page" sull'ultimo elemento; il resto è ripetere la stessa gerarchia nel JSON-LD. Niente ruoli aggiunti, niente tabindex: la semantica arriva dagli elementi nativi.

La struttura minima

La lista ordinata non è un dettaglio: dice quante voci ci sono e in che ordine, e il lettore di schermo la annuncia come «lista di 3 elementi». Il nome sul nav distingue questa navigazione da quella principale quando l'utente apre l'elenco dei landmark.


  
    Home
    Components
    Accessibility
  

Tre dettagli che rompono

  • Separatori annunciati: un chevron come testo dentro il link entra nel nome accessibile. Usa ::before in CSS, oppure aria-hidden="true" sul separatore.
  • Ultimo elemento come link: un link verso la pagina in cui ti trovi è un controllo che non fa nulla. Testo semplice con aria-current="page".
  • Nomi generici: «Continua» o «Qui» non descrivono la destinazione e violano 2.4.4. Ogni voce deve avere senso letta da sola.

JSON-LD con la stessa gerarchia

Il dato strutturato BreadcrumbList deve descrivere le stesse voci, nello stesso ordine, con position che parte da 1. Se la pagina visibile e il JSON-LD divergono, il markup è una dichiarazione falsa: meglio nessun dato strutturato. Il formato completo, con i controlli, è in BreadcrumbList senza errori.

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" },
    { "@type": "ListItem", "position": 2, "name": "Components", "item": "https://example.com/components" },
    { "@type": "ListItem", "position": 3, "name": "Accessibility" }
  ]
}

Il catalogo EneUI

Il record verificato è breadcrumb-01 di flx, descritto come «link con pagina corrente e separatori a chevron»: è il caso della pagina, con la dipendenza di registry breadcrumb e nessun pacchetto esterno. Le altre viste sono in navigazione e accessibilità. Controllo eseguito il 1 novembre 2026 sul catalogo da 111.985 componenti.

La limitazione

Il breadcrumb orienta, non sostituisce il titolo della pagina né una struttura di URL leggibile, e non serve a chi arriva da una ricerca: quella persona entra a metà gerarchia e non ha percorso. Su un sito con due livelli la lista aggiunge rumore; su uno con cinque livelli comprimerla su mobile è necessario, ma il livello corrente deve restare visibile.

Dove continuare

La distinzione fra ruoli, stati e proprietà è in che cos'è ARIA; la checklist per i componenti è in componenti React accessibili. Se confronti primitive headless per costruire la navigazione, leggi Radix, Base UI e React Aria.

Domande frequenti

Serve aria-label sul nav del breadcrumb?

Sì, quando in pagina c'è più di un nav. Il nome «Breadcrumb» o «Percorso» distingue questa navigazione da quella principale nell'elenco dei landmark.

L'ultimo elemento deve essere un link?

No. È la pagina corrente: testo semplice con aria-current="page", oppure un link con lo stesso attributo se vuoi mantenerlo cliccabile.

I separatori vanno letti dallo screen reader?

No. Mettili in CSS con ::before o nascondili con aria-hidden="true": una barra o un chevron annunciato dopo ogni voce rende la lista illeggibile.

Il breadcrumb è obbligatorio per WCAG?

No, nessun criterio lo impone. Se c'è, deve rispettare 1.3.1, 2.4.4 e 4.1.2 come qualsiasi altra navigazione.

Devo mostrare tutti i livelli su mobile?

No, puoi comprimere i livelli intermedi, ma il primo e l'ultimo restano visibili: senza il livello corrente la persona perde il punto in cui si trova.