Ответ на 2018 :
Лучший способ сделать это - использовать API Intersection Observer .
API Intersection Observer предоставляет способ асинхронно наблюдать изменения в пересечении целевого элемента с элементом-предком или с областью просмотра документа верхнего уровня.
Исторически, обнаружение видимости элемента или относительной видимости двух элементов по отношению друг к другу было трудной задачей, решения которой были ненадежными и склонными к тому, что браузер и сайты, к которым пользователь обращается, стали вялыми. К сожалению, по мере взросления сети потребность в такой информации возросла. Информация о пересечении необходима по многим причинам, таким как:
- Ленивая загрузка изображений или другого контента при прокрутке страницы.
- Реализация веб-сайтов с «бесконечной прокруткой», где все больше и больше контента загружается и отображается при прокрутке, чтобы пользователю не приходилось пролистывать страницы.
- Отчет о видимости рекламы с целью расчета доходов от рекламы.
- Решение о том, выполнять или нет задачи или процессы анимации, в зависимости от того, увидит ли пользователь результат.
Реализация обнаружения пересечений в прошлом включала в себя обработчики событий и циклы, вызывающие методы, такие как Element.getBoundingClientRect (), для создания необходимой информации для каждого затронутого элемента. Поскольку весь этот код выполняется в основном потоке, даже один из них может вызвать проблемы с производительностью. Когда сайт загружается с этими тестами, все может стать ужасно.
Смотрите следующий пример кода:
var options = {
root: document.querySelector('#scrollArea'),
rootMargin: '0px',
threshold: 1.0
}
var observer = new IntersectionObserver(callback, options);
var target = document.querySelector('#listItem');
observer.observe(target);
Большинство современных браузеров поддерживают IntersectionObserver , но вы должны использовать polyfill для обратной совместимости.
element
иdocument.body
были только примерами). Подробности смотрите в howtocreate.co.uk/tutorials/javascript/browserwindow .