accesskey
Acquista il libro su Apogeonline
Google

Blocco delle donazioni

Se preferisci, puoi saltarlo.

Info sulle donazioni

La traduzione delle Specifiche HTML 4 e CSS 2, i forum accessibili, le guide e gli scritti tecnici, gli articoli di divulgazione scientifica e le recensioni di libri del blog Il Pesa-Nervi e, da ultimo, la pubblicazione integrale del libro recentissimo Accessibilità Guida completa: la realizzazione e la pubblicazione su Diodati.org, a partire dal 2001, di questi materiali ha richiesto e richiede enormi quantità di lavoro e di tempo non retribuiti.

Se pensi che Diodati.org sia una risorsa utile e vuoi aiutare il sito a vivere e a crescere, allora contribuisci con una donazione libera. Qualsiasi cifra, anche modesta, sarà un aiuto prezioso. E' possibile donare con Paypal, se iscritti, oppure con una qualsiasi carta di credito, seguendo le istruzioni che appaiono dopo aver premuto il pulsante "Fai una donazione".

Capitolo 8

Creare tabelle che si trasformino elegantemente

WCAG 1.0, linea guida 5. Garantire che le tabelle abbiano la necessaria marcatura per essere trasformate da browser accessibili e da altri programmi utente.

La linea guida 5 ha sei punti di controllo, due per ciascuna priorità.

Punto di controllo 5.1, priorità 1

Per le tabelle di dati, identificare le intestazioni di riga e colonna.

Si rivolge a: sviluppatori (tecnici del codice).

Una tabella di dati con false intestazioni

Le tabelle, generate in HTML dall’elemento TABLE, possono essere usate in due modi del tutto opposti: per incasellare dati tabellari (tabelle di dati) o per costruire griglie che servono per disporre i contenuti sulla pagina (tabelle d’impaginazione). L’uso proprio, raccomandato dalle Specifiche HTML, è il primo, ed è quello che tratteremo in questo e nei successivi paragrafi (per informazioni sull’uso improprio rimandiamo, invece, al paragrafo Tabelle d’impaginazione che non si trasformano elegantemente, più avanti in questo stesso capitolo).

Il modo più elementare per migliorare la comprensibilità di una tabella di dati, soprattutto per chi naviga in modalità non visuale, è identificare le celle d’intestazione, marcandole con l’opportuno elemento strutturale, che è TH.

Consideriamo un caso relativamente semplice: una tabella che elenca le regioni e le province italiane, associando a ciascuna regione le relative province. Per rendere la tabella graficamente più interessante, il grafico ha però previsto che i nomi di regione siano alternativamente alla sinistra o alla destra del nome delle relative province.

Per brevità, il Listato 8.1 riporta il codice di marcatura relativo a due sole regioni, il Lazio e la Campania. I nomi delle regioni e le celle di appartenenza sono messi in evidenza solo graficamente attraverso i fogli di stile del Listato 8.2, ma semanticamente non c’è alcuna differenza tra le celle: sono tutte marcate con l’elemento TD. I capoluoghi di regione, Roma e Napoli, sono a loro volta messi in evidenza con il grassetto, tramite l’attributo di presentazione B.

Listato 8.1 Una tabella di dati senza distinzione tra celle di dati e celle d’intestazione.

<table>

<tr>

<td rowspan="5">Lazio</td>

<td>Frosinone</td>

</tr>

<tr><td>Latina</td></tr>

<tr><td>Rieti</td></tr>

<tr><td><b>Roma</b></td></tr>

<tr><td>Viterbo</td></tr>

<tr>

<td>Avellino</td>

<td rowspan="5">Campania</td>

</tr>

<tr><td>Benevento</td></tr>

<tr><td>Caserta</td></tr>

<tr><td><b>Napoli</b></td></tr>

<tr><td>Salerno</td></tr>

</table>

L’attributo rowspan serve per distendere una singola cella sullo spazio occupato da più colonne. Sull’uso di questo attributo, in congiunzione con celle che si espandono su più righe (tramite l’attributo colspan), si vedano anche i Listati 8.6 e 17.4.

Listato 8.2 Gli stili CSS applicati alla tabella del Listato 8.1.

table {

border: 2px solid #999;

font-family: arial,sans-serif;

}

td {

padding: .2em 1em;

border: 1px solid #aaa;

width: 7em;

}

td[rowspan] {

text-transform: uppercase;

text-align: center;

background-color: #efefef;

}

Il selettore td[rowspan] ha lo scopo di selezionare solo le celle che hanno un attributo rowspan. Le uniche due celle con questa caratteristica sono quelle che contengono i due nomi di regione. Ed ecco, dunque, che “Lazio” e “Campania” appaiono in caratteri maiuscoli, su sfondo grigio e con allineamento al centro, mentre le celle con i nomi delle province appaiono con i soli stili base impostati tramite il selettore td (larghezza della cella, bordo e spaziatura interna). L’aspetto grafico della tabella così formattata è visibile in Figura 8.1 A e dà l’idea di una struttura chiaramente comprensibile, data la netta differenza di formattazione tra i nomi di regione e i nomi delle relative province.

Tutta la chiarezza, però, scompare, non appena si linearizza la tabella e si tolgono gli stili, come mostrato nella Figura 8.1 B. Quest’ultima è la modalità di fruizione seriale tipica degli screen reader. Il nome della regione Campania finisce tra i nomi delle province Avellino e Benevento e, non avendo alcun rilievo particolare, né di posizione né di altro tipo, perde del tutto la funzione di intestazione che svolgeva con chiarezza nella vista grafica della tabella.

Diventa allora indispensabile, se si vuole garantire accessibilità alle tabelle di dati per gli utenti che navigano in modalità non grafica, prendere una serie di accorgimenti, che consentano di compensare l’impossibilità di vedere direttamente le relazioni tra le celle. Marcare con elementi TH le celle d’intestazione, cioè quelle celle che contengono le informazioni di riferimento per altre celle o altri gruppi di celle che fanno parte della stessa tabella, è il primo e più semplice accorgimento per l’accessibilità delle tabelle (vedremo in seguito quali sono gli altri accorgimenti).

Figura 8.1 Aspetto grafico della tabella prodotta applicando gli stili del Listato 8.2 al codice di marcatura del Listato 8.1 (A); la stessa tabella linearizzata, senza stili né formattazione (B).

Inizio pagina

Salta inserzione pubblicitaria

Metodi per riconoscere le celle d’intestazione

In una tabella di dati, le celle d’intestazione occupano solitamente la prima riga dall’alto e/o la prima colonna a sinistra (almeno nei paesi in cui si scrive da sinistra a destra, come in Italia, Europa Occidentale e America), ma può darsi il caso di tabelle di dati più complesse, con righe o colonne d’intestazione inserite anche nel mezzo della tabella. La posizione della cella, dunque, come mostra la tabella in Figura 8.1, non sempre garantisce della sua funzione.

Sorge a questo punto un problema per gli sviluppatori: come fare a riconoscere in una tabella quali sono le celle d’intestazione, così da poterle marcare opportunamente?

Di solito una cella d’intestazione è riconoscibile perché rappresenta il genere di una specie, ovvero la categoria sotto la quale vengono catalogati gli individui o gli oggetti che fanno parte della medesima riga o colonna (o del gruppo di righe o di colonne coperto dalla medesima cella d’intestazione). Se una colonna è intitolata, per esempio, “fiori”, gli oggetti che ne formano il contenuto saranno “rosa”, “margherita”, “giglio”, “orchidea” ecc., ma non “cane”, “gatto”, “topo” o “automobile”. In HTML e XHTML, la cella che contiene la parola “fiori” andrebbe marcata con TH, mentre quelle che contengono i nomi dei singoli fiori andrebbero marcate con TD. Se poi “cane” e “gatto” fossero nella stessa colonna di “fiori”, saremmo molto probabilmente in presenza di un errore di composizione della tabella.

