Kann ich auf irgendeine Weise überprüfen, ob ein Element in reinem JS sichtbar ist (keine jQuery)?
So wird beispielsweise auf dieser Seite: Performance Bikes , wenn Sie mit der Maus über Deals (im oberen Menü) fahren, ein Fenster mit Deals angezeigt, das jedoch zu Beginn nicht angezeigt wurde. Es ist im HTML, aber es ist nicht sichtbar.
Wie kann ich bei einem DOM-Element überprüfen, ob es sichtbar ist oder nicht? Ich habe es versucht:
window.getComputedStyle(my_element)['display']);
aber es scheint nicht zu funktionieren. Ich frage mich, welche Attribute ich überprüfen soll. Es kommt mir in den Sinn:
display !== 'none'
visibility !== 'hidden'
Irgendwelche anderen, die ich vermissen könnte?
javascript
dom
Hommer Smith
quelle
quelle
document.getElementById('snDealsPanel').style.visibility
Antworten:
Gemäß dieser MDN-Dokumentation wird die
offsetParent
Eigenschaft eines Elements zurückgegeben,null
wenn es oder eines seiner übergeordneten Elemente über die Anzeigestileigenschaft ausgeblendet wird. Stellen Sie einfach sicher, dass das Element nicht repariert ist. Ein Skript, um dies zu überprüfen, wenn Sie keineposition: fixed;
Elemente auf Ihrer Seite haben, könnte folgendermaßen aussehen:Wenn Sie jedoch positionsfeste Elemente haben, die bei dieser Suche möglicherweise hängen bleiben, müssen Sie diese leider (und langsam) verwenden
window.getComputedStyle()
. Die Funktion in diesem Fall könnte sein:Option 2 ist wahrscheinlich etwas unkomplizierter, da sie mehr Randfälle berücksichtigt, aber ich wette, sie ist auch viel langsamer. Wenn Sie diesen Vorgang also viele Male wiederholen müssen, vermeiden Sie ihn am besten.
quelle
el.offsetParent
IE9 für nicht feste Elemente nicht funktioniert. Zumindest scheint es so. (OK für IE11.) Also ging es doch mitgetComputedStyle
.getComputedStyle
funktioniert nicht richtig: plnkr.co/edit/6CSCA2fe4Gqt4jCBP2wu?p=preview Aber auchoffsetParent
- vielleicht sollte eine Kombination aus beiden verwendet werden?Alle anderen Lösungen waren für mich in einer bestimmten Situation kaputt.
Die Gewinnerantwort lautet:
http://plnkr.co/edit/6CSCA2fe4Gqt4jCBP2wu?p=preview
Schließlich entschied ich, dass die beste Lösung war
$(elem).is(':visible')
- dies ist jedoch kein reines Javascript. es ist jquery ..Also schaute ich auf ihre Quelle und fand, was ich wollte
Dies ist die Quelle: https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js
quelle
true
für ein Element mitvisibility:hidden
visibility:hidden
einstellen, dass kein Inhalt mehr angezeigt wird, werden dennoch die Breite und Höhe des Elements berücksichtigt!Wenn Sie daran interessiert sind, für den Benutzer sichtbar zu sein:
Getestet am (unter Verwendung der Mokka- Terminologie):
quelle
scrollIntoView
Recht verwenden?! Das ist ziemlich teuer. Gibt es einen anderen klugen Weg?Dies kann helfen: Blenden Sie das Element aus, indem Sie es ganz links positionieren und dann die Eigenschaft offsetLeft überprüfen. Wenn Sie jQuery verwenden möchten, können Sie einfach Folgendes überprüfen : sichtbar Selektor und den Sichtbarkeitsstatus des Elements abrufen.
HTML:
CSS:
JavaScript:
jQuery:
jsFiddle
quelle
Verwenden Sie denselben Code wie jQuery:
Also, in einer Funktion:
Funktioniert wie ein Zauber in meinem Win / IE10, Linux / Firefox.45, Linux / Chrome.52 ...
Vielen Dank an jQuery ohne jQuery!
quelle
e.offsetWidth
es sich um eine Ganzzahl handelt,!e.offsetWidth
wird zurückgegeben,false
wenn siee.offsetWidth
höher als Null ist (Element ist sichtbar). Wenn Sie also ein weiteres!
wie in hinzufügen,!!e.offsetWidth
wird zurückgegeben,true
wenne.offsetWidth
es höher als Null ist. Es ist eine Abkürzung fürreturn e.offsetWidth > 0 ? true : false
oder offensichtlichreturn e.offsetWidth > 0
.Kombinieren Sie ein paar Antworten oben:
Wie AlexZ sagte, kann dies langsamer sein als einige Ihrer anderen Optionen, wenn Sie genauer wissen, wonach Sie suchen, aber dies sollte alle wichtigen Arten erfassen, wie Elemente versteckt werden.
Es kommt aber auch darauf an, was für Sie als sichtbar gilt. Beispielsweise kann die Höhe eines Divs auf 0 Pixel eingestellt werden, der Inhalt bleibt jedoch abhängig von den Überlaufeigenschaften weiterhin sichtbar. Oder der Inhalt eines Divs kann dieselbe Farbe wie der Hintergrund haben, sodass er für Benutzer nicht sichtbar ist, aber dennoch auf der Seite gerendert wird. Oder ein Div könnte vom Bildschirm verschoben oder hinter anderen Divs versteckt werden, oder sein Inhalt könnte nicht sichtbar sein, aber der Rand bleibt sichtbar. Bis zu einem gewissen Grad ist "sichtbar" ein subjektiver Begriff.
quelle
display:none
wäre großartig. Eine richtige Arbeitslösung!Ich habe eine leistungsfähigere Lösung als die getComputedStyle () -Lösung von AlexZ, wenn man positionierte Elemente hat, wenn man bereit ist, einige Randfälle zu ignorieren (Kommentare überprüfen):
Randnotiz: Genau genommen muss zuerst "Sichtbarkeit" definiert werden. In meinem Fall betrachte ich ein Element als sichtbar, solange ich alle DOM-Methoden / -Eigenschaften problemlos ausführen kann (auch wenn die Deckkraft 0 ist oder die CSS-Sichtbarkeitseigenschaft "ausgeblendet" ist usw.).
quelle
Wenn das Element regelmäßig sichtbar ist (Anzeige: Block und Sichtbarkeit: sichtbar), aber ein übergeordneter Container ausgeblendet ist, können wir clientWidth und clientHeight verwenden, um dies zu überprüfen.
Plunker (hier klicken)
quelle
ele.style.visibility !== 'hidden'
ist hier überflüssig. In diesem Fall sind clientWidth und clientHeight 0.Wenn wir nur grundlegende Methoden zum Erkennen der Sichtbarkeit sammeln, darf ich nicht vergessen:
Und wie man Attribute erhält:
Also, in Ihrem Beispiel:
Aber was? Hier funktioniert es nicht. Wenn Sie genauer hinschauen, werden Sie feststellen, dass die Sichtbarkeit nicht als Attribut für das Element aktualisiert wird, sondern mithilfe der
style
Eigenschaft. Dies ist eines von vielen Problemen beim Versuch, das zu tun, was Sie tun. Unter anderem: Sie können nicht garantieren, dass in einem Element tatsächlich etwas zu sehen ist, nur weil Sichtbarkeit, Anzeige und Deckkraft die richtigen Werte haben. Möglicherweise fehlt es immer noch an Inhalt oder an Höhe und Breite. Ein anderes Objekt könnte es verdecken. Für weitere Details enthüllt eine schnelle Google - Suche diese und schließt sogar eine Bibliothek , um zu versuchen , das Problem zu lösen. (YMMV)Schauen Sie sich die folgenden möglichen Duplikate dieser Frage mit hervorragenden Antworten an, einschließlich einiger Erkenntnisse des mächtigen John Resig. Ihr spezifischer Anwendungsfall unterscheidet sich jedoch geringfügig vom Standard, daher verzichte ich auf das Markieren:
(BEARBEITEN: OP SAGT, ER SCHRITKT SEITEN, ERSTELLT SIE NICHT, SO IST UNTEN NICHT ANWENDBAR) Eine bessere Option? Binden Sie die Sichtbarkeit von Elementen an Modelleigenschaften und machen Sie die Sichtbarkeit immer von diesem Modell abhängig, ähnlich wie Angular es mit ng-show tut. Sie können dies mit jedem gewünschten Werkzeug tun: Angular, Plain JS, was auch immer. Besser noch, Sie können die DOM-Implementierung im Laufe der Zeit ändern, aber Sie können immer den Status aus dem Modell anstelle des DOM lesen. Deine Wahrheit aus dem DOM zu lesen ist schlecht. Und langsam. Es ist viel besser, das Modell zu überprüfen und auf Ihre Implementierung zu vertrauen, um sicherzustellen, dass der DOM-Status das Modell widerspiegelt. (Und verwenden Sie automatisierte Tests, um diese Annahme zu bestätigen.)
quelle
Die akzeptierte Antwort hat bei mir nicht funktioniert. Antwort für das Jahr 2020 :
1) Die Methode (elem.offsetParent! == null) funktioniert in Firefox einwandfrei , in Chrome jedoch nicht. Für Chrome "Position: fest;" OffsetParent gibt auch "null" zurück, selbst wenn das Element auf der Seite sichtbar ist.
Demo:
Sie können diesen Megatest https://stackoverflow.com/a/11639664/4481831 sehen (führen Sie ihn mit mehreren Browsern aus, um die Unterschiede zu erkennen).
2) Die (getComputedStyle (elem) .display! == 'none') funktioniert nicht, da das Element unsichtbar sein kann, da eine der übergeordneten Anzeigeeigenschaften auf none gesetzt ist. GetComputedStyle fängt dies nicht ab.
Demo:
3) Die (elem.clientHeight! == 0) . Diese Methode wird nicht durch die festgelegte Position beeinflusst und prüft auch, ob die übergeordneten Elemente nicht sichtbar sind. Es gibt jedoch Probleme mit einfachen Elementen, die kein CSS-Layout haben. Weitere Informationen finden Sie hier
Demo:
4) Die (elem.getClientRects (). Length! == 0) , die die Probleme der vorherigen 3 Methoden zu übertreffen scheinen. Es gibt jedoch Probleme mit Elementen, die CSS-Tricks (außer "display: none") verwenden, um sich auf der Seite auszublenden.
SCHLUSSFOLGERUNG: Ich habe Ihnen also gezeigt, dass keine Methode perfekt ist. Um eine ordnungsgemäße Sichtbarkeitsprüfung durchzuführen, müssen Sie eine Kombination der letzten drei Methoden verwenden.
quelle
Nur als Referenz sollte angemerkt werden, dass
getBoundingClientRect()
in bestimmten Fällen funktionieren kann.Eine einfache Überprüfung, ob das Element mithilfe von versteckt ist,
display: none
könnte beispielsweise folgendermaßen aussehen:Dies ist auch praktisch, da es auch die Breite Null, die Höhe Null und
position: fixed
Fälle abdeckt . Es werden jedoch keine Elemente gemeldet, die mitopacity: 0
oder verborgen sindvisibility: hidden
(aber auch nichtoffsetParent
).quelle
var isVisible = el => (r => r.width && r.height)(el.getBoundingClientRect());
. Dann kann ich Arrays von Elementen folgendermaßen filtern :$$(sel).filter(isVisible)
.Was ich also gefunden habe, ist die praktikabelste Methode:
Dies baut auf diesen Tatsachen auf:
display: none
Element (auch ein verschachteltes) hat weder eine Breite noch eine Höhe.visiblity
isthidden
sogar für verschachtelte Elemente.Sie müssen also nicht
offsetParent
im DOM-Baum testen oder eine Schleife erstellen, um zu testen, welche übergeordneten Elemente vorhanden sindvisibility: hidden
. Dies sollte auch in IE 9 funktionieren.Sie könnten argumentieren, ob
opacity: 0
und reduzierte Elemente (hat eine Breite, aber keine Höhe - oder umgekehrt) auch nicht wirklich sichtbar sind. Aber andererseits sind sie nicht per se versteckt.quelle
Eine kleine Ergänzung zu Ohad Navons Antwort.
Wenn die Mitte des Elements zu einem anderen Element gehört, werden wir es nicht finden.
Stellen Sie also sicher, dass einer der Punkte des Elements sichtbar ist
quelle
Die obige Antwort von @Guy Messika zu verbessern , falsch zu brechen und zurückzugeben, wenn der Mittelpunkt 'X <0 ist, ist falsch, da das Element auf der rechten Seite möglicherweise in die Ansicht aufgenommen wird. Hier ist eine Lösung:
quelle
Der jQuery-Code von http://code.jquery.com/jquery-1.11.1.js hat einen isHidden-Parameter
Es sieht also so aus, als ob es eine zusätzliche Prüfung für das Eigentümerdokument gibt
Ich frage mich, ob dies wirklich die folgenden Fälle erfasst:
quelle
Hier ist der Code, den ich geschrieben habe, um das einzig sichtbare unter einigen ähnlichen Elementen zu finden und den Wert seines Attributs "class" ohne jQuery zurückzugeben:
quelle
Das habe ich getan:
HTML & CSS: Das Element wurde standardmäßig ausgeblendet
JavaScript: Es wurde ein Code hinzugefügt, um zu überprüfen, ob die Sichtbarkeit ausgeblendet ist oder nicht:
quelle
Dies ist eine Möglichkeit, dies für alle CSS-Eigenschaften einschließlich der Sichtbarkeit zu bestimmen:
html:
CSS:
Javascript:
Es funktioniert für jede CSS-Eigenschaft und ist sehr vielseitig und zuverlässig.
quelle