Ich möchte nur ein einfaches JQ / JS, um zu überprüfen, ob die aktuelle Seite / das aktuelle Fenster (kein bestimmtes Element) eine vertikale Bildlaufleiste hat.
Googeln gibt mir Dinge, die nur für diese Grundfunktion zu komplex erscheinen.
Wie kann das gemacht werden?
javascript
jquery
scroll
Woody
quelle
quelle
overflow
Eigenschaft derbody
einzustellen isthidden
irgendwo entlang der Linie, wird es nicht funktionieren. Das Verstecken an einem Körper ist jedoch äußerst selten.$(document)
stattdessen verwenden$("body")
musste. Dies funktionierte für mich, wenn der Körper dies nicht tat (ich habe einen absolut positionierten Behälter mit einem Seitenverhältnis von Breite / Höhe)Versuche dies:
Dies zeigt Ihnen jedoch nur an, ob die vertikale scrollHeight größer als die Höhe des sichtbaren Inhalts ist. Die
hasVScroll
Variable enthält true oder false.Wenn Sie eine gründlichere Überprüfung durchführen müssen, fügen Sie dem obigen Code Folgendes hinzu:
quelle
cStyle.overflow === 'scroll'
?cStyle.overflow == "visible"
kann Bildlaufleisten anzeigen , wenn das Element das istdocument.body
. Aber es sollte sein (hasVScroll && cStyle.overflow == "sichtbar" && element.nodeName == "BODY"). Außerdem muss überprüft werden,cStyle.overflow === 'scroll'
wie Sie darauf hinweisen.Ich habe die vorherige Antwort ausprobiert und scheint nicht mit $ ("body") zu arbeiten. Height () repräsentiert nicht unbedingt die gesamte HTML-Höhe.
Ich habe die Lösung wie folgt korrigiert:
quelle
Lassen Sie uns diese Frage von den Toten zurückbringen;) Es gibt einen Grund, warum Google Ihnen keine einfache Lösung bietet. Sonderfälle und Browser-Macken wirken sich auf die Berechnung aus und sind nicht so trivial, wie es scheint.
Leider gibt es bisher Probleme mit den hier beschriebenen Lösungen. Ich möchte sie überhaupt nicht herabsetzen - sie sind gute Ausgangspunkte und berühren alle Schlüsseleigenschaften, die für einen robusteren Ansatz erforderlich sind. Aber ich würde nicht empfehlen, den Code aus einer der anderen Antworten zu kopieren und einzufügen, weil
$( document ).width()
und.height()
fallen der fehlerhaften Erkennung der Dokumentgröße durch jQuery zum Opfer .window.innerWidth
, wenn der Browser unterstützt, Ihr Code macht Scrollbalken in mobilen Browsern erkennen ausfallen, wobei die Breite der Bildlaufleiste ist in der Regel 0. Sie sind nur vorübergehend als Overlay angezeigt und nehmen nicht Raum in dem Dokument . Auf diese Weise wird auch das Zoomen auf dem Handy zum Problem (lange Geschichte).html
und desbody
Elements explizit auf nicht standardmäßige Werte setzen (was dann passiert, ist ein wenig kompliziert - siehe diese Beschreibung ).Ich habe mehr Zeit damit verbracht, als ich mir vorgestellt hätte, eine Lösung zu finden, die "einfach funktioniert" (Husten). Der Algorithmus, den ich mir ausgedacht habe , ist jetzt Teil eines Plugins, jQuery.isInView , das eine
.hasScrollbar
Methode verfügbar macht . Schauen Sie sich die Quelle an, wenn Sie möchten.In einem Szenario, in dem Sie die volle Kontrolle über die Seite haben und sich nicht mit unbekanntem CSS befassen müssen, kann die Verwendung eines Plugins übertrieben sein - schließlich wissen Sie, welche Randfälle zutreffen und welche nicht. Wenn Sie jedoch zuverlässige Ergebnisse in einer unbekannten Umgebung benötigen, sind die hier beschriebenen Lösungen meiner Meinung nach nicht ausreichend. Sie sind besser dran, wenn Sie ein gut getestetes Plugin verwenden - meins oder sonst jemand.
quelle
window.scrollbars
Objekt, das eine einzige Eigenschaft hatvisible
. Klingt vielversprechend, ist es aber nicht. Es wird im IE, einschließlich IE11, nicht unterstützt. Und es sagt Ihnen nur, dass es eine Bildlaufleiste gibt - aber nicht welche. Siehe die Testseite hier .Dieser hat für mich funktioniert:
Für den Körper einfach verwenden
hasVerticalScroll()
.quelle
clientHeight
ist hier vorzuziehenoffsetHeight
. Andernfalls können Sie einen dicken Rand haben und zurückgeben, dass dort keine Bildlaufleiste vorhanden ist.quelle
Seltsamerweise sagt Ihnen keine dieser Lösungen, ob eine Seite eine vertikale Bildlaufleiste hat.
window.innerWidth - document.body.clientWidth
gibt Ihnen die Breite der Bildlaufleiste. Dies sollte in jedem IE9 + funktionieren (nicht in den kleineren Browsern getestet). (Oder um die Frage streng zu beantworten,!!(window.innerWidth - document.body.clientWidth)
Warum? Angenommen, Sie haben eine Seite, auf der der Inhalt größer als die Fensterhöhe ist und der Benutzer nach oben / unten scrollen kann. Wenn Sie Chrome auf einem Mac ohne angeschlossene Maus verwenden, wird dem Benutzer keine Bildlaufleiste angezeigt. Schließen Sie eine Maus an und eine Bildlaufleiste wird angezeigt. (Beachten Sie, dass dieses Verhalten überschrieben werden kann, dies ist jedoch die Standard-AFAIK.)
quelle
Ich habe Vanila-Lösung gefunden
quelle
window.innerWidth > document.documentElement.clientWidth
ist dies wahr, aberwindow.innerHeight > document.documentElement.clientHeight
nicht. Es sieht so aus, als wäre es in diesem Fall umgekehrt. Ich bin kein JS-Entwickler, ich brauche es nur für Selen-Tests. Ich bin dankbar für Hinweise.Dieser sagt Ihnen, ob Sie eine Bildlaufleiste haben oder nicht. Ich habe einige Informationen eingefügt, die beim Debuggen hilfreich sein können und als JavaScript-Warnung angezeigt werden.
Fügen Sie dies nach dem schließenden Body-Tag in ein Skript-Tag ein.
quelle
Ich habe eine aktualisierte Version von Kees C. Bakkers Antwort geschrieben:
Die Funktion gibt true oder false zurück, je nachdem, ob die Seite eine vertikale Bildlaufleiste hat oder nicht.
Beispielsweise:
quelle
ich benutze
quelle
Vergleichen Sie einfach die Breite des Dokumentenstammelements (dh des HTML-Elements) mit dem inneren Teil des Fensters:
Wenn Sie auch die Breite der Bildlaufleiste kennen müssen:
quelle
Andere Lösungen haben in einem meiner Projekte nicht funktioniert und ich habe am Ende die Überlauf-CSS-Eigenschaft überprüft
Es funktioniert jedoch nur, wenn die Bildlaufleiste durch Ändern der Requisite ausgeblendet wird. Es funktioniert nicht, wenn der Inhalt gleich oder kleiner als das Fenster ist.
quelle