document.body.scrollTop Firefox gibt 0 zurück: NUR JS

70

Irgendwelche Alternativen in reinem Javascript?

Das Folgende arbeitet in Oper, Chrom und Safari. Habe noch nicht auf Explorer getestet:

http://monkey-me.herokuapp.com

https://github.com/coolcatDev/monkey-me-heroku/blob/master/static/js/myscripts.js

Beim Laden der Seite sollte nach unten zu div '.content' gescrollt werden:

var destiny = document.getElementsByClassName('content');
var destinyY = destiny[0].offsetTop;
scrollTo(document.body, destinyY, 200);

function scrollTo(element, to, duration) {
    if (duration <= 0) return;
    var difference = to - element.scrollTop;
    var perTick = difference / duration * 2;

    setTimeout(function() {
        element.scrollTop = element.scrollTop + perTick;
        scrollTo(element, to, duration - 2);
    }, 10);
};
Al Ex Tsm
quelle
wenn möglich in reinem css noch besser!
Al Ex Tsm

Antworten:

151

Versuchen Sie Folgendes : document.documentElement.scrollTop. Wenn ich richtig bin, document.body.scrollTopist veraltet.

Aktualisieren

Scheint, als würde Chrome nicht mit der Antwort mitspielen, um sicher zu gehen, wie von @Nikolai Mavrenkov in den Kommentaren vorgeschlagen:

window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0

Jetzt sollten alle Browser abgedeckt sein.

Michelangelo
quelle
Ehrfürchtig. Diese Lösung funktioniert für Firefox, daher werde ich beim Laden auf Firefox eine if-Bedingung einfügen. Vielen Dank
Al Ex Tsm
Ich habe bestätigt, dass dies auch mein Problem behebt.
Martyn Chamberlin
14
Es funktioniert nicht für Chrome. Es ist sicherer zu bedienenwindow.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
Nikolai Mavrenkov
@ NikolaiMavrenkov Danke, ich habe meine Antwort aktualisiert. Ich dachte, Chrome sollte auch abgedeckt werden, aber es scheint, dass sie immer noch nicht mit den anderen
Michelangelo
@ Michaelangelo Funktioniert nicht auf meiner Website, weiß nicht warum.
Apoorva Shah
41

Anstatt IF- Bedingungen zu verwenden, gibt es eine einfachere Möglichkeit, mit so etwas wie diesem logischen Ausdruck ein korrektes Ergebnis zu erzielen.

var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;

Beide Teile geben standardmäßig Null zurück. Wenn sich Ihr Bildlauf an der Nullposition befindet, wird wie erwartet Null zurückgegeben.

bodyScrollTop = 0 || 0 = 0

Beim Blättern auf der Seite gibt einer dieser Teile Null zurück und ein anderer eine Zahl größer als Null. Der Wert Null wird als falsch ausgewertet, und dann nimmt das logische ODER || einen anderen Wert als Ergebnis an (z. B. Ihr erwartetes scrollTop ist 300 ).

Firefox-ähnliche Browser sehen diesen Ausdruck als

bodyScrollTop = 300 || 0 = 300

und der Rest der Browser sehen

bodyScrollTop = 0 || 300 = 300

was wiederum das gleiche und korrekte Ergebnis liefert.

In der Tat dreht sich alles um something || nothing = something:)

Wh1T3h4Ck5
quelle
1
Genau das habe ich gesucht.
DevWL
1
Vielen Dank für die Erklärung! Hilft den Leuten wirklich, ich selbst eingeschlossen
John_911
@ John_911 Das ist der Hauptzweck von StackOverflow;)
Wh1T3h4Ck5
20

Der Standard ist document.documentElementund dies wird von FF und IE verwendet.

WebKit verwendet document.bodyden Standard und konnte ihn aufgrund von Beschwerden über die Abwärtskompatibilität nicht verwenden, wenn sie zum Standard geändert wurden. In diesem Beitrag wird dies ausführlich erläutert

https://miketaylr.com/posts/2014/11/document-body-scrolltop.html

Es gibt eine neue Eigenschaft im Dokument, die WebKit jetzt unterstützt

https://developer.mozilla.org/en/docs/Web/API/document/scrollingElement

So gelangen Sie zum richtigen Element

var scrollingElement = document.scrollingElement || document.documentElement;
scrollingElement.scrollTop = 100;

und es gibt auch eine Polyfüllung

https://github.com/mathiasbynens/document.scrollingElement

Anthony Johnston
quelle
1
Ich habe gesteckten in genannten polyfill und ersetzt document.body.scroll*zu document.scrollingElement.scroll*in meinem Code und es funktioniert gut in Chrome 52 und Firefox 43 auf OS X. Dank Anthony
Geradlus_RU