Qual è la differenza tra visibilità: nascosto e display: nessuno?


1173

Le regole CSS visibility:hiddened display:noneentrambe comportano che l'elemento non sia visibile. Questi sono sinonimi?

Risposte:


1475

display:nonesignifica che il tag in questione non apparirà affatto sulla pagina (anche se puoi ancora interagire con esso attraverso la dom). Non ci sarà spazio allocato per esso tra gli altri tag.

visibility:hiddensignifica che a differenza display:nonedel tag non è visibile, ma lo spazio è allocato per esso sulla pagina. Il tag è reso, semplicemente non è visibile sulla pagina.

Per esempio:

test | <span style="[style-tag-value]">Appropriate style in this tag</span> | test

Sostituzione [style-tag-value]con display:nonerisultati in:

test |   | test

Sostituzione [style-tag-value]con visibility:hiddenrisultati in:

test |                        | test

14
Nessun commento sulle prestazioni dell'uno e dell'altro? Sono curioso di sapere quale metodo utilizzare per nascondere elementi assolutamente posizionati, che vengono visualizzati e nascosti spesso.
Tomáš Zato - Ripristina Monica il

2
Questa è una supposizione totale che non ho fatto alcun test, ma immagino che siano più o meno gli stessi. Non appena qualcosa cambia sullo schermo, l'intero schermo verrà nuovamente riprodotto (almeno una volta), e quindi non importa. Stai ancora forzando una riverniciatura dello schermo. Questo potrebbe però browser molto per browser, e in verità probabilmente ci sono modi migliori per ottimizzare il codice piuttosto che concentrarsi su questi.
kemiller2002,

13
@Kevin ha ragione in questo visibility: hiddene display: nonesarà altrettanto performante dal momento che entrambi ritroveranno layout, pittura e composito. Tuttavia, opacity: 0è funzionalmente equivalente visibility: hiddene non riattiva il passaggio del layout, quindi consiglierei di usarlo se non ti dispiace lo spazio vuoto ancora assegnato (altrimenti usa display: none).
Jayrobin,

76
È importante tenere a mente le transizioni css quando si parla di visibilità e visualizzazione. Ad esempio, passare dalla visibilità: nascosto; alla visibilità: visibile; permette di usare transizioni css, mentre si passa da display a: nessuna; visualizzare: blocco; non. visibilità: nascosto ha il vantaggio aggiuntivo di non acquisire eventi javascript, mentre opacità: 0; cattura eventi.
Michael Deal,

9
opacity: 0dovrebbe essere usato con cautela quando si tratta di input o pulsanti, poiché esisterebbero comunque e potrebbero causare strane interazioni con l'utente.
Jacques Mouette,

233

Non sono sinonimi.

display:none rimuove l'elemento dal normale flusso della pagina, consentendo la compilazione di altri elementi.

visibility:hidden lascia l'elemento nel normale flusso della pagina in modo che occupi ancora spazio.

Immagina di essere in fila per un giro in un parco di divertimenti e qualcuno nella fila diventa così turbolento che la sicurezza li coglie dalla linea. Tutti in linea si sposteranno quindi in avanti di una posizione per riempire lo slot ora vuoto. Questo è come display:none.

In contrasto con la situazione simile, ma che qualcuno di fronte a te indossa un mantello dell'invisibilità. Durante la visualizzazione della linea, sembrerà che ci sia uno spazio vuoto, ma le persone non possono davvero riempire quello spazio vuoto perché qualcuno è ancora lì. Questo è come visibility:hidden.


3
C'è un'altra grande differenza tra loro: almeno in Chrome, la visibilità può essere utilizzata con ritardo di transizione ma il display la ignora.
SapphireSun

1
Modo divertente di spiegare, ma interessante. :)
Elango Paul Victor

107

Una cosa che vale la pena aggiungere, sebbene non sia stata chiesta, è che esiste una terza opzione per rendere l'oggetto completamente trasparente. Prendere in considerazione:

1st <a href="http://example.com" style="display: none;">unseen</a> link.<br />
2nd <a href="http://example.com" style="visibility: hidden;">unseen</a> link.<br />
3rd <a href="http://example.com" style="opacity: 0;">unseen</a> link.

(Assicurati di fare clic sul pulsante "Esegui snippet di codice" sopra per vedere il risultato.)

