Antworten:
$(document).ready(function() {
// Check if body height is higher than window height :)
if ($("body").height() > $(window).height()) {
alert("Vertical Scrollbar! D:");
}
// Check if body width is higher than window width :)
if ($("body").width() > $(window).width()) {
alert("Horizontal Scrollbar! D:<");
}
});
$(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:
var hasVScroll = document.body.scrollHeight > document.body.clientHeight;
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:
// Get the computed style of the body element
var cStyle = document.body.currentStyle||window.getComputedStyle(document.body, "");
// Check the overflow and overflowY properties for "auto" and "visible" values
hasVScroll = cStyle.overflow == "visible"
|| cStyle.overflowY == "visible"
|| (hasVScroll && cStyle.overflow == "auto")
|| (hasVScroll && cStyle.overflowY == "auto");
cStyle.overflow === 'scroll'
?
cStyle.overflow == "visible"
kann Bildlaufleisten anzeigen , wenn das Element das ist document.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:
// Check if body height is higher than window height :)
if ($(document).height() > $(window).height()) {
alert("Vertical Scrollbar! D:");
}
// Check if body width is higher than window width :)
if ($(document).width() > $(window).width()) {
alert("Horizontal Scrollbar! D:<");
}
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 des body
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.
window.scrollbars
Objekt, das eine einzige Eigenschaft hat visible
. 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:
function hasVerticalScroll(node){
if(node == undefined){
if(window.innerHeight){
return document.body.offsetHeight> window.innerHeight;
}
else {
return document.documentElement.scrollHeight >
document.documentElement.offsetHeight ||
document.body.scrollHeight>document.body.offsetHeight;
}
}
else {
return node.scrollHeight> node.offsetHeight;
}
}
Für den Körper einfach verwenden hasVerticalScroll()
.
clientHeight
ist hier vorzuziehen offsetHeight
. Andernfalls können Sie einen dicken Rand haben und zurückgeben, dass dort keine Bildlaufleiste vorhanden ist.
var hasScrollbar = window.innerWidth > document.documentElement.clientWidth;
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.)
Ich habe Vanila-Lösung gefunden
var hasScrollbar = function() {
// The Modern solution
if (typeof window.innerWidth === 'number')
return window.innerWidth > document.documentElement.clientWidth
// rootElem for quirksmode
var rootElem = document.documentElement || document.body
// Check overflow style property on body for fauxscrollbars
var overflowStyle
if (typeof rootElem.currentStyle !== 'undefined')
overflowStyle = rootElem.currentStyle.overflow
overflowStyle = overflowStyle || window.getComputedStyle(rootElem, '').overflow
// Also need to check the Y axis overflow
var overflowYStyle
if (typeof rootElem.currentStyle !== 'undefined')
overflowYStyle = rootElem.currentStyle.overflowY
overflowYStyle = overflowYStyle || window.getComputedStyle(rootElem, '').overflowY
var contentOverflows = rootElem.scrollHeight > rootElem.clientHeight
var overflowShown = /^(visible|auto)$/.test(overflowStyle) || /^(visible|auto)$/.test(overflowYStyle)
var alwaysShowScroll = overflowStyle === 'scroll' || overflowYStyle === 'scroll'
return (contentOverflows && overflowShown) || (alwaysShowScroll)
}
window.innerWidth > document.documentElement.clientWidth
ist dies wahr, aber window.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.
<script>
var scrollHeight = document.body.scrollHeight;
var clientHeight = document.documentElement.clientHeight;
var hasVerticalScrollbar = scrollHeight > clientHeight;
alert(scrollHeight + " and " + clientHeight); //for checking / debugging.
alert("hasVerticalScrollbar is " + hasVerticalScrollbar + "."); //for checking / debugging.
</script>
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.
Ich habe eine aktualisierte Version von Kees C. Bakkers Antwort geschrieben:
const hasVerticalScroll = (node) => {
if (!node) {
if (window.innerHeight) {
return document.body.offsetHeight > window.innerHeight
}
return (document.documentElement.scrollHeight > document.documentElement.offsetHeight)
|| (document.body.scrollHeight > document.body.offsetHeight)
}
return node.scrollHeight > node.offsetHeight
}
if (hasVerticalScroll(document.querySelector('body'))) {
this.props.handleDisableDownScrollerButton()
}
Die Funktion gibt true oder false zurück, je nachdem, ob die Seite eine vertikale Bildlaufleiste hat oder nicht.
Beispielsweise:
const hasVScroll = hasVerticalScroll(document.querySelector('body'))
if (hasVScroll) {
console.log('HAS SCROLL', hasVScroll)
}
Vergleichen Sie einfach die Breite des Dokumentenstammelements (dh des HTML-Elements) mit dem inneren Teil des Fensters:
if ((window.innerWidth - document.documentElement.clientWidth) >0) console.log('V-scrollbar active')
Wenn Sie auch die Breite der Bildlaufleiste kennen müssen:
vScrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
Andere Lösungen haben in einem meiner Projekte nicht funktioniert und ich habe am Ende die Überlauf-CSS-Eigenschaft überprüft
function haveScrollbar() {
var style = window.getComputedStyle(document.body);
return style["overflow-y"] != "hidden";
}
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.
overflow
Eigenschaft derbody
einzustellen isthidden
irgendwo entlang der Linie, wird es nicht funktionieren. Das Verstecken an einem Körper ist jedoch äußerst selten.