Не используйте событие прокрутки для этого, попробуйте использовать API наблюдателя пересечения (IO) для этого. Он был создан для решения подобных проблем, для реагирования, когда элементы становятся видимыми или пересекаются друг с другом в области просмотра.
Сначала вы определите параметры для ввода-вывода:
let options = {
rootMargin: '0px',
threshold: 1.0
}
После того, как параметры определены, вы говорите, какие элементы вы хотите наблюдать:
const elements = document.querySelectorAll('.scroll-dest');
Как На последнем шаге вы должны определить, что произойдет, когда элемент появится в поле зрения, и привязать его к определенным вами элементам:
const intersectionObserver = new IntersectionObserver((entries, observer) => {
entries.forEach((entry) => {
// when element's is in viewport,
// do something with it!
if (entry.intersectionRatio > 0) {
animate(entry.target);
// remove observer after animation (if it is no longer needed).
// remove this line if you want to continue observing this element.
observer.unobserve(entry.target);
}
});
});
elements.forEach((element) => intersectionObserver.observe(element));
Если вам требуется поддержка старых браузеров, чем использовать этот (официальный) polyfill из w3 c, он воссоздает наблюдателя пересечения с прослушиванием событий прокрутки. Так что он будет работать медленнее в старых браузерах, с этим ничего не поделаешь. Но на более новых будет увеличение производительности.
Вы также можете подумать об использовании window.scrollTo () вместо jQuery animate для повышения производительности.