La differenza tra 1 e 2 è già stata evidenziata (vale a dire, 2 occupa ancora spazio). Tuttavia, c'è una differenza tra 2 e 3: nel caso 3, il mouse passerà comunque alla mano quando passa il mouse sopra il collegamento e l'utente può ancora fare clic sul collegamento e gli eventi Javascript verranno comunque attivati ​​sul collegamento. Questo di solito non è il comportamento desiderato (ma forse a volte lo è?).

Un'altra differenza è se si seleziona il testo, quindi si copia / incolla come testo normale, si ottiene quanto segue:

1st link.
2nd  link.
3rd unseen link.

Nel caso 3 il testo viene copiato. Forse questo sarebbe utile per qualche tipo di filigrana, o se volessi nascondere un avviso sul copyright che verrebbe visualizzato se un utente incautamente copia / incolla i tuoi contenuti?


@greenoldman Puoi fornire un esempio? Ecco un jsfiddle in cui un elemento nascosto (ho provato div e span) che è l'unico elemento nel suo contenitore e occupa ancora spazio: jsfiddle.net/rmb5wdLd/1
Kip

@Kip, strano - Non posso farlo ora (e ho cambiato anche il mio progetto). OK, è meglio che rimuova il mio commento precedente e quando avrò un solido testcase lo mostrerò, scusami per il rumore.
Greenoldman,

90

display:none rimuove l'elemento dal flusso di layout.

visibility:hidden lo nasconde ma lascia lo spazio.


70

C'è una grande differenza quando si tratta di nodi figlio. Ad esempio: se si dispone di un div padre e un div figlio nidificato. Quindi se scrivi così:

<div id="parent" style="display:none;">
    <div id="child" style="display:block;"></div>
</div>

In questo caso, nessuno dei div sarà visibile. Ma se scrivi così:

<div id="parent" style="visibility:hidden;">
    <div id="child" style="visibility:visible;"></div>
</div>

Quindi il div figlio sarà visibile mentre il div genitore non verrà mostrato.


Buon punto, questo può essere facilmente perso. display: none / block non attiverà le transizioni, quindi usando la visibilità: nascosto può funzionare, ma anche gli elementi figlio hanno bisogno di vilibilità: nascosti allo stesso tempo
Drenai

18

Non sono sinonimi: display: nonerimuove l'elemento dal flusso della pagina e il resto della pagina scorre come se non ci fosse.

visibility: hidden nasconde l'elemento alla vista ma non il flusso della pagina, lasciando spazio per esso sulla pagina.


15

display: none rimuove completamente l'elemento dalla pagina e la pagina viene creata come se l'elemento non ci fosse affatto.

Visibility: hidden lascia lo spazio nel flusso del documento anche se non puoi più vederlo.

Questo può o meno fare una grande differenza a seconda di cosa stai facendo.


Usando $ ('# element'). Remove () rimuove completamente l'elemento dalla pagina (DOM). Non visualizzarlo o non utilizzare lo spazio non significa rimuoverlo. Puoi comunque modificarne lo stato con un semplice $ ('# element'). Show (), quindi non viene "completamente rimosso".
foxontherock,

11

Con visibility:hiddenl'oggetto occupa ancora altezza verticale sulla pagina. Con display:noneesso è completamente rimosso. Se hai del testo sotto un'immagine e lo fai display:none, quel testo si sposterà verso l'alto per riempire lo spazio in cui era l'immagine. Se fai visibilità: nascosto il testo rimarrà nella stessa posizione.


Con nascosto, lo spazio preservato è solo la dimensione verticale. Che dire di orizzontalmente?
Chris Noe,

2
Anche la dimensione orizzontale viene preservata.
JB Hurteaux,

9

display:nonenasconderà l'elemento e collasserà lo spazio che stava occupando, mentre visibility:hiddennasconderà l'elemento e preserverà lo spazio degli elementi. display: nessuna influenza anche alcune delle proprietà disponibili da JavaScript nelle versioni precedenti di IE e Safari.


7

Oltre a tutte le altre risposte, c'è una differenza importante per IE8: se usi display:nonee provi a ottenere la larghezza o l'altezza dell'elemento, IE8 restituisce 0 (mentre altri browser restituiranno le dimensioni effettive). IE8 restituisce la larghezza o l'altezza corretta solo per visibility:hidden.