La tabella di Figura 8.1 A contiene relazioni del tipo genere/specie: i nomi delle regioni sono generi (o contenitori), cioè oggetti più generali, rispetto ai nomi delle province, i quali sono specie (o contenuti) rispetto alle regioni. In virtù di tale relazione, le celle che contengono i nomi “Lazio” e “Campania” avrebbero dovuto essere inseriti in celle TH invece che in celle TD.

La relazione categoria/oggetto (o genere/specie o, anche, contenitore/contenuto) non è l’unica possibile tra celle d’intestazione e celle di dati. Un’altra relazione, più complessa, è quella che si sviluppa su due assi: proprietà/valore e oggetto/valore.

Immaginiamo una tabella che metta a confronto due o più frutti, valutandoli in base alle caratteristiche nutrizionali (per esempio, calorie, minerali, vitamine ecc.). I nomi delle caratteristiche nutrizionali rappresentano le proprietà nella relazione proprietà/valore; i nomi dei frutti rappresentano, invece, gli oggetti, nella relazione oggetti/valori. Ogni singolo valore nutrizionale ha significato solo in base a una duplice relazione: con la proprietà (la caratteristica nutrizionale), da un lato, e con l’oggetto (il frutto) dall’altro. In questa duplice relazione, le celle che contengono i nomi delle caratteristiche nutrizionali e i nomi dei frutti sono tutte celle d’intestazione, cioè elementi TH, mentre le celle che contengono i valori nutrizionali sono tutte celle di dati (elementi TD).

La tabella in Figura 8.2 esemplifica i due tipi di relazione appena descritti. Questo modello può essere utilizzato per identificare le celle da marcare con l’elemento TH in un’infinita serie di tabelle, basate sulla duplice relazione proprietà/valore, oggetto/valore. La disposizione delle proprietà in riga e degli oggetti in colonna non è tassativa: ha senso anche la dislocazione inversa, con gli oggetti in riga e le relative proprietà in colonna.

Figura 8.2 Ogni cella di dati (elemento TD) nella tabella qui raffigurata contiene un valore, che è in relazione con una proprietà e un oggetto. I nomi di proprietà e i nomi di oggetto corrispondono alle celle d’intestazione (elementi TH).

[Inizio approfondimento] Analogia tra tabelle di database e tabelle di dati HTML

Per chi ha esperienza di database, può essere utile paragonare una cella d’intestazione in una tabella di dati HTML al nome di una colonna in una tabella di database o, anche, al nome identificativo di un record. [Fine approfondimento]

Inizio pagina

Celle che agiscono come intestazione e come dati

È importante precisare che le celle d’intestazione possono stratificarsi su più livelli. È possibile, cioè, che una o più celle d’intestazione siano, a loro volta, specie di un genere. Se, per esempio, riuniamo sotto la categoria “Minerali” le voci “Ferro”, “Calcio” e “Fosforo” della tabella in Figura 8.2, avremo un nuovo livello di intestazione, più generale.

Per quanto riguarda la marcatura, però, queste celle non saranno tutte TH. C’è, infatti, un’indicazione nelle DTD strict e transitional di HTML 4.01, che impone agli sviluppatori – ricordiamo che le DTD sono documenti normativi – di marcare con TD le celle che agiscono, allo stesso tempo, come celle di dati e celle d’intestazione (TH is for headers, TD for data, but for cells acting as both use TD). Pertanto, le voci raccolte sotto l’etichetta collettiva “Minerali” rimangono intestazioni per quanto riguarda i valori numerici già marcati con TD, ma diventano celle di dati rispetto all’intestazione “Minerali”: in presenza di una situazione come quella illustrata in Figura 8.3 vanno perciò marcate non più con TH, ma con TD.

Figura 8.3 Due livelli logici di intestazione correlati da una relazione genere/specie.

Come distinguere, allora, il ruolo d’intestazione di una cella marcata con TD? Per mezzo di appositi attributi, che saranno descritti nei commenti ai punti di controllo 5.2 e 5.3.

Inizio pagina

Punto di controllo 5.2, priorità 1

Per le tabelle di dati che hanno due o più livelli logici di intestazioni di riga o di colonna, usare la marcatura per associare celle di dati e celle d’intestazione.

Si rivolge a: sviluppatori (tecnici del codice).

Uso dell’attributo scope

Come abbiamo detto, marcare con TH le celle d’intestazione è solo il primo passo verso una completa accessibilità delle tabelle di dati. Ma perché non basta l’uso di TH? In realtà, per le tabelle più semplici, basta e avanza (lo screen reader JAWS, per esempio, considera le celle della prima riga e della prima colonna di una tabella come celle d’intestazione, anche in mancanza di una marcatura specifica). Diventa però insufficiente, quando possono sorgere ambiguità su quale sia il gruppo di celle per il quale una cella TH funge da intestazione. Cosa impedirebbe, per esempio, di considerare la cella “Lazio” della Figura 8.1 A come intestazione per le cinque celle che si trovano sotto di essa invece che per le cinque celle alla sua destra? Inoltre le celle d’intestazione possono essere stratificate su più livelli (Figura 8.3) oppure possono valere per un numero di celle inferiore all’intera lunghezza di una riga o di una colonna o, ancora, possono avere relazioni con celle che si trovano in righe o colonne differenti.

Occorre allora, dovunque un’ambiguità sia possibile, aiutare le tecnologie assistive a fare le giuste associazioni, specificando per mezzo della marcatura quali sono precisamente le relazioni tra celle d’intestazione e celle di dati.

In base alle specifiche W3C il metodo più semplice per chiarire l’estensione del campo di applicazione di una cella d’intestazione è usare l’attributo scope, parola inglese che significa, appunto, “portata”, “ambito”, “raggio d’azione”. Sono quattro i valori possibili di scope:

  1. row – indica che la cella corrente fornisce informazioni d’intestazione per il resto della riga di cui fa parte;
  2. col – la cella corrente fornisce informazioni d’intestazione per il resto della colonna di cui fa parte;
  3. rowgroup – la cella corrente fornisce informazioni d’intestazione per il resto del gruppo di righe di cui fa parte;
  4. colgroup – la cella corrente fornisce informazioni d’intestazione per il resto del gruppo di colonne di cui fa parte.

Passiamo dalla teoria alla pratica, applicando l’attributo scope alla tabella di Figura 8.2. Vi aggiungeremo, però, nello spazio vuoto in alto a sinistra, una nuova cella d’intestazione, contenente la voce “Frutti”. Senza l’uso di un metodo per associare le celle tra loro, non è possibile sapere se il campo d’applicazione di questa cella è la riga di cui fa parte o la colonna (una cella non può valere come intestazione per la riga e, allo stesso tempo, per la colonna di cui rappresenta l’intersezione).

Listato 8.3 Uso di TH e scope nella tabella di Figura 8.2.

<table>

<tr>

<th scope="col">Frutti</th>

<th scope="col">Kilocal. x 100 g.</th>

<th scope="col">Ferro mg.</th>

<th scope="col">Calcio mg.</th>

<th scope="col">Fosforo mg.</th>

</tr>

<tr>

<td scope="row">Noci</td>

<td>582</td><td>2,6</td><td>131</td><td>238</td>

</tr>

<tr>

<td scope="row">Pere</td>

<td>41</td><td>0,3</td><td>6</td><td>11</td>

</tr>

