На этот вопрос есть более 30 ответов, и ни один из них не использует удивительно простое, чистое решение JS, которое я использовал. Нет необходимости загружать jQuery просто для решения этой проблемы, как это делают многие другие.
Чтобы определить, находится ли элемент в области просмотра, мы должны сначала определить положение элементов в теле. Нам не нужно делать это рекурсивно, как я когда-то думал. Вместо этого мы можем использовать element.getBoundingClientRect()
.
pos = elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
Это значение представляет собой разницу Y между вершиной объекта и вершиной тела.
Затем мы должны сказать, находится ли элемент в поле зрения. Большинство реализаций спрашивают, находится ли полный элемент в области просмотра, поэтому мы рассмотрим это.
Прежде всего, верхняя позиция окна: window.scrollY
.
Мы можем получить нижнюю позицию окна, добавив высоту окна к его верхней позиции:
var window_bottom_position = window.scrollY + window.innerHeight;
Давайте создадим простую функцию для получения верхней позиции элемента:
function getElementWindowTop(elem){
return elem && typeof elem.getBoundingClientRect === 'function' ? elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top : 0;
}
Эта функция вернет верхнюю позицию элемента в окне или вернет, 0
если вы передадите ему что-то отличное от элемента с.getBoundingClientRect()
метода. Этот метод существует уже давно, поэтому вам не нужно беспокоиться о том, что ваш браузер не поддерживает его.
Теперь верхняя позиция нашего элемента:
var element_top_position = getElementWindowTop(element);
И или нижняя позиция элемента:
var element_bottom_position = element_top_position + element.clientHeight;
Теперь мы можем определить, находится ли элемент в области просмотра, проверяя, находится ли нижняя позиция элемента ниже верхней позиции области просмотра, и проверяя, находится ли верхняя позиция элемента выше нижней позиции области просмотра:
if(element_bottom_position >= window.scrollY
&& element_top_position <= window_bottom_position){
//element is in view
else
//element is not in view
Оттуда вы можете выполнить логику, чтобы добавить или удалить in-view
класс для вашего элемента, который вы затем сможете обрабатывать позже с помощью эффектов перехода в вашем CSS.
Я абсолютно удивлен, что я не нашел этого решения где-либо еще, но я верю, что это самое чистое и эффективное решение, и оно не требует загрузки jQuery!