19 Stimmen

Wie prüft man die Sichtbarkeit von Elementen mit Javascript?

Ich interessiere mich für eine Möglichkeit zu überprüfen, ob ein Element display:none Stil explicility (dh style="display:none") hat, hat eine Klasse, die hat (oder erbt) diesen Stil, oder einer seiner Eltern ausgeblendet ist (und mein Element erbt diese)

Fall1:

<body><div><span style="display:none;">Some hidden text</span></div>

o

<body><div style="display:none;"><span>Some hidden text</span></div>

Fall2:

SomeClass {   display:none;   }
<body><div class="SomeClass"><span>Some hidden text</span></div>

Danke,

32voto

Crescent Fresh Punkte 111444

Sie suchen nach einer Lösung für zwei verschiedene Szenarien.

Das erste Szenario ist das Abrufen der kaskadierten/berechneten Stil für eine CSS-Eigenschaft. Siehe diese Antwort wie man das macht.

Das zweite Szenario besteht darin, festzustellen, ob eines der Elemente Eltern verborgen sind. Dies erfordert ein Umhergehen und ist umständlich und langsam.

Sie können die Lösung nehmen hier skizziert (und verwendet von jQuery/Sizzle seit 1.3.2 ), und lesen Sie einfach die Abmessungen des Elements ab:

var isVisible = element.offsetWidth > 0 || element.offsetHeight > 0;

Wenn es Abmessungen hat, ist es in dem Sinne sichtbar, dass es einen (wenn auch kleinen) rechteckigen Platz im Dokument einnimmt. Beachten Sie, dass diese Technik immer noch einige Nachteile für bestimmte Elemente in bestimmten Browsern, sollte aber in den meisten Fällen funktionieren.

6voto

Josh Stodola Punkte 79569

Dies ist der schnellste und einfachste Weg, um festzustellen, ob ein Element sichtbar ist.

function is_visible(e) {return e.offsetWidth > 0 || e.offsetHeight > 0;}

3voto

Andrew Magill Punkte 1831

Für jeden Fall ist eine eigene Prüfung erforderlich, und Sie müssen die ID des jeweiligen Elements kennen. Erfassen Sie zunächst das Element (dies geschieht nur, um den Code lesbar zu machen):

var MyElementName = document.getElementById("MyElementName");

Dann machen Sie Ihre Kontrollen:

Fall 1:

 if (MyElementName.style.display == "none")

Fall 2 mit Blick auf die Muttergesellschaft, die zuerst FF überprüft:

if ((MyElementName.previousSibling.nodeType == 3 )
    && (MyElementName.parentNode.nextSibling.style.display == "none"))

dann für andere Browser:

else (MyElementName.parentNode.style.display == "none")

Fall 3 suchen Sie nach einer angewandten css-Klasse:

if (MyElementName.className = "SomeClass")

1voto

Pancho Punkte 1760

Die obige Lösung deckt dieses Szenario der "Unsichtbarkeit" ab:

display:none;

aber für diesen ist sie nicht geeignet:

visibility: hidden;

Um den Test auf Sichtbarkeit: versteckt einzubeziehen, kann das Skript wie folgt geändert werden...

Erstellen Sie zunächst eine browserübergreifende Funktion, um den berechneten Stil des gewünschten Elements zu erhalten:

computedStyle = function(vElement) {
  return window.getComputedStyle?
         ?window.getComputedStyle(vElement,null)
         :vElement.currentStyle;                    //IE 8 and less
}

Zweitens: Erstellen Sie die Funktion zum Testen der Sichtbarkeit

isVisible = function(vElement) {
  return !(vElement.offsetWidth == 0 && vElement.offsetHeight == 0)
         && computedStyle(vElement).visibility != "hidden";  
}

Schließlich verweisen Sie einfach auf die Funktion isVisible, wo immer sie benötigt wird, wie folgt:

if (isVisible(myElement)) {
  alert('You can see me!');
} else {
  alert('I am invisible ha ha!');
}

Nur ein Hinweis darauf, dass die aktuellen isVisible()-Tests eine Reihe von "Unsichtbarkeits"-Szenarien nicht berücksichtigen (die Tests könnten jedoch erweitert werden, um diese einzubeziehen). Hier sind ein paar Beispiele:

  1. wenn ein Element die gleiche Farbe wie die umgebende Farbe hat
  2. wenn ein Element sichtbar ist, aber physisch hinter einem anderen Element liegt, z. B. bei unterschiedlichen z-Index-Werten

Zu der oben genannten Funktion computedStyle() ist wahrscheinlich auch Folgendes zu bemerken:

  1. Neben der Prüfung der Sichtbarkeit kann es natürlich auch für viele andere stilbezogene Zwecke verwendet werden.
  2. Ich habe mich dafür entschieden, :pseudo style testing aufgrund der unzureichenden Browserunterstützung zu ignorieren, aber mit einer kleinen Änderung der Funktion könnte dies, falls gewünscht, einbezogen werden.

-1voto

Mark Punkte 261

Ist es das, was Sie zu tun versuchen?

function SomeClass()
{
  if (document.getElementById("MY_DIV_ID").style.display == "none")
  {

  }
}

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