<tr>

<td scope="row">Pesche</td>

<td>27</td><td>0,4</td><td>4</td><td>20</td>

</tr>

<tr>

<td scope="row">Pompelmo</td>

<td>26</td><td>0,3</td><td>17</td><td>16</td>

</tr>

<tr>

<td scope="row">Prugne</td>

<td>42</td><td>0,2</td><td>13</td><td>14</td>

</tr>

<tr>

<td scope="row">Uva</td>

<td>61</td><td>0,4</td><td>27</td><td>4</td>

</tr>

</table>

Si noti che l’inserimento dell’intestazione “Frutti” ha richiesto di trasformare le celle che contengono i nomi dei frutti da elementi TH a elementi TD: agiscono, infatti, allo stesso tempo da celle d’intestazione per la riga di cui fanno parte e da celle di dati per l’intestazione “Frutti”.

Figura 8.4 Le celle con scope="col" valgono come intestazioni per la colonna a cui appartengono, mentre quelle con scope="row" valgono per la riga.

La Figura 8.4 mostra graficamente le relazioni tra le celle della tabella.

Come dovrebbe essere letta una simile tabella da uno screen reader conforme alle Specifiche W3C? Premettendo a ogni cella di dati le celle d’intestazione che la contestualizzano. Per esempio:

pere, kilocal. × 100 g.: 41; pere, ferro mg.: 0,3; pere, calcio mg.: 6; pere, fosforo mg.: 11;

pesche, kilocal. × 100 g.: 27; pesche, ferro mg.: 0,4; pesche, calcio mg.: 4; pesche, fosforo mg.: 20; ecc.

In realtà le modalità di riproduzione delle tabelle marcate per l’accessibilità variano da uno screen reader all’altro e a seconda delle impostazioni scelte dall’utente, ma ciò che non dovrebbe mai mancare, in uno screen reader ben progettato, sono dei comandi per consentire all’utente di navigare tra le celle a propria discrezione e farsi leggere, all’occorrenza, tutte le informazioni d’intestazione di ogni singola cella. Tuttavia, il supporto per l’attributo scope è, in base alle prove che abbiamo svolto, molto carente. JAWS, per esempio, anche nelle versioni più recenti, non sembra in grado di rendere in modo appropriato le relazioni tra celle stabilite per mezzo di questo attributo, almeno in una tabella come quella di Figura 8.4, nella quale prendono il sopravvento le scelte automatiche del programma nel determinare le celle d’intestazione e l’ambito in cui agiscono.

Inizio pagina

Uso combinato degli attributi headers e id

Per le tabelle di dati più complesse, l’unico modo per creare associazioni inequivocabili tra celle d’intestazione e celle di dati consiste nell’usare gli attributi correlati headers e id.

Il funzionamento è il seguente. L’attributo id, in base alle DTD di HTML e XHTML, deve avere un valore unico per l’intero documento: non possono esistere due elementi con id uguale. Pertanto, inserire un attributo id con un dato valore in una cella d’intestazione rende quella cella unica e riconoscibile all’interno dell’intero documento. Tutte le celle di dati che dipendono da quella cella d’intestazione possono richiamarsi a quel valore di id per mezzo dell’attributo headers. Se, dunque, una cella ha un valore di headers uguale al valore di id di un’altra cella, per una tecnologia assistiva conforme significa che la seconda è una cella d’intestazione della prima e il suo contenuto dovrà, perciò, essere letto prima di quello della cella con l’attributo headers, in modo da rendere manifesta all’utente la relazione tra le due celle.

Il Listato 8.4 mostra un esempio ridotto all’essenziale di un simile meccanismo di associazione.

Listato 8.4 Associazione tra celle per mezzo degli attributi headers e id

<table>

<tr>

<th id="n">Nome</th>

<th id="c">Cognome</th>

</tr>

<tr>

<td headers="n">Giuseppe</td>

<td headers="c">Mazzini</td>

</tr>

</table>

Una tecnologia assistiva conforme dovrebbe leggere il contenuto delle due celle TD nel modo seguente: “nome: Giuseppe; cognome: Mazzini”.

Perché allora non usare il meccanismo di associazione tra headers e id per rendere accessibile la tabella del Listato 8.1? Le associazioni da inserire sono elementari, come mostra il Listato 8.5.

Listato 8.5 Uso di TH, id e headers, a modifica del codice nel Listato 8.1

<table>

<tr>

<th id="laz" rowspan="5">Lazio</th>

<td headers="laz">Frosinone</td>

</tr>

<tr><td headers="laz">Latina</td></tr>

<tr><td headers="laz">Rieti</td></tr>

<tr><td headers="laz">Roma</td></tr>

<tr><td headers="laz">Viterbo</td></tr>

<tr>

<td headers="cam">Avellino</td>

<th id="cam" rowspan="5">Campania</th>

</tr>

<tr><td headers="cam">Benevento</td></tr>

<tr><td headers="cam">Caserta</td></tr>

<tr><td headers="cam">Napoli</td></tr>

<tr><td headers="cam">Salerno</td></tr>

</table>

Purtroppo una simile tabella non sarà veramente accessibile perché ha un solo livello di intestazioni di riga e di colonna. In un caso simile, prende il sopravvento nello screen reader, a meno di non modificare le sue impostazioni predefinite, il meccanismo di attribuzione automatica del ruolo di intestazione di riga alla prima cella disponibile della prima colonna. Ciò fa sì che “Avellino”, invece di “Campania”, sia considerata impropriamente la cella d’intestazione del secondo blocco, anche in presenza di una marcatura come quella del Listato 8.5. Tuttavia il codice di questo listato ci è servito come un primo approccio per “scaldare i muscoli”, in vista dell’esempio ben più complesso che esamineremo tra breve.

Prima, però, dobbiamo aggiungere un paio di informazioni. Innanzitutto, una cella di dati può essere collegata a più di una cella d’intestazione. Per esempio, il valore 2,6 nella tabella riprodotta in Figura 8.2 dipende dalle celle d’intestazione “Ferro mg.” e “Noci”. In tal caso, il valore dell’attributo headers deve riportare i valori di id di entrambe le celle d’intestazione da cui dipende. Un attributo headers può contenere, infatti, più valori separati per mezzo di spazi, in base a quanto stabiliscono le Specifiche HTML 4.01.

Inoltre, dato che una cella può agire allo stesso tempo da cella d’intestazione e di dati, è possibile che essa contenga sia un attributo id sia un attributo headers.

È arrivato dunque il momento di mettere insieme tutte queste informazioni, proponendo un esempio di tabella di dati con vari livelli di celle d’intestazione e con relazioni tra le celle stabilite per mezzo dell’uso combinato degli attributi headers e id.

La tabella in Figura 8.5 è una versione più complicata del modello di tabella in Figura 8.2. In questa nuova tabella, ogni valore numerico ha un vero e proprio “albero genealogico”. Prendiamo un valore a caso: per esempio il 21,3 che si trova nella cella immediatamente a destra della cella “proteìne”. Se, per contestualizzarlo relativamente alla riga, basta fare riferimento appunto alla cella “proteìne”, per contestualizzarlo relativamente alla colonna non basta riferirlo soltanto a “magra”, che è la cella d’intestazione direttamente collegata al valore 21,3. Infatti, “proteine, magra: 21,3” non significa nulla, se letto fuori contesto. L’“albero genealogico” completo, relativamente alla colonna, è: carne > fresca > bovino > vitellone > magra. Dunque, per far capire a un ascoltatore che cosa rappresenta quel 21,3, è necessario che lo screen reader possa leggere in sequenza: “carne, fresca, bovino, vitellone, magra, proteìne: 21,3”. Analogamente, il valore 1725 nell’ultima cella in basso a destra può essere compreso e contestualizzato rispetto all’intera tabella solo se la sintesi vocale è in grado di leggere “carne, conservata, suino, prosciutto, cotto, kilojoules: 1725”.

