intermediate
IntersectionObserver
Наблюдайте за видимостью для lazy loading, infinite scroll, аналитики и prefetch без scroll polling.
IntersectionObserver сообщает, когда target пересекает пороги видимости относительно root. Заменяет scroll polling для lazy images, бесконечных списков, impression-аналитики и prefetch. Задайте root, rootMargin, thresholds и cleanup; callbacks — асинхронные наблюдения, не таймер анимации.
const observer = new IntersectionObserver(
(entries) => {
for (const entry of entries) {
if (entry.isIntersecting) loadImage(entry.target);
}
},
{ rootMargin: '200px 0px', threshold: 0.01 }
);
rootMargin грузит до видимых пикселей; thresholds задают долю пересечения. unobserve по завершении, чтобы не течь на долгоживущих SPA.
На интервью: почему дешевле scroll listeners и как rootMargin сдвигает preload.
Типовые ошибки: не точные часы анимации; забытый unobserve течёт на длинных экранах.
Компромисс: удобство против контроля — выбирайте механизм под вашу связность и бюджет производительности.
Чеклист:
- Осознанно root, margin, thresholds.
- unobserve/disconnect при размонтировании.
- Не ждите покадровой точности.
- loading="lazy", если хватает нативного.