Hai mai aperto un sito con lo screen reader sentendo solo “div, div, div, link, div”? Noi lo sentiamo spesso. E non è un errore di chi usa il lettore vocale: è un errore di chi ha scritto il codice. Quando un sito è tutto un <div> e un <span>, per uno screen reader è come leggere un libro senza capitoli, senza titoli, senza punteggiatura. La buona notizia? La soluzione è già dentro l’HTML5: si chiama markup semantico. E non costa nulla. Letteralmente. Zero euro di plugin, zero librerie extra. Solo usare i tag giusti. Noi, di Meteora Web, lavoriamo su questo ogni giorno: veniamo dalla contabilità e dai bilanci, e sappiamo che l’accessibilità non è un extra, è un investimento che riduce bounce rate, migliora la SEO e allarga il mercato. Partiamo dal problema concreto: il tuo sito è comprensibile a un robot? E a una persona non vedente? Se la risposta è “forse”, questa guida è per te.
Perché l’HTML Semantico è la Base dell’Accessibilità
Immagina di entrare in un negozio dove tutti i prodotti sono in scatole bianche senza etichette. Devi aprire ogni scatola per capire cosa c’è dentro. Frustrante, vero? Ecco, un sito senza markup semantico è esattamente così per chi usa tecnologie assistive (screen reader, comandi vocali, dispositivi a pulsante). I tag HTML5 come <nav>, <main>, <article>, <aside>, <header>, <footer> danno un significato alle sezioni della pagina. Non solo per i disabili: Google li usa per capire la struttura e rankare meglio. Lo abbiamo visto su clienti che passando a un markup semantico pulito hanno guadagnato posizioni senza fare backlinking.
Sponsored Protocol
Noi, di Meteora Web, quando prendiamo in mano un progetto vecchio, la prima cosa che controlliamo è la gerarchia dei titoli e i landmark ARIA impliciti. Spesso scopriamo che mancano <h1> o che ci sono cinque <h1> nella stessa pagina. Correggere queste cose non richiede ore di sviluppo, ma fa la differenza tra un sito che esclude e un sito che include.
Il Ruolo dei Landmark ARIA e dei Tag HTML5
I landmark ARIA (Accessible Rich Internet Applications) sono dei marcatori che dicono allo screen reader: “Ecco la navigazione”, “Ecco il contenuto principale”, “Ecco una sezione complementare”. La buona pratica è usare direttamente i tag HTML5, che hanno ruoli ARIA impliciti. Per esempio:
<nav> … </nav> // ruolo implicito “navigation”
<main> … </main> // ruolo implicito “main”
<aside> … </aside> // ruolo implicito “complementary”
Se per ragioni di design non puoi usare il tag esatto, puoi aggiungere il ruolo manualmente: <div role="navigation">. Ma meglio il tag nativo: è più pulito, più facile da manutenere, e non rischia conflitti con CSS o JavaScript futuri.
Errore comune: mettere tutto dentro <div> e poi aggiungere role="main" su un div. Funziona, ma è come usare il nastro adesivo per riparare un rubinetto: tiene, ma non è la soluzione giusta. Usa il tag <main> una sola volta per pagina.
Sponsored Protocol
Gerarchia dei Titoli: La Mappa della Pagina
I titoli (<h1> – <h6>) non servono solo a ingrandire il testo. Sono i capisaldi della navigazione per screen reader. L'utente può saltare da un titolo all’altro, come in un indice. Se la gerarchia è sbagliata (es. un <h3> dopo un <h1> senza un <h2> a metà), lo screen reader non può creare una struttura logica.
Regola pratica per la gerarchia
- Una e una sola
<h1>per pagina (di solito il nome del sito o il titolo della pagina). - Poi
<h2>per le sezioni principali. - Poi
<h3>per sottosezioni, e così via. - Non saltare livelli: non andare da
<h2>a<h4>senza un<h3>.
Esempio concreto preso da un nostro cliente e-commerce: la pagina prodotto aveva un <h1> con il nome del prodotto, poi direttamente un <h4> per “Descrizione”. Correggendo in <h2> per la sezione descrizione, lo screen reader ha potuto navigare meglio e il cliente ha visto un aumento del tempo medio sulla pagina. Non siamo sicuri sia un nesso causale diretto, ma di sicuro l’usabilità è migliorata.
Form: Label, Placeholder e Messaggi di Errore
I form sono spesso il punto più debole dell’accessibilità. Lo vediamo nei progetti che ci arrivano: campi senza <label>, placeholder usati come etichette, messaggi di errore che appaiono solo visivamente. Per uno screen reader, un campo senza label è come una porta senza maniglia: non sai cosa c’è dietro.
Sponsored Protocol
La regola è semplice: ogni <input>, <select>, <textarea> deve avere un <label> associato tramite l’attributo for o mettendo il campo dentro il <label>. Esempio:
<label for="email">Indirizzo email</label>
<input type="email" id="email" name="email" required>
E per i messaggi di errore, meglio collegarli con aria-describedby:
<input type="email" id="email" aria-describedby="email-error">
<span id="email-error" role="alert">Inserisci un indirizzo email valido</span>
Attenzione al placeholder: non usarlo come unica etichetta. Il placeholder scompare quando l’utente digita, e per chi ha problemi di memoria o usa screen reader diventa inaccessibile. Label sempre presente e visibile.
Immagini: Alt Text non è unOptional
L’attributo alt è il testo alternativo per chi non vede l’immagine. Non va lasciato vuoto a meno che l’immagine non sia puramente decorativa (in quel caso alt="" dice allo screen reader di ignorarla). Non va riempito con keyword a caso: descrivi ciò che l’immagine comunica di importante per il contesto. Esempio:
<!-- Immagine decorativa -->
<img src="decorativa.jpg" alt="">
<!-- Immagine informativa -->
<img src="grafico-vendite.png" alt="Grafico a barre delle vendite 2025 per trimestre: Q1 120k, Q2 150k, Q3 170k, Q4 200k">
Un errore che vediamo spesso: immagini linkate senza descrizione. Se un’immagine è un link, l’alt text deve descrivere la destinazione del link, non l’immagine. Esempio: <a href="/contatti"><img src="telefono.png" alt="Contattaci"></a>.
Sponsored Protocol
Bottoni e Link: Non confonderli
Un <button> serve per azioni (inviare un form, aprire un modale). Un <a> serve per navigare a un’altra pagina. Sembra banale, ma molti siti usano <div> cliccabili con JavaScript per fingere bottoni. Questo è un problema per gli screen reader perché non sanno che quell’elemento è interattivo. Usa sempre il tag nativo: <button> o <a> con href. Se devi usare un design custom, applica role="button" e gestisci la pressione del tasto Invio e Spazio con JavaScript.
Linguaggio e Ordine di Lettura
Specifica la lingua della pagina con l’attributo lang sull’elemento <html>:
<html lang="it">
Se una porzione di testo è in un’altra lingua, usa lang anche lì: <p lang="en">This is English</p>. Così lo screen reader sa quale sintesi vocale usare.
Inoltre, l’ordine di lettura deve corrispondere all’ordine visivo. Non usare CSS per riordinare visivamente elementi che nell’HTML sono in ordine opposto: lo screen reader segue l’ordine DOM. Verifica con strumenti come il validatore W3C o l’estensione Axe.
Sponsored Protocol
Checklist Immediata per il Tuo Sito
Prendi una pagina del tuo sito e verifica questi punti:
- Landmark: ci sono
<nav>,<main>,<header>,<footer>? - Titoli: un solo
<h1>e gerarchia senza salti? - Form: ogni campo ha un
<label>associato? Messaggi di errore leggibili? - Immagini: tutte le immagini informative hanno
altdescrittivo? Quelle decorative hannoalt=""? - Bottoni/Link: usi
<button>per azioni e<a>per link? - Lingua:
langsull’html e su blocchi in altre lingue?
Se hai anche un solo “no”, hai già un’opportunità di miglioramento.
In sintesi — Cosa fare adesso
L’HTML semantico è la base zero dell’accessibilità. Non serve un budget extra: serve conoscenza e disciplina. Noi di Meteora Web lo applichiamo in ogni progetto, dal piccolo sito vetrina alla piattaforma Laravel custom. Il consiglio concreto? Prendi la pagina più visitata del tuo sito, apri la console del browser (F12), scheda “Elementi”, e guarda la struttura. Vedi <div> dappertutto? Bene, hai il tuo compito per il weekend: sostituisci un <div class="nav"> con <nav>. Poi ripeti. Un passo alla volta, ma subito.
Per approfondire tutto il mondo WCAG, leggi la nostra Pillar Definitiva sull’Accessibilità Web.