Вебсправочник
Основы веб-разработки

IntersectionObserver: наблюдение за пересечением области просмотра

IntersectionObserver сообщает об изменении пересечения элемента с областью наблюдения. Он помогает запускать отложенную работу без постоянного ручного измерения геометрии на каждом событии прокрутки.

Назначение

IntersectionObserver сообщает об изменении пересечения элемента с областью наблюдения. Он помогает запускать отложенную работу без постоянного ручного измерения геометрии на каждом событии прокрутки.

Как это работает

В собственном длинном документе создайте секцию id observed-lesson. Пример использует viewport как root и порог четверти площади элемента. Callback получает набор записей; после первого подходящего пересечения наблюдение за секцией прекращается.

Пример

const target = document.querySelector("#observed-lesson");
const observer = new IntersectionObserver(entries => {
  for (const entry of entries) {
    if (entry.isIntersecting && entry.intersectionRatio >= 0.25) {
      console.log("Достигнут порог пересечения");
      observer.unobserve(entry.target);
    }
  }
}, {threshold:0.25});
observer.observe(target);
// При удалении компонента вызовите observer.disconnect().

Что должно получиться

Сообщение появляется, когда наблюдаемая секция достигает заданного пересечения. Первое уведомление может прийти и сразу после начала наблюдения, поэтому состояние проверяется внутри callback.

Граница применения и частая ошибка

Обычное пересечение не доказывает, что пользователь прочитал текст или что его не перекрывает другой элемент. У очень высокого блока четверть площади может никогда не попасть в небольшой viewport. API не предназначен для точного покадрового движения анимации.

Самостоятельная проверка

Проверьте секцию выше и ниже первого экрана, затем увеличьте её высоту. Объясните, достижим ли порог. Попробуйте другой root в отдельной прокручиваемой области и сравните наблюдаемое поведение.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.