1388 Stimmen

Was ist der Unterschied zwischen visibility:hidden und display:none?

Die CSS-Regeln visibility:hidden y display:none führen beide dazu, dass das Element nicht sichtbar ist. Sind dies Synonyme?

5voto

cleaver Punkte 360

Es gibt hier viele detaillierte Antworten, aber ich dachte, ich sollte dies hinzufügen, um die Zugänglichkeit anzusprechen, da es Auswirkungen hat.

display: none; y visibility: hidden; wird möglicherweise nicht von allen Bildschirmleseprogrammen gelesen. Bedenken Sie, was sehbehinderte Nutzer erleben werden.

In der Frage wird auch nach Synonymen gefragt. text-indent: -9999px; ist eine andere, die ungefähr gleichwertig ist. Der wichtige Unterschied bei text-indent ist, dass sie oft von Bildschirmlesegeräten gelesen wird. Das kann eine schlechte Erfahrung sein, da die Nutzer immer noch mit der Tabulatortaste auf den Link zugreifen können.

Für die Barrierefreiheit wird heute eine Kombination von Stilen verwendet, um ein Element auszublenden, während es für Bildschirmleser sichtbar ist.

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

Eine gute Praxis ist es, einen "Skip to content"-Link zum Anker des Hauptinhalts zu erstellen. Sehbehinderte Nutzer wollen sich wahrscheinlich nicht auf jeder Seite die gesamte Navigationsstruktur anhören. Machen Sie den Link visuell unsichtbar. Die Benutzer können einfach auf die Tabulatortaste drücken, um den Link aufzurufen.

Weitere Informationen über Barrierefreiheit und verborgene Inhalte finden Sie hier:

4voto

gaurav5430 Punkte 11154

Alle anderen Antworten zusammenfassen:

Sichtbarkeit

Anzeige

Element mit Sichtbarkeit: versteckt, ist für alle praktischen Zwecke (Mauszeiger, Tastaturfokus, Screenreader) versteckt, nimmt aber dennoch Platz im gerenderten Markup ein

Element mit display:none, wird für alle praktischen Zwecke (Mauszeiger, Tastaturfokus, Screenreader) ausgeblendet und nimmt KEINEN Platz im gerenderten Markup ein

css-Übergänge können für Sichtbarkeitsänderungen angewendet werden

css-Übergänge können bei Anzeigeänderungen nicht angewendet werden

Sie können ein übergeordnetes Element sichtbar:versteckt machen, aber ein untergeordnetes Element mit Sichtbarkeit:sichtbar würde immer noch angezeigt werden.

Wenn das übergeordnete Element display:none ist, können die Kinder dies nicht überschreiben und sich selbst sichtbar machen.

Teil des DOM-Baums (so dass Sie ihn weiterhin mit DOM-Abfragen ansprechen können)

Teil des DOM-Baums (so dass Sie ihn weiterhin mit DOM-Abfragen ansprechen können)

Teil des Renderbaums

NICHT Teil des Renderbaums

Jede Neuordnung / jedes Layout im übergeordneten Element oder in den untergeordneten Elementen würde möglicherweise auch eine Neuordnung in diesen Elementen auslösen, da sie Teil des Renderbaums sind.

Ein Reflow/Layout im übergeordneten Element würde sich nicht auf diese Elemente auswirken, da sie nicht Teil des Renderbaums sind.

das Umschalten zwischen Sichtbarkeit: versteckt und sichtbar, würde möglicherweise keinen Reflow / Layout auslösen. (Laut diesem Kommentar tut es das: Was ist der Unterschied zwischen visibility:hidden und display:none? und möglicherweise auch hiernach https://developers.google.com/speed/docs/insights/browser-reflow )

das Umschalten zwischen display:none und display: (etwas anderes) würde zu einem Layout/Reflow führen, da dieses Element nun Teil des Renderingbaums werden würde

können Sie das Element über DOM-Methoden messen

Sie können das Element oder seine Nachkommen nicht mit DOM-Methoden messen

Wenn Sie eine große Anzahl von Elementen mit Sichtbarkeit: keine auf der Seite haben, könnte der Browser beim Rendern hängen bleiben, da alle diese Elemente Layout benötigen, obwohl sie nicht angezeigt werden

Wenn Sie eine große Anzahl von Elementen haben, die display:none verwenden, haben diese keinen Einfluss auf das Rendering, da sie nicht Teil des Renderingbaums sind.

Ressourcen:

Weitere Informationen:

  • Es gibt auch einige Besonderheiten bei der Browserunterstützung, aber sie scheinen sich auf sehr alte Browser zu beziehen und sind in den anderen Antworten enthalten, so dass ich sie hier nicht erörtere.
  • Es gibt einige andere Alternativen, um Elemente auszublenden, wie Deckkraft oder absolute Positionierung außerhalb des Bildschirms. Sie alle wurden in der einen oder anderen Antwort bereits angesprochen und haben einige Nachteile.
  • Diesem Kommentar zufolge ( Leistungsunterschiede zwischen visibility:hidden und display:none ), wenn Sie viele Elemente haben, die display:none verwenden, und Sie zu display: (etwas anderes) wechseln, wird es einen einzigen Reflow verursachen, während, wenn Sie mehrere visibility: hidden Elemente haben und Sie sie sichtbar machen, wird es für jedes Element einen Reflow verursachen. (Ich verstehe das nicht wirklich)

3voto

Dave Burton Punkte 2748

Ein weiterer Unterschied ist, dass visibility:hidden funktioniert in sehr, sehr alten Browsern, und display:none nicht:

https://www.w3schools.com/cssref/pr_class_visibility.asp

https://www.w3schools.com/cssref/pr_class_display.asp

2voto

Adam Jagosz Punkte 1264

Der Unterschied geht über den Stil hinaus und zeigt sich darin, wie sich die Elemente verhalten, wenn sie mit JavaScript bearbeitet werden.

Wirkungen und Nebenwirkungen von display: none :

  • das Zielelement wird aus dem Dokumentfluss herausgenommen (hat keine Auswirkungen auf das Layout anderer Elemente);
  • alle Nachkommen sind davon betroffen (werden auch nicht angezeigt und können sich nicht aus dieser Vererbung "herauswinden");
  • Messungen können weder für das Zielelement noch für seine Nachkommen vorgenommen werden - sie werden überhaupt nicht gerendert, so dass ihre clientWidth , clientHeight , offsetWidth , offsetHeight , scrollWidth , scrollHeight , getBoundingClientRect() , getComputedStyle() alle zurück 0 s.

Wirkungen und Nebeneffekte von visibility: hidden :

  • Das Zielelement ist nicht mehr sichtbar, wird aber nicht aus dem Fluss genommen und wirkt sich auf das Layout aus, indem es seinen normalen Platz einnimmt;
  • innerText (aber nicht innerHTML ) des Zielelements und der Nachkommen gibt einen leeren String zurück.

2voto

cmcnphp Punkte 134

Wie an anderer Stelle in diesem Stapel beschrieben, sind diese beiden Begriffe nicht gleichbedeutend. visibility:hidden lässt Platz auf der Seite, während display:none wird das Element vollständig ausgeblendet. Ich denke, es ist wichtig, darüber zu sprechen, wie sich dies auf die Kinder eines bestimmten Elements auswirkt. Wenn Sie Folgendes verwenden würden visibility:hidden dann können Sie die Kinder dieses Elements mit dem richtigen Styling anzeigen. Aber mit display:none Sie verstecken die Kinder unabhängig davon, ob Sie display: block | flex | inline | grid | inline-block oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X