PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Как посчитать когда пользователь находится на нужном моменте при scroll?

Продвинутые темы

Момент, когда пользователь доскроллил до нужной точки, определяют через IntersectionObserver (элемент-маркер виден) или вычислением `scrollY`/`getBoundingClientRect` относительно позиции элемента.

IntersectionObserver (рекомендуется)

Отслеживает, когда элемент-маркер попадает в область просмотра:

const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      console.log('Доскроллили до элемента');
      // загрузить ещё / анимация / аналитика
    }
  });
}, { threshold: 0.5 }); // 50% видимости

observer.observe(targetElement);
  • Эффективно (не грузит поток, в отличие от scroll-обработчика).
  • threshold — доля видимости для срабатывания.
  • rootMargin — «раннее» срабатывание (например, за 100px до элемента).

Через scroll + getBoundingClientRect

window.addEventListener('scroll', throttle(() => {
  const rect = element.getBoundingClientRect();
  if (rect.top <= window.innerHeight) {
    console.log('Элемент в зоне видимости');
  }
}, 100));

Менее эффективно (частое срабатывание, reflow) — throttle обязателен.

Через scrollY и позицию

if (window.scrollY >= targetOffset) {
  // доскроллили до позиции
}

Применения

  • Бесконечный скролл (подгрузка при приближении к концу).
  • Ленивая загрузка изображений.
  • Анимации при появлении.
  • Аналитика (сколько прочитали).
  • Прогресс чтения.

Коротко для собеседования

Момент доскролла до точки определяют через IntersectionObserver (маркер-элемент пересёк viewport — isIntersecting, с threshold/rootMargin) — эффективно, не грузит поток. Альтернатива — scroll + getBoundingClientRect/scrollY (с throttle, менее эффективно из-за частых срабатываний и reflow). Применяют для бесконечного скролла, ленивой загрузки, аналитики.

Другие вопросы раздела