Es gibt über 30 Antworten auf diese Frage, und keine von ihnen verwendet die erstaunlich einfache, reine JS-Lösung, die ich verwendet habe. Es ist nicht erforderlich, jQuery zu laden, um dies zu lösen, da viele andere darauf drängen.
Um festzustellen, ob sich das Element im Ansichtsfenster befindet, müssen wir zuerst die Position der Elemente innerhalb des Körpers bestimmen. Wir müssen dies nicht rekursiv tun, wie ich einmal dachte. Stattdessen können wir verwenden element.getBoundingClientRect()
.
pos = elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
Dieser Wert ist die Y-Differenz zwischen der Oberseite des Objekts und der Oberseite des Körpers.
Wir müssen dann feststellen, ob das Element in Sichtweite ist. Bei den meisten Implementierungen wird gefragt, ob sich das vollständige Element im Ansichtsfenster befindet. Daher werden wir dies behandeln.
Zuallererst ist die oberste Position des Fensters: window.scrollY
.
Wir können die untere Position des Fensters ermitteln, indem wir die Höhe des Fensters zu seiner oberen Position hinzufügen:
var window_bottom_position = window.scrollY + window.innerHeight;
Erstellen Sie eine einfache Funktion, um die oberste Position des Elements zu ermitteln:
function getElementWindowTop(elem){
return elem && typeof elem.getBoundingClientRect === 'function' ? elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top : 0;
}
Diese Funktion gibt die oberste Position des Elements innerhalb des Fensters zurück oder sie wird zurückgegeben, 0
wenn Sie etwas anderes als ein Element mit dem übergeben.getBoundingClientRect()
Methode . Diese Methode gibt es schon lange, daher sollten Sie sich keine Sorgen machen müssen, dass Ihr Browser sie nicht unterstützt.
Die oberste Position unseres Elements ist nun:
var element_top_position = getElementWindowTop(element);
Die untere Position des Elements ist:
var element_bottom_position = element_top_position + element.clientHeight;
Jetzt können wir feststellen, ob sich das Element im Ansichtsfenster befindet, indem wir überprüfen, ob die untere Position des Elements niedriger als die obere Position des Ansichtsfensters ist und ob die obere Position des Elements höher als die untere Position des Ansichtsfensters ist:
if(element_bottom_position >= window.scrollY
&& element_top_position <= window_bottom_position){
//element is in view
else
//element is not in view
Von dort aus können Sie die Logik ausführen, um eine in-view
Klasse zu Ihrem Element hinzuzufügen oder zu entfernen , die Sie später mit Übergangseffekten in Ihrem CSS behandeln können.
Ich bin absolut erstaunt, dass ich diese Lösung nirgendwo anders gefunden habe, aber ich glaube, dass dies die sauberste und effektivste Lösung ist und dass Sie jQuery nicht laden müssen!