Что такое Intersection Observer

Ответ

Intersection Observer — это API, позволяющий асинхронно отслеживать пересечение элемента с его родителем или viewport. Он эффективен для ленивой загрузки, бесконечного скролла или анимаций при появлении элемента.

Пример использования:

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('visible');
      observer.unobserve(entry.target); // Отключаем наблюдение после появления
    }
  });
}, { threshold: 0.1 }); // Срабатывает при 10% видимости

document.querySelectorAll('.lazy-load').forEach(el => observer.observe(el));

Плюсы:

  • Высокая производительность (не использует scroll/listener)
  • Гибкость (настройка root, threshold, rootMargin)
  • Поддержка во всех современных браузерах

Ответ 18+ 🔞

А, слушай, вот эта штука — Intersection Observer, она вообще огонь! Ну представь, тебе надо отследить, когда какой-то элемент на странице появляется в зоне видимости. Раньше бы пришлось на скролл вешать слушатель, который каждую миллисекунду долбит браузер вопросами «ну что, видно уже? а щас?», и всё это жрало производительность, как голодный студент доширак. А тут — раз, и готовое решение, которое само тебе скажет, когда элемент показался, и не будет мозг ебать лишний раз.

Вот смотри, как это выглядит в коде, тут всё просто, как три копейки:

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('visible');
      observer.unobserve(entry.target); // Отключаем наблюдение после появления
    }
  });
}, { threshold: 0.1 }); // Срабатывает при 10% видимости

document.querySelectorAll('.lazy-load').forEach(el => observer.observe(el));

Суть в чём: ты создаёшь этого «наблюдателя», говоришь ему: «Слушай, чувак, вот эти все элементы с классом .lazy-load — следи за ними». И как только какой-то из них хотя бы на 10% (потому что threshold: 0.1) вылезет в твоё окно просмотра, он тебе тихонько на ушко: «Йоу, этот уже виден». И ты можешь сделать с ним что угодно — класс добавить для анимации, картинку лениво подгрузить, или, как в примере, сразу отписаться от слежки, чтобы больше не париться.

А почему это, блядь, так охуенно?

  • Производительность — просто пиздец. Браузер сам, где-то глубоко внутри, на уровне движка, оптимизированно следит за пересечениями. Никаких вечных циклов и проверок вручную. Тишина, покой, анимации плавные.
  • Гибкость — хоть заебись. Можно следить не только за тем, когда элемент в окне браузера появляется, но и за его пересечением с любым другим элементом-родителем (root). Можно настраивать пороги срабатывания (threshold), от 0 до 1. Можно даже сделать отступы (rootMargin) — типа «считай, что элемент виден, когда он ещё за 100 пикселей до границы». Вообще красота!
  • Поддержка — везде, кроме совсем древних уродов. Все современные браузеры уже давно это жуют. Для особо упоротых случаев есть полифилы, конечно.

Короче, если тебе нужно что-то делать в момент появления элемента — забудь про свои костыли со скроллом. Это как перейти с допотопного топора на бензопилу. Разница — просто ебать!