Как посчитать когда пользователь находится на нужном моменте при 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). Применяют для бесконечного скролла, ленивой загрузки, аналитики.