Membro di PiperitaLab
Home » Teoria del web » Accessibilità » E’ giusto usare display:none per nascondere un div?

E’ giusto usare display:none per nascondere un div?

Scritto da il 8 maggio 2009 in Accessibilità, Xhtml e css - 23 Commenti - 53 visite

image accessibilita 205x300 E giusto usare display:none per nascondere un div?Risposta: no.

Ed è molto semplice capirlo. Il display:none elimina completamente l’elemento a cui è associato all’interno della pagina, come se non esistesse. Comprenderete che per uno screen reader questo non va bene, altrimenti perchè inserire l’elemento?

Tommaso ci spiega le due alternative da usare:

Nascondere un elemento con i CSS in modo accessibile

I problemi nell’utilizzo del display:none e le alternative possibili.

Nella realizzazione di un sito è ricorrente la necessità di nascondere elementi presenti nel codice HTML: basti pensare agli skip link o alle tecniche di image replacement. Ci sono diversi modi per farlo con i CSS, ma non tutti sono corretti.

Evitare il display:none

Un metodo diffuso, che però è sbagliato, è utilizzare display: none per nascondere totalmente la parte di codice desiderata. Questa tecnica è inaccessibile, perchè elimina l’elemento dalla pagina come se non esistesse. La maggior parte degli screen reader trovando un elemento con display: none lo salterà senza leggerlo.

Pensate all’intestazione di un sito ed ai link per facilitare la navigazione nascosti in questo modo: non facendoli leggere agli screen reader l’accessibilità della pagina viene compromessa.

Trovate anche un approfondimento sul comportamento degli screen reader in questo articolo di Roger Johansson.

La soluzione con position:absolute

La soluzione più semplice è utilizzare position: absolute invece di display: none:

.skip {
position: absolute;
left: -9999px;
}

In questo modo gli screen reader continueranno a leggere l’elemento nascosto. Per migliorare ulteriormente l’accessibilità della pagina con un occhio di riguardo alla navigazione da tastiera, è utile un’aggiunta del tipo:

.skip a:active, .skip a:focus {
position: absolute;
left: 1em;
}

Così usando il tasto tab per spostarsi tra i collegamenti della pagina, gli elementi nascosti appariranno quando selezionati.

L’alternativa: text-indent

Una soluzione alternativa per nascondere un elemento della pagina può essere la proprietà text-indent, con un valore negativo:

.skip {
text-indent: -9999px;
}

Questo metodo a volte viene usato per mantenere l’elemento contenitore nella pagina, facendo sparire solo il suo contenuto testuale. E’ da verificare nei vari casi il supporto dei browser, ma tutti quelli più importanti non dovrebbero avere problemi.

Testo nascosto con JavaScript

Un ultimo aspetto da considerare è la gestione di elementi della pagina che appaiono solo dopo un’azione dell’utente, usando JavaScript. E’ sbagliato nasconderli con i CSS: se questi elementi (ad esempio un menu a tendina) appaiono grazie a JavaScript, devono essere nascosti al caricamento della pagina secondo lo stesso principio.

La tecnica più semplice è usare JavaScript per assegnare una classe all’elemento desiderato e quindi nasconderlo (senza usare display: none!) tramite CSS.

E’ importante comprendere i problemi relativi al display: none descritti in questo articolo. Usandolo con cognizione di causa eviterete dei problemi ai vostri utenti: se conoscete altre soluzioni valide i commenti sono a vostra disposizione.

Libri da non perdere:
Amazon-Box creato da Giuseppe Frattura

L'Autore

Laura Gargiulo, webdesigner freelance. Web architect senior, esperta xhtml, css, usabilità, design, cms, webmarketing e Seo, Wordpress specialist. Membro del progetto di prossima pubblicazione Piperita Lab e dell'IWA Italy Visita il mio sito personale Lauryn.it e contattami pure per un preventivo gratuito.

homeSito personale|archiveArchivio autore

23 Commenti

  1. Manuxxon N (86 comments)
    Scritto il 8 maggio 2009 alle 09:05

    Giusto l’articolo, ma secondo me è sbagliato il comportamento degli screen reader che non dovrebbero leggere il foglio di stile per lo screen.
    Se io uso display:none nei css per il media screen uno screen reader dovrebbe ignorarlo.

  2. Lauryn (4189 comments)
    Scritto il 8 maggio 2009 alle 09:07

    manuxxon, è vero, è un comportamento anomalo questo, ma come per i browser ci dobbiamo adattare alle loro esigenze e bug, dobbiamo adattarci anche a questo ;)

  3. Cristian G. (3 comments)
    Scritto il 8 maggio 2009 alle 09:08

    Molto interessante perchè sono tra quelli che non sapeva di utilizzare una metodologia sbagliata (display:none).
    Dovrò ripassare un bel po di codice credo.

  4. Abruzzo Seo (16 comments)
    Scritto il 8 maggio 2009 alle 09:15

    Datosi che il più delle volte si vuole nascondere qualcosa perchè si spera di poter migliorare le “performance” della pagina in termini di inidicizzazione, la verà domanda è, a cosa serve mettere realmente elementi nascosti se questi non devono essere visibile per l’utente finale?

    Uno screen reader potrà leggere il contenuto come dici tu, ma cosa vorrei far leggere ad una persona affetta da problemi visivi che un utente normale non deve leggere?
    Il motore di ricerca, con display:none o con la tecnica suggerita, in ogni modo leggeranno il contenuto.

  5. Manuxxon N (86 comments)
    Scritto il 8 maggio 2009 alle 09:27

    Eh sì Lauryn, che dobbiamo fare, questo è un bel lavoro ma abbiamo le nostri croci da portare :)

  6. Giuseppe (39 comments)
    Scritto il 8 maggio 2009 alle 09:34

    …ovvero come trarre conclusioni sbagliate da un post ottimo :) Tommaso ha dato delle indicazioni chiare relative a casi precisi. Ha fornito alternative accessibili al display:none, ma non mi pare abbia detto che non va MAI usato!
    Il problema Lauryn sono le premesse ancora più a monte: “cosa c’è in quel div?”
    Ci sono casi in cui voglio che nessuno (nemmeno gli screen reader) leggano porzioni di codice, per esempio box a comparsa il cui contenuto ha senso solo dopo un’azione dell’utente.
    E in quel caso il diplay:none è più che legittimo… d’altra parte se no per cosa è stato inventato?? :)
    Ciao ciao

  7. Lauryn (4189 comments)
    Scritto il 8 maggio 2009 alle 09:36

    @abruzzo: hai perfettamente ragione, infatti è da valutare il motivo per cui si nasconde il testo…ovviamente se lo si nasconde per motivi seo lascia pure il display:none. metti invece che usi l’image replacement per il titolo h1, è utile che questo sia leggibile da uno screen reader e quindi il text-indent o il posizionamento assoluto sono d’obbligo :)

  8. Abruzzo Seo (16 comments)
    Scritto il 8 maggio 2009 alle 09:49

    @Lauryn se fai l’image replacement la puoi fare anche senza ricorrere ad un indent fuori bordi pagina. Metti uno span, con visibility: hidden e lo lasci li dove sta, senza per questo compromettere il layout sui browser che potebbero mal interpretare quel valore negativo.

  9. Lauryn (4189 comments)
    Scritto il 8 maggio 2009 alle 10:00

    visibility hidden non funge con l’image replacement, o sbaglio?

  10. Abruzzo Seo (16 comments)
    Scritto il 8 maggio 2009 alle 10:09

    Dipende da come lo fai.

  11. Cristian (90 comments)
    Scritto il 8 maggio 2009 alle 10:42

    Molto interessante..però sono d’accordo, ci sono casi magari non così frequenti in cui si vuole che quell’elemento si davvero non visibile, visto che la proprietà esiste.

    Per l’image replacement il text-indent non credo sia una tecnica, ma un piccolo trucchetto. Rende lo stesso il sito a rischio accessibilità. Se uno ha le immagini disabilitate (raro ma può essere) non vede nulla.

  12. Cristian G. (3 comments)
    Scritto il 8 maggio 2009 alle 12:45

    Giuseppe, se il tuo commento è rivolto a me non fraintendere, mi sono espresso male. E’ ovvio che si parla solo di contenuti che riguardano gli screen reader ed io lo ritenevo sottointeso.

  13. Giuseppe (39 comments)
    Scritto il 8 maggio 2009 alle 13:38

    No Cristian, non mi rivolgevo a te, intendevo dire che non si può concludere con un “no” assoluto a prescindere dal “cosa” si vuole nascondere, tutto qui

  14. Flavia (77 comments)
    Scritto il 10 maggio 2009 alle 22:19

    Cos’è a:focus ? Mi è nuova, sapevo dell’active, del visited e dell’hover…

  15. Lauryn (4189 comments)
    Scritto il 11 maggio 2009 alle 07:55

    @Flavia: il focus è lo stato che si attiva quando con il tab scorri i vari links. di solito come tipo di comportamento lo si associa all’active e all’hover, per renderlo più evidente.

    ci sono due ordini per elencarli, a seconda di quello che vuoi fargli fare:

    LVFHA : :link :visited :focus :hover :active : quando vuoi che focus si comporti come l’hover

    LVHFA : :link :visited :hover :focus :active : quando vuoi che il focus non si comporti come l’hover

    o viceversa, io puntualmente sbaglio sempre l’ordine :D

  16. Morgu3 (15 comments)
    Scritto il 18 maggio 2009 alle 17:13

    Uff, credevo che il display:none fosse infallibile :/
    Proprio ora ho provato un text-indent negativo ad uno span e Firefox 3.0.10 proprio non se lo fila. Ho provato con qualche accorgimento tipo misure fisse allo span/div ma nulla.. mi sa che torno al display:none

  17. Lauryn (4189 comments)
    Scritto il 18 maggio 2009 alle 17:55

    prova a dirci i dettagli sul forum, sono sicura che c’è una soluzione, magari lo span è dentro un elemento di blocco o in linea…

  18. morgu3 (15 comments)
    Scritto il 19 maggio 2009 alle 09:28

    Grazie Lauryn, mi hai acceso una lampadina ihih avevo messo lo span dentro l’h1 e allo span avevo dato il text indent.. poi ho anche scritto -9999px invece che -9999, e infatti senza px non funziona lo stesso. vabè, in qualche modo, ho risolto, GRAZIEEE!
    (Prima seguivo il blog solo in background, ora che ho rotto il ghiaccio mi vedrete più spesso)

  19. Lauryn (4189 comments)
    Scritto il 19 maggio 2009 alle 11:00

    non essere timido eheh siamo tutti qui!

  20. Simone (53 comments)
    Scritto il 17 ottobre 2011 alle 20:32

    Quindi questo vale anche per fini SEO? Se voglio che le voci del menù a tendina vengano indicizzate non posso usare jquery perchè le nasconde tramite display:none?

    Come faccio ad ottenere lo stesso effetto senza usare display:none? :(

    XD il menù di questo blog così è fatto LOL!

  21. Lauryn (4189 comments)
    Scritto il 17 ottobre 2011 alle 20:52

    ciao simone, l’articolo è stato scritto un paio di anni fa, nel frattempo gli screen reader si sono un po’ aggiornati permettendo opzioni di lettura personalizzate per cui il problema dovrebbe essere superato (chiederò conferma al nostro amico di manualissimo.it che è non vedente). per quanto riguarda i fini SEO, considera che google è proprio come un cieco, non interpreta pertanto css nè javascript. se nel flusso html non vede un div non lo legge e basta.
    ora che guardo il nuovo template, vedo che usa sia display:none che visibility: hidden in modo combinato, che sia forse per ovviare a questo difetto? mi riservo di studiare questa cosa, grazie per avermelo fatto notare :)

  22. Simone (53 comments)
    Scritto il 17 ottobre 2011 alle 21:01

    Grazie tantissimo a te per la risposta.

    Appena sai qualcosa mi fai sapere? :)
    In tutti i casi avevo pensato, e se al caricamento della pagina sposto tutto come ci mostra questo post e quando il caricamento della pagina è terminato lo nascondo e lo riposiziono con display:none? Sapresti dirmi se Google leggerà o meno quei div? In teoria SI, perchè sono regolarmente presenti finchè non sia completamente caricata tutta la pagina.

    Scusami :) e grazie ancora per la risposta.

  23. Lauryn (4189 comments)
    Scritto il 17 ottobre 2011 alle 21:07

    fai presto a fare la prova: guarda la pagina con css e js disabilitati. in teoria è quello che legge google :)

Scrivi un commento!

© 2012 Italian webdesign. Diritti riservati. Ideato da Laura Gargiulo - Icone di Komodo Media - Logo di W3B.