Иногда нам, возможно, придется проверять, виден ли элемент после прокрутки.

В этой статье мы рассмотрим, как проверить, отображается ли элемент после прокрутки с помощью JavaScript.

Создайте свою собственную функцию

Мы можем создать нашу собственную функцию, чтобы проверять, виден ли элемент после прокрутки.

Например, мы можем написать следующий HTML:

<div>
</div>

И следующий JavaScript:

const div = document.querySelector('div')
for (let i = 1; i <= 100; i++) {
  const p = document.createElement('p')
  p.id = `el-${i}`
  p.textContent = 'hello'
  div.appendChild(p)
}
const isScrolledIntoView = (el) => {
  const {
    top,
    bottom
  } = el.getBoundingClientRect();
  const elemTop = top;
  const elemBottom = bottom;
  const isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight);
  return isVisible;
}
const el = document.querySelector('#el-50')
document.addEventListener('scroll', (e) => {
  console.log(isScrolledIntoView(el))
})

Мы получаем элемент div с querySelector.

Затем у нас есть цикл for для вставки p элементов в div.

Мы устанавливаем свойство id, чтобы мы могли получить вставленный элемент позже.

Затем мы создаем функцию isScrolledIntoView, чтобы проверить, находится ли элемент на экране браузера.

Для этого мы вызываем el.getBoundingClientRect, чтобы получить координаты top и bottom элемента.

Это верхняя и нижняя координаты Y соответственно.

Затем мы возвращаем переменную isVisible, которую создаем, проверяя, больше ли top или равно 0, а bottom меньше или равно innerHeight окна.

Если оба условия верны, то мы знаем, что элемент находится в окне.

Затем мы получаем элемент, который хотим наблюдать, с помощью другого querySelector вызова.

И, наконец, мы вызываем addEventListener, чтобы добавить событие прокрутки в документ, и вызываем функцию isScrolledIntoView с элементом el, чтобы увидеть, когда el находится в окне браузера.

Прокручивая страницу вниз, мы должны увидеть, что зарегистрированное значение изменяется от false до true и обратно до false.

Использование API-интерфейса Intersection Observer

IntersectionObserver API - это API, доступный в последних версиях браузеров, позволяющий нам проверять, отображается ли элемент на экране.

Например, мы можем написать:

const div = document.querySelector('div')
for (let i = 1; i <= 100; i++) {
  const p = document.createElement('p')
  p.id = `el-${i}`
  p.textContent = 'hello'
  div.appendChild(p)
}
const onIntersection = (entries, opts) => {
  entries.forEach(entry => {
    const visible = entry.intersectionRatio >= opts.thresholds[0]    
    console.log(entry.intersectionRatio.toFixed(2), visible)
  })
}
const intersectionObserverOptions = {
  root: null,
  threshold: .5
}
const observer = new IntersectionObserver(onIntersection, intersectionObserverOptions)
const target = document.querySelector('#el-50')
observer.observe(target)

Первый вызов querySelector и цикл for такие же, как и раньше.

Затем мы определяем функцию onIntersection, которая принимает параметры entries и opts.

entries - это элементы, за которыми мы следим.

И opts - это объект параметров, у которого есть свойство thresholds для получения порога пересечения с экраном.

В обратном вызове forEach у нас есть переменная visible, которую мы создаем, сравнивая intersectionRatio из entry с первым значением threasholds в opts,

Мы знаем, что это видно, если intersectionRatio больше порогового значения.

Затем мы регистрируем значение visible и intersectionRatio.

Затем у нас есть interswedtiobnObserverOptions, чтобы установить порог перекрестка, чтобы он был виден.

Затем мы передаем их конструктору IntersectionObserver.

Затем мы вызываем observer.observe с элементом target, чтобы посмотреть, виден он или нет.

Заключение

Мы можем сравнить положение элемента или использовать API IntersectionObserver, чтобы проверить, виден ли элемент после прокрутки.