Figura 8.5 Una tabella di dati con una complessa serie di relazioni tra celle d’intestazione e di dati e con numerose celle che agiscono sia come intestazione sia come dati.

La Figura 8.6 presenta il quadro d’insieme di tutte le relazioni tra le celle della tabella, definite per mezzo di attributi headers e id. Dato il loro numero, consigliamo al lettore di aiutarsi con la seguente legenda, che permette di decifrare l’”albero genealogico” di ciascuna cella:

In base a tale legenda, se una cella di dati contiene la sequenza di valori di headers C CF P FA CO PR, significa che lo screen reader, per contestualizzarne il contenuto, deve premettere alla lettura del valore della cella la lettura in sequenza delle intestazioni: “carne” (C), “fresca” (CF), “pollame” (P), “faraona” (FA), “coscia” (CO), “proteine” (PR).

Il Listato 8.6 riporta il codice di marcatura della tabella in Figura 8.5. I contenuti messi in evidenza col grassetto saranno analizzati nel paragrafo successivo. L’uso degli elementi THEAD e TBODY verrà descritto nel Capitolo 17. L’attributo summary, che compare nell’elemento TABLE, sarà trattato diffusamente nel commento al punto di controllo 5.5, più avanti in questo stesso capitolo (il simbolo --> nel Listato indica che il testo nel codice di marcatura va scritto di seguito, anche se nella pagina stampata va a capo).

Figura 8.6 La tabella è la stessa di Figura 8.5, solo che in ogni cella, al posto del contenuto testuale, sono riportati i valori degli attributi id e headers usati nel codice di marcatura. Le celle corrispondenti ai valori nutrizionali degli alimenti (quelle su sfondo bianco), essendo prive di attributo id, riportano solo il contenuto dell’attributo headers.

Listato 8.6 Associazione tra celle mediante id e headers in una tabella di dati complessa

<table border="1" cellpadding="0" cellspacing="0"

summary="La tabella contiene i valori nutritivi -->

(protìdi, lipìdi, glucìdi, kilocalorìe e kilojoules) -->

di una serie di alimenti di carne, suddivisi in varie -->

categorie e sottocategorie (per esempio: carne fresca -->

e conservata; sotto carne fresca: bovino e pollame; -->

sotto bovino: vitellone e bovino adulto; e così via).">

<caption>Composizione chimica e valore energetico degli alimenti

(per 100 <abbr title="grammi">g.<abbr>)</caption>

<thead>

<tr>

<th rowspan="5"></th>

<th colspan="13" id="c">Carne</th>

</tr>

<tr>

<td colspan="8" id="cf" headers="c">fresca</td>

<td colspan="5" id="cc" headers="c">conservata</td>

</tr>

<tr>

<td colspan="6" id="b" headers="c cf">bovino</td>

<td colspan="2" id="p" headers="c cf">pollame</td>

<td colspan="5" id="s" headers="c cc">suino</td>

</tr>

<tr>

<td colspan="3" id="vi" headers="c cf b">vitellone</td>

<td colspan="3" id="ba" headers="c cf b">adulto</td>

<td colspan="2" id="fa" headers="c cf p">faraona</td>

<td colspan="2" id="sa" headers="c cc s">salsiccia</td>

<td colspan="3" id="pt" headers="c cc s">prosciutto</td>

</tr>

<tr>

<td id="m1" headers="c cf b vi">magra</td>

<td id="s1" headers="c cf b vi">semigrassa</td>

<td id="g1" headers="c cf b vi">grassa</td>

<td id="m2" headers="c cf b ba">magra</td>

<td id="s2" headers="c cf b ba">semigrassa</td>

<td id="g2" headers="c cf b ba">grassa</td>

<td id="pe" headers="c cf p fa">petto</td>

<td id="co" headers="c cf p fa">coscia</td>

<td id="fr" headers="c cc s sa">fresca</td>

<td id="se" headers="c cc s sa">secca</td>

<td id="cr" headers="c cc s pt">crudo</td>

<td id="cm" headers="c cc s pt">crudo magro</td>

<td id="ct" headers="c cc s pt">cotto</td>

</tr>

</thead>

<tbody>

<tr>

<th id="pr">Proteìne</th>

<td headers="c cf b vi m1 pr">21,3</td>

<td headers="c cf b vi s1 pr">19,1</td>

<td headers="c cf b vi g1 pr">18,1</td>

<td headers="c cf b ba m2 pr">20,7</td>

<td headers="c cf b ba s2 pr">18,8</td>

<td headers="c cf b ba g2 pr">15,8</td>

<td headers="c cf p fa pe pr">25,1</td>

<td headers="c cf p fa co pr">24,3</td>

<td headers="c cc s sa fr pr">14,3</td>

<td headers="c cc s sa se pr">22,0</td>

<td headers="c cc s pt cr pr">22,2</td>

<td headers="c cc s pt cm pr">28,6</td>

<td headers="c cc s pt ct pr">21,1</td>

</tr>

<tr>

<th id="li">Lipìdi</th>

<td headers="c cf b vi m1 li">3,1</td>

<td headers="c cf b vi s1 li">9,3</td>

<td headers="c cf b vi g1 li">14,6</td>

<td headers="c cf b ba m2 li">5,1</td>

<td headers="c cf b ba s2 li">15,4</td>

<td headers="c cf b ba g2 li">29,2</td>

<td headers="c cf p fa pe li">0,7</td>

<td headers="c cf p fa co li">1,8</td>

<td headers="c cc s sa fr li">30,8</td>

<td headers="c cc s sa se li">47,3</td>

<td headers="c cc s pt cr li">31,2</td>

<td headers="c cc s pt cm li">11,5</td>

<td headers="c cc s pt ct li">36,4</td>

</tr>

<tr>

<th id="gl">Glucìdi</th>

<td headers="c cf b vi m1 gl">0</td>

<td headers="c cf b vi s1 gl">0</td>

<td headers="c cf b vi g1 gl">0</td>

<td headers="c cf b ba m2 gl">0</td>

<td headers="c cf b ba s2 gl">0</td>

<td headers="c cf b ba g2 gl">0</td>

<td headers="c cf p fa pe gl">0</td>

<td headers="c cf p fa co gl">0</td>

<td headers="c cc s sa fr gl">0</td>

<td headers="c cc s sa se gl">0</td>

<td headers="c cc s pt cr gl">0</td>

<td headers="c cc s pt cm gl">0</td>

<td headers="c cc s pt ct gl">0</td>

</tr>

<tr>

<th id="kc"><abbr title="kilocalorìe">Kcal.</abbr></th>

<td headers="c cf b vi m1 kc">113</td>

<td headers="c cf b vi s1 kc">160</td>

<td headers="c cf b vi g1 kc">204</td>

<td headers="c cf b ba m2 kc">129</td>

<td headers="c cf b ba s2 kc">214</td>

<td headers="c cf b ba g2 kc">330</td>

<td headers="c cf p fa pe kc">107</td>

<td headers="c cf p fa co kc">114</td>

<td headers="c cc s sa fr kc">334</td>

<td headers="c cc s sa se kc">514</td>

<td headers="c cc s pt cr kc">370</td>

<td headers="c cc s pt cm kc">218</td>

<td headers="c cc s pt ct kc">412</td>

</tr>

<tr>

<th id="kj"><abbr title="kilojoules">Kj.</abbr></th>

<td headers="c cf b vi m1 kj">473</td>

<td headers="c cf b vi s1 kj">670</td>

<td headers="c cf b vi g1 kj">854</td>

<td headers="c cf b ba m2 kj">540</td>

<td headers="c cf b ba s2 kj">896</td>

<td headers="c cf b ba g2 kj">1381</td>

<td headers="c cf p fa pe kj">448</td>

<td headers="c cf p fa co kj">477</td>

<td headers="c cc s sa fr kj">1398</td>

<td headers="c cc s sa se kj">2152</td>

<td headers="c cc s pt cr kj">1549</td>

<td headers="c cc s pt cm kj">913</td>

<td headers="c cc s pt ct kj">1725</td>

</tr>

</tbody>

</table>

Inizio pagina

Salta inserzione pubblicitaria

Accorgimenti per l’accessibilità delle tabelle di dati

La prima cosa da dire, commentando il codice del Listato 8.6, è che realizzare la marcatura di una tabella di questo tipo non è né breve né semplice. Affinché l’esito finale sia soddisfacente, è indispensabile controllare con certosina pazienza l’esatta corrispondenza tra gli id delle celle d’intestazione e gli headers delle celle di dati.

Inoltre, ha importanza anche l’ordine in cui sono elencati i valori dell’attributo headers, se sono più d’uno. Ascoltare “carne, fresca, bovino, vitellone, magra, proteìne: 21,3” è cosa diversa dall’ascoltare “carne, proteìne, bovino, fresca, magra, vitellone: 21,3”. La prima sequenza è significativa e comprensibile, la seconda no. Per ottenere un ordine di lettura corretto, è necessario inserire i valori di headers in una sequenza significativa.

[Inizio approfondimento] Il ruolo degli strumenti autoriali

Gli strumenti autoriali per scrivere codice HTML potrebbero dare una grossa mano agli sviluppatori, semplificando il processo di marcatura delle tabelle di dati per l’accessibilità: potrebbero fornire, per esempio, meccanismi visuali per creare in modo rapido e intuitivo associazioni tra celle di dati e celle d’intestazione, sollevando così gli sviluppatori dal compito lungo e difficile di scrivere manualmente le relazioni nel codice di marcatura. [Fine approfondimento]

Alla fine, però, tutto rimane affidato alla tecnologia assistiva utilizzata dall’utente: spetta a essa, infatti, decidere se riprodurre l’ordine delle intestazioni così come l’ha codificato lo sviluppatore, oppure secondo un ordine diverso, dipendente dai propri algoritmi interni.

Ciò premesso, l’uso di headers e id resta il primo e indispensabile accorgimento per l’accessibilità di una tabella di dati complessa come quella in Figura 8.5.

Tolto l’uso dell’attributo summary, che esamineremo nel commento al punto di controllo 5.5, un secondo accorgimento utile è l’uso dell’elemento CAPTION, che serve per generare una didascalia visibile per la tabella. Si veda sull’argomento anche il paragrafo Uso di CAPTION e dei raggruppamenti di righe e colonne, nel Capitolo 17.

Un terzo, e poco conosciuto, accorgimento per l’accessibilità – visibile nel codice del Listato 8.6 e anche in Figura 8.5 – è l’inserimento di accenti all’interno di alcune parole. Nella nostra tabella, accenti sono stati inseriti sulla “i” della penultima sillaba delle parole “proteìne”, “lipìdi”, “glucìdi” e “kilocalorìe” dopo aver constatato che, senza quegli accenti, la pronuncia dello screen reader utilizzato per le prove era sbagliata. Siccome tali parole svolgono nella tabella il ruolo di intestazioni, è importante che l’ascoltatore le capisca bene. Le sintesi vocali hanno la tendenza a leggere le parole del gergo tecnico-scientifico (e anche molte parole comuni) con accenti sbagliati; perciò, inserire gli accenti interni alle parole più difficili è un modo per aiutare il software a produrre una lettura corretta. Si tratta di un accorgimento non essenziale per l’accessibilità, ma che – in determinate circostanze – può rilevarsi senz’altro utile.

Un quarto accorgimento è l’uso dell’elemento ABBR per ottenere la lettura di “kilocalorìe” al posto della sigla kcal, e di “kilojoules” al posto della sigla kj (spesso è necessario usare delle sigle come intestazioni, per evitare l’eccessivo allargamento orizzontale della tabella, che è di per sé una causa di inaccessibilità). Purtroppo il contenuto esteso di ABBR (e di ACRONYM) non viene letto in modo predefinito dagli screen reader. Se l’utente è sufficientemente evoluto da abilitarne la lettura modificando le impostazioni di base del suo lettore di schermo, potrà ricevere l’informazione completa, altrimenti gli toccherà ascoltare sigle più o meno incomprensibili.

Il quinto e ultimo accorgimento, il più importante di tutti, è il test sul campo. Noi abbiamo verificato la reale accessibilità della tabella nel Listato 8.6, sottoponendola all’esame di un amico non vedente, Nunziante Esposito, membro della Commissione O.S.I. dell’Unione Italiana dei Ciechi e degli Ipovedenti collegamento esterno. Abbiamo chiesto a Esposito di navigare la tabella con uno screen reader e di rispondere alle tre domande seguenti:

  1. qual è il valore dei lipidi per la carne di bovino adulto magra?
  2. quante chilocalorie fornisce il petto della faraona?
  3. qual è l’apporto di proteine del prosciutto crudo magro?

Le sue testuali risposte sono state le seguenti:

  1. carne fresca bovino adulto magra lipidi: 5,1;
  2. carne fresca pollame faraona petto chilocalorie: 107;
  3. carne conservata suino prosciutto crudo magro proteine: 28,6.

Non solo i valori numerici forniti sono esatti per confronto con la Figura 8.5, ma la forma delle risposte ci dice senza ombra di dubbio che lo screen reader usato da Esposito ha reso, per ciascuna cella di dati, tutte le intestazioni del suo “albero genealogico”, e le ha rese nell’ordine corretto: il che era esattamente lo scopo che intendevamo raggiungere.

[Inizio approfondimento] Screen reader e tabelle: test comparativo e comandi da tastiera

Sulla tabella del Listato 8.6, Nunziante Esposito ha effettuato un test comparativo con varie versioni di JAWS, dal quale è risultato che le ultime versioni dello screen reader – la 6.20, la 7.10 e la 8.0 – leggono la serie completa delle intestazioni, così come attestato dalle tre risposte riportate più sopra. Le versioni precedenti, invece, cioè la 4.51 e la 5.10, leggono – spostandosi di cella in cella - solo l’intestazione nella riga immediatamente precedente il dato (per esempio: “magra: 5,1”). Tuttavia anche con le versioni più datate di JAWS è possibile ottenere, con appositi comandi, tutte le informazioni necessarie a comprendere le relazioni tra celle di dati e celle d’intestazione.

Per gli sviluppatori interessati a svolgere simili test, ecco tre comandi utili per navigare le tabelle di dati con JAWS:

1. Alt + Ctrl + frecce orizzontali: ci si sposta sulla riga corrente della tabella e la sintesi vocale legge le intestazioni di colonna e il dato della cella selezionata. A fine o inizio riga avvisa che la riga è terminata;

2. Alt + Ctrl + frecce verticali: ci si sposta lungo la colonna corrente; la sintesi legge le intestazioni di riga e il dato contenuto nella cella selezionata. A fine o inizio colonna, avvisa che la colonna è terminata.

3. Alt + Ctrl + 5 del tastierino numerico: legge sia le intestazioni di colonna che quelle di riga e il dato contenuto nella cella selezionata.

Esposito ha testato per completezza la stessa tabella anche con un altro screen reader, Window-Eyes (versione 5.5), che è risultato del tutto equivalente a JAWS, per quanto riguarda la completezza delle informazioni di intestazione fornite durante la navigazione tra le celle di dati. Le scorciatoie da tastiera utilizzabili con Window-Eyes sono le seguenti:

1. Ctrl + tasto più del tastierino numerico: attiva la modalità “tabella” stando all’interno di una tabella in una pagina HTML (viene letto il contenuto di summary, se presente);

2. Ctrl + tasto meno del tastierino numerico: disattiva la modalità “tabella”;

3. Ins + frecce direzionali: consente di spostarsi di cella in cella. Vengono lette automaticamente le intestazioni di riga e colonna, seguite dal dato contenuto nella cella selezionata. [Fine approfondimento]

Inizio pagina

[Inizio approfondimento] Economizzare il lavoro di marcatura

Chi ha letto tutte le spiegazioni e i listati sull’uso di headers e id può essersi spaventato, e giustamente, di fronte alla complessità del lavoro di marcatura necessario per rendere veramente accessibile una tabella di dati con molti livelli d’intestazione, come è quella in Figura 8.5. Fortunatamente, nella maggior parte dei casi il lavoro supplementare per l’accessibilità è di gran lunga più semplice e in certi casi può essere addirittura evitato.

Riportiamo, a tal proposito, ciò che scrive l’esperto di accessibilità Jim Thatcher, uno degli otto autori di Web accessibility. Web Standards and Regulatory Compliance collegamento esterno (Friendsof, New York, 2006, pag. 173): “In termini di spesa e carico di lavoro, implementare tabelle accessibili può essere un proposito dispendioso, ma la spesa può essere totalmente evitata con un’attenta progettazione dei dati tabellari. In una tabella di 10 righe e 10 colonne, una tabella irregolare richiede che tutte le 100 celle siano codificate in modo particolare. Quando la tabella è semplice, ma le intestazioni non si trovano nella prima riga o nella prima colonna, circa 20 celle devono essere marcate in modo speciale. Se le intestazioni sono nella prima riga e nella prima colonna, non è necessaria alcuna codifica particolare”.

Jim Thatcher si riferisce al comportamento predefinito dei principali screen reader e browser vocali: “JAWS, Window-Eyes e Home Page Reader leggeranno come intestazioni le celle della riga 1 e della colonna 1, anche quando non c’è alcuna marcatura specifica sulla tabella” (pag. 172 dello stesso libro). In altre parole, grazie all’attuale interpretazione delle tabelle da parte dei principali screen reader, è possibile non usare alcuna marcatura specifica per l’accessibilità delle tabelle, purché le celle d’intestazione occupino la prima riga e la prima colonna della tabella (ferma restando la necessità di marcare correttamente le celle con TH o TD, a seconda dei casi, in modo di distinguerle dal punto di vista semantico, così come richiede un uso di HTML e XHTML rispettoso delle Specifiche W3C).

Paradossalmente, proprio il tentativo di favorire l’accessibilità da parte degli screen reader rischia di rendere più inaccessibili le tabelle usate a scopo d’impaginazione: in simili tabelle, infatti, premettere alla lettura di una cella qualsiasi la lettura delle prime celle della colonna e della riga corrispondenti è inopportuno, perché potrebbe non esservi alcuna relazione tra i contenuti di tali celle. Purtroppo gli screen reader possono non essere in grado di capire da soli se la tabella che stanno leggendo è una tabella di dati o d’impaginazione (ecco, forse, un motivo in più per limitarsi all’uso delle prime). [Fine approfondimento]

Inizio pagina

[Inizio approfondimento] L’attributo axis, questo sconosciuto

Tra gli attributi che è possibile usare con TH e TD, le Specifiche HTML 4.01 elencano anche l’attributo axis, associato alla seguente spiegazione (http://www.w3.org/TR/html401/struct/tables.html#adef-axis collegamento esterno): “Quest’attributo può essere usato per posizionare una cella all’interno di categorie concettuali, che possono essere immaginate come formanti degli assi in uno spazio a enne dimensioni. I programmi utente possono fornire accesso a queste categorie (per esempio: l’utente può interrogare il programma utente per conoscere tutte le celle che appartengono a una data categoria; il programma utente può presentare una tabella in forma di sommario ecc.)”.

In altre parole, l’attributo axis serve per creare associazioni tra celle che non sono in relazione diretta tra loro, cioè che non hanno un rapporto intestazione/dati, gestibile per mezzo degli attributi visti nelle pagine precedenti (scope, headers, id).

La tabella del Listato 8.6 ci offre la possibilità di sperimentare l’uso di axis. Come appare chiaro dalla Figura 8.5, i dati della tabella sono ordinati in base a una gerarchia di categorie: carne fresca o conservata; tra le carni fresche, carni di bovino o di pollame; tra le carni di bovino, carni di vitellone o di bovino adulto, e così via. Le carni potrebbero essere ordinate, però, anche mediante altri criteri. Un possibile criterio di ordinazione generale è, per esempio, il contenuto di grassi di ogni tipo di carne, già usato parzialmente come sottocategoria per le carni di vitellone e di bovino adulto.

Mediante l’attributo axis possiamo così creare una relazione tra celle che non sono altrimenti collegate tra loro, usando come categoria concettuale comune proprio il contenuto di grassi delle carni. Il Listato 8.7 mostra in che modo.

Listato 8.7 Uso dell’attributo axis

.......

<tr>

<th></th>

<td id="m1" axis="carni magre"

headers="c cf b vi">magra</td>

<td id="s1" axis="carni semigrasse"

headers="c cf b vi">semigrassa</td>

<td id="g1" axis="carni grasse"

headers="c cf b vi">grassa</td>

<td id="m2" axis="carni magre"

headers="c cf b ba">magra</td>

<td id="s2" axis="carni semigrasse"

headers="c cf b ba">semigrassa</td>

<td id="g2" axis="carni grasse"

headers="c cf b ba">grassa</td>

<td id="pe" axis="carni magre"

headers="c cf p fa">petto</td>

<td id="co" axis="carni magre"

headers="c cf p fa">coscia</td>

<td id="fr" axis="carni grasse"

headers="c cc s sa">fresca</td>

<td id="se" axis="carni grasse"

headers="c cc s sa">secca</td>

<td id="cr" axis="carni grasse"

headers="c cc s pt">crudo</td>

<td id="cm" axis="carni magre"

headers="c cc s pt">crudo magro</td>

<td id="ct" axis="carni grasse"

headers="c cc s pt">cotto</td>

</tr>

......

Sfruttando le informazioni contenute nel valore di axis, un browser evoluto potrebbe fornire all’utente innanzitutto l’informazione che vi sono nella tabella delle relazioni non visibili; in secondo luogo potrebbe consentire all’utente di esaminare tali relazioni, presentandole, per esempio, in un’apposita finestra di dialogo come voci selezionabili; in terzo luogo, cosa più importante, potrebbe creare delle viste semplificate della tabella (un po’ come fanno i programmi per database in risposta alle interrogazioni), presentando all’utente solo le celle (o le colonne, o le righe) che appartengono alla categoria concettuale prescelta: solo i dati nutrizionali relativi alle carni grasse, o solo quelli relativi alle carni magre, e così via. È facile immaginare la grande utilità che avrebbe un simile meccanismo di selezione, nel semplificare e rendere più fruttuosa la lettura di tabelle particolarmente lunghe e complesse.

Purtroppo né i browser né le tecnologie assistive supportano compiutamente l’uso di axis. Tra gli screen reader, JAWS fornisce una forma di supporto per questo attributo, ma nulla di paragonabile al meccanismo di selezione dei contenuti che abbiamo ipotizzato nelle righe precedenti. JAWS si limita infatti a presentare i contenuti di axis come una sorta di ulteriore livello d’intestazione, la cui lettura viene premessa alla lettura del contenuto della cella in cui l’attributo è utilizzato. È meglio di niente, ma non ci sembra, comunque, un’interpretazione corretta della destinazione d’uso dell’attributo, conforme al testo delle Specifiche HTML 4.01. [Fine approfondimento]

Inizio pagina

Punto di controllo 5.3, priorità 2

Non usare le tabelle a scopo d’impaginazione, a meno che non abbiano senso quando linearizzate. Altrimenti, se la tabella non ha senso, fornire un’alternativa equivalente (che può essere una versione linearizzata).

Si rivolge a: sviluppatori (tecnici del codice).

Tabelle d’impaginazione che non si trasformano elegantemente

Una tabella d’impaginazione (layout table) non serve per incasellare dati di natura realmente tabellare, come un indirizzario o un calendario mensile. Serve per posizionare in punti specifici della pagina dei pezzi di contenuto, secondo una disposizione che risponde a una sua logica (estetica o contenutistica), che non è, però, quella della relazione diretta, orizzontale e verticale, tra i dati inseriti nelle celle.

La tabella d’impaginazione è in sostanza una griglia, una sorta di rastrelliera virtuale alla quale attaccare, nella posizione che si ritiene più comoda o gradevole, i vari pezzi che compongono il puzzle di contenuti di un documento o di una sua parte. Così come a una rastrelliera fisica è possibile attaccare degli oggetti – per esempio cappelli, ombrelli, biciclette ecc. – in una qualsiasi posizione libera, senza che vi sia necessità di rispettare un ordine particolare, allo stesso modo nella rastrelliera virtuale di una tabella d’impaginazione si possono inserire dati che non hanno nessun rapporto reciproco diretto e vincolato dalla sequenza.

L’ordine e la coerenza dei dati inseriti in una tabella d’impaginazione non derivano dall’ordine logico e sequenziale delle celle, ma dall’aspetto grafico con cui la tabella e i suoi contenuti sono formattati: è per questa ragione che l’uso delle tabelle a scopo d’impaginazione è considerato a rischio per l’accessibilità. È possibile, infatti, che ciò che appare sensato alla vista, non lo sia affatto quando viene fruito in modalità testuale o attraverso uno screen reader.

Come verificare la sensatezza e la coerenza dei dati inseriti in una tabella d’impaginazione? È possibile farlo per mezzo di un procedimento chiamato linearizzazione (o serializzazione).

Consiste nell’estrarre i dati da una tabella, partendo dalla prima cella in alto a sinistra e continuando verso destra e verso il basso, fino a quando non si è raggiunta l’ultima cella in basso a destra (per le lingue che si scrivono da destra a sinistra, il procedimento va invertito, partendo dalla prima cella in alto a destra, invece che dalla prima a sinistra). I blocchi di dati estratti dalle celle vanno inseriti, nello stesso ordine in cui sono estratti, in una serie di paragrafi o di punti elenco successivi: tante sono le celle della tabella, tanti saranno i paragrafi o i punti elenco generati. La lettura sequenziale dei contenuti estratti dirà chiaramente se la tabella linearizzata ha senso, come richiede il punto di controllo 5.3, oppure no.

Figura 8.7 Rappresentazione grafica del processo di linearizzazione di una tabella: si comincia a estrarre i dati dalla cella 1 e si finisce con la cella 12.

Ma perché la linearizzazione rende conto dell’accessibilità di una tabella d’impaginazione? Il motivo è che la lettura dei suoi contenuti da parte di un sintetizzatore vocale segue esattamente l’ordine seguito dalla linearizzazione: se i contenuti linearizzati hanno senso, avranno senso anche quando letti da un sintetizzatore vocale.

Un esempio aiuterà a capire quali sono le tabelle d’impaginazione che non hanno senso una volta linearizzate. Consideriamo una tabella come la seguente.

Tabella 8.1 Una tabella d’impaginazione che perde senso una volta linearizzata

Elementi grafici decorativi

Arte

Elementi grafici decorativi

Computer

Antiquariato, Architettura, Artigianato, Cinema, Danza, Fotografia, …

Acquisti, Aziende, E-book, Grafica, Hacking, Hardware, …

Elementi grafici decorativi

Scienza

Elementi grafici decorativi

Sport

Ambiente, Astronomia, Biologia,
Chimica, Fisica, Medicina, …

Allenamento, Arti marziali, Atletica, Attrezzatura, Ciclismo, Disabili, …

Questa tabella riproduce una struttura di presentazione visuale simile a quella usata, fino a qualche anno fa, da molti motori di ricerca organizzati a directory, contenenti cioè vasti cataloghi di collegamenti ad altri siti, suddivisi per categorie. Usando il procedimento di linearizzazione descritto in precedenza e non considerando gli elementi grafici decorativi, otteniamo la seguente sequenza di contenuti:

  1. Arte
  2. Computer
  3. Antiquariato, Architettura, Artigianato, Cinema, Danza, Fotografia, ...
  4. Acquisti, Aziende, E-book, Grafica, Hacking, Hardware, ...
  5. Scienza
  6. Sport
  7. Ambiente, Astronomia, Biologia, Chimica, Fisica, Medicina, …
  8. Allenamento, Arti marziali, Atletica, Attrezzatura, Ciclismo, Disabili, ...

In questo caso la relazione logica tra nome della categoria e contenuto viene persa con la linearizzazione: le voci “antiquariato” e “architettura” a quale categoria appartengono? E la voce “scienza” a quali contenuti rimanda? Come si capisce che è un’intestazione?

La precedente è, insomma, una tabella in cui la linearizzazione non produce una trasformazione elegante (graceful transformation) dei contenuti. Perciò, non dovrebbe essere usata in un documento che aspira a essere accessibile. Se proprio non si può fare a meno di inserire una tabella simile in una pagina web, dovrebbe essere accompagnata da una versione linearizzata accessibile, che può essere realizzata, per esempio, per mezzo di un elenco di definizioni.

Vale la pena di precisare, comunque, che, almeno negli ultimi tempi, è diventato piuttosto difficile trovare sul Web tabelle d’impaginazione che perdono significato in seguito alla linearizzazione. Per quanto, dunque, le tabelle continuino a essere utilizzate largamente in modo improprio (cioè per posizionare blocchi di contenuti e non per incasellare dati tabellari), tuttavia il danno reale per l’accessibilità, almeno nel caso della navigazione con sintesi vocali, è relativamente limitato.

Il danno vero provocato dalle tabelle d’impaginazione è quello inferto alla flessibilità dei contenuti in modalità grafica: le impaginazioni realizzate con tabelle sono rigide e mal si adattano alla fruizione con caratteri ingranditi o con dispositivi dallo schermo piccolo. Altro danno non trascurabile è quello prodotto dall’aumento, a volte sconsiderato, del peso e della complessità dei documenti, soprattutto quando abbondano le tabelle annidate e l’uso di elementi e attributi di presentazione.

[Inizio approfondimento] Tabelle miste

I lettori più attenti non avranno mancato di notare che nella Tabella 8.1 sono presenti delle relazioni intestazione/dato (per esempio Scienza/Ambiente, Astronomia ecc.). Perché allora l’abbiamo qualificata come tabella d’impaginazione? Il motivo è che la disposizione dei contenuti delle celle, comprese le immagini decorative, risponde a dei criteri di organizzazione visiva più che a dei criteri di organizzazione logica. Se la tabella fosse stata costruita sulla base di puri criteri logici, come una normale tabella di dati, tutte le celle assimilabili a un ruolo d’intestazione (Arte, Computer, Scienza, Sport) avrebbero dovuto trovarsi sulla stessa riga o sulla stessa colonna. Qualcosa di analogo vale anche per la tabella del Listato 8.1, in cui le intestazioni sono messe alternativamente nella prima o nella seconda colonna per mere esigenze estetiche, non logiche: ciò la rende una tabella mista e, soprattutto, una tabella poco accessibile alle tecnologie assistive, anche se la sua semplicità strutturale la rendeva adatta a illustrare il rapporto tra celle di dati e celle d’intestazione. [Fine approfondimento]

Inizio pagina

Punto di controllo 5.4, priorità 2

Se una tabella è usata a scopo d’impaginazione, non usare alcuna marcatura strutturale per ottenere effetti di formattazione visuale.

Si rivolge a: sviluppatori (tecnici del codice).

Non usare TH per le tabelle d’impaginazione

Il punto di controllo 5.4 ha lo scopo di evitare che una marcatura strutturale usata impropriamente possa confondere chi usa un sintetizzatore vocale, dandogli l’idea che vi siano tra i contenuti della tabella relazioni gerarchiche che potrebbero non sussistere.

Il caso tipico è l’uso dell’elemento TH per ottenere un effetto di testo in grassetto, allineato al centro della cella. Al posto di TH è consigliabile, ovviamente, usare le proprietà di formattazione dei fogli di stile (nel caso specifico, text-align: center per l’allineamento centrato e font-weight: bold per il grassetto).

Figura 8.8 In una tabella d’impaginazione non vi sono vere celle d’intestazione, perciò tutte le celle vanno marcate con TD, a differenza di quanto accade in una tabella di dati.

Inizio pagina

Punto di controllo 5.5, priorità 3

Fornire sommari per le tabelle.

Si rivolge a: sviluppatori (tecnici del codice).

Uso dell’attributo summary di TABLE

Nelle tecniche HTML per le WCAG 1.0 viene fornita la seguente spiegazione, per chiarire l’importanza del punto di controllo 5.5:

I sommari sono utili specialmente per chi legge in modalità non visuale. Un sommario delle relazioni fra le celle è importante soprattutto per tabelle con intestazioni annidate, celle che si espandono su colonne o righe multiple, o altre relazioni che possono non risultare ovvie dall’analisi della struttura della tabella, ma apparire evidenti in una riproduzione visuale della tabella. Un sommario può anche descrivere in che modo la tabella rientra nel contesto del documento in cui è inserita. Se non è presente una didascalia, è assolutamente fondamentale fornire un sommario.

Il sommario di una tabella viene fornito per mezzo dell’attributo summary dell’elemento TABLE. Per capire come impostare il valore di summary, può essere utile pensare al tipo di descrizione del contenuto della tabella che faremmo parlando al telefono con qualcuno a cui vogliamo spiegare ciò che stiamo vedendo.

Listato 8.8 Un esempio di sommario per una tabella di dati.

<table summary="Rubrica telefonica su cinque colonne. -->

Nelle prime due il cognome e il nome della persona; -->

nella terza l’indirizzo, nella quarta il numero -->

di telefono di casa, nella quinta il numero di -->

telefono dell’ufficio o del cellulare. -->

Possono esservi celle vuote.">

A proposito di questo punto di controllo, è sorta nel tempo una disputa tra gli sviluppatori: l’attributo summary deve essere inserito anche nelle tabelle d’impaginazione? E se sì, che testo deve recare?

Secondo alcuni, la scelta migliore sarebbe usare l’attributo e dargli come valore Tabella a scopo d’impaginazione, o qualcosa di simile: l’idea è quella di fornire all’utente che naviga in modalità non visuale la minima informazione necessaria, per capire che la tabella in cui si è imbattuto non contiene dati realmente tabellari. Un altro partito sostiene l’idea di non usare affatto summary nelle tabelle d’impaginazione, perché l’informazione fornita sarebbe inutilmente prolissa, secondo l’idea che agli utenti interessano solo i contenuti, e che siano rapidamente e comodamente fruibili, non le informazioni sul contenitore (cioè il codice di marcatura). Un terzo partito sostiene invece l’utilità, tutta legalistica, di avere un summary vuoto (summary=""), in modo da soddisfare almeno formalmente la richiesta del punto di controllo 5.5 e ottenere il superamento delle validazioni automatiche di accessibilità.

Gli estensori delle WCAG 2.0 sembrano intenzionati a risolvere il conflitto di vedute a monte, eliminando la presenza dell’attributo summary dal novero dei requisiti per la conformità alle linee guida. Tuttavia specificano che nelle tabelle a scopo d’impaginazione questo attributo deve essere o omesso o vuoto, risolvendo così la questione anche nel merito (si veda http://www.w3.org/TR/2006/WD-WCAG20-TECHS-20060427/Overview.html#F46 collegamento esterno).

[Inizio approfondimento] Chiarimento sulla mancanza di summary nei Listati 8.1 e 8.3

Le tabelle di dati mostrate nei Listati 8.1 e 8.3 avrebbero dovuto recare, per completezza, un attributo summary. È stato omesso per il solo motivo di procedere gradualmente nell’esposizione dei requisiti delle tabelle accessibili. Può essere un utile esercizio, per chi si avvicina all’accessibilità per la prima volta, provare a scrivere un attributo summary per le tabelle contenute nei due listati sopra indicati. [Fine approfondimento]

Inizio pagina

Salta inserzione pubblicitaria

Punto di controllo 5.6, priorità 3

Fornire abbreviazioni per le etichette delle celle d’intestazione.

Si rivolge a: sviluppatori (tecnici del codice).

Uso dell’attributo abbr di TH e TD

Uno screen reader con adeguato supporto per l’accessibilità deve essere in grado di premettere, alla lettura del contenuto di ciascuna cella di dati, la lettura del contenuto di tutte le celle d’intestazione che vi sono associate. Se una cella d’intestazione contiene un testo molto lungo, la sua lettura ripetitiva da parte di un sintetizzatore vocale rischia di diventare molto noiosa. Per abbreviare i tempi di lettura, il punto di controllo 5.6 suggerisce di impostare abbreviazioni per i contenuti di TH giudicati troppo lunghi, usando a questo scopo l’attributo abbr, come nell’esempio seguente.

Listato 8.9 Un esempio d’uso dell’attributo abbr in un elemento TH.

<th abbr="Percentuale maggiorenni">Percentuale di

maggiorenni rispetto al totale della popolazione</th>

Nella realtà quotidiana del Web, si verifica più facilmente il caso opposto: in una tabella che ha un ampio sviluppo orizzontale, è spesso necessario abbreviare i testi nelle celle d’intestazione, che devono poi essere resi accessibili fornendo la forma estesa delle abbreviazioni tramite elementi ABBR o ACRONYM, come è stato fatto nel Listato 8.6 per le sigle kcal. e kj.

Inizio pagina

Tasti di accesso rapido: Indice generale 0 | Capitolo precedente 1 | Capitolo successivo 2 | Glossario 3 | Indice analitico 4 | Torna a inizio pagina 5 | Diodati.org 6 | Forum accessibili 7 | Commenti dei lettori 8 | Recensioni e citazioni 9
Creative Commons License
Accessibilità Guida completa versione HTML by Michele Diodati is licensed under a Creative Commons Attribuzione-Non commerciale-Non opere derivate 2.5 Italia License.