7

visibility:hiddenpreserva lo spazio; display:nonenon lo fa.


6
display: none; 

Non sarà disponibile nella pagina e non occupa spazio.

visibility: hidden; 

nasconde un elemento, ma occuperà comunque lo stesso spazio di prima. L'elemento sarà nascosto, ma influirà comunque sul layout.

visibility: hiddenpreservare lo spazio, mentre display: nonenon preserva lo spazio.

Visualizza nessuno Esempio: https://www.w3schools.com/css/tryit.asp?filename=trycss_display_none

Esempio di visibilità nascosta: https://www.w3schools.com/cssref/tryit.asp?filename=trycss_visibility


Vorrei sconsigliare il collegamento a w3schools a causa delle imprecisioni note sul sito Web.
Skere,

5

Se la proprietà di visibilità è impostata su "hidden", il browser occuperà comunque spazio sulla pagina per il contenuto anche se è invisibile.
Ma quando impostiamo un oggetto su "display:none", il browser non alloca spazio sulla pagina per il suo contenuto.

Esempio:

<div style="display:none">
Content not display on screen and even space not taken.
</div>

<div style="visibility:hidden">
Content not display on screen but it will take space on screen.
</div>

Visualizza dettagli


5

visibility:hidden manterrà l'elemento nella pagina e occupa quello spazio ma non viene mostrato all'utente.

display:none non sarà disponibile nella pagina e non occupa spazio.



2

La differenza va oltre lo stile e si riflette nel modo in cui gli elementi si comportano quando vengono manipolati con JavaScript.

Effetti ed effetti collaterali di display: none:

  • l'elemento target viene rimosso dal flusso del documento (non influisce sul layout di altri elementi);
  • tutti i discendenti sono interessati (non sono nemmeno visualizzati e non possono "sottrarsi" a questa eredità);
  • misurazioni non possono essere fatte per l'elemento di destinazione né per i suoi discendenti - non sono resi affatto, quindi la loro clientWidth, clientHeight, offsetWidth, offsetHeight, scrollWidth, scrollHeight, getBoundingClientRect(), getComputedStyle(), tutto il ritorno 0s.

Effetti ed effetti collaterali di visibility: hidden:

  • l'elemento target è nascosto alla vista, ma non viene tolto dal flusso e influenza il layout, occupando il suo spazio normale;
  • innerText(ma non innerHTML) dell'elemento target e dei discendenti restituisce una stringa vuota.

1

display:none;non visualizzerà l'elemento né assegnerà spazio per l'elemento sulla pagina, mentre visibility:hidden;non visualizzerà l'elemento sulla pagina ma assegnerà spazio sulla pagina. In entrambi i casi possiamo accedere all'elemento in DOM. Per capirlo in modo migliore, si prega di guardare il seguente codice: display: nessuno vs visibilità: nascosto


0

Ci sono molte risposte dettagliate qui, ma ho pensato di aggiungere questo per affrontare l'accessibilità poiché ci sono implicazioni.

display: none;e visibility: hidden;potrebbe non essere letto da tutti i software di lettura dello schermo. Tieni presente ciò che sperimenteranno gli utenti ipovedenti.

La domanda pone anche dei sinonimi. text-indent: -9999px;è un altro che è approssimativamente equivalente. La differenza importante text-indentè che verrà spesso letto dagli screen reader. Può essere un po 'una brutta esperienza in quanto gli utenti possono ancora accedere al collegamento.

Per l'accessibilità, quello che vedo oggi usato è una combinazione di stili per nascondere un elemento pur essendo visibile agli screen reader.

{
  clip: rect(1px, 1px, 1px, 1px);
  clip-path: inset(50%);
  height: 1px;
  width: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
}

Una buona pratica è quella di creare un collegamento "Passa al contenuto" all'ancoraggio del corpo principale del contenuto. Gli utenti ipovedenti probabilmente non vogliono ascoltare l'intero albero di navigazione su ogni singola pagina. Rendi il collegamento visivamente nascosto. Gli utenti possono semplicemente toccare la scheda per accedere al collegamento.

Per ulteriori informazioni sull'accessibilità e sul contenuto nascosto, vedere:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.