Intersection Observer - дозволяє відстежувати зміну видимості елементів на сторінці

js 2 хвилин 52 секунд 5 січ. 2023
 Intersection Observer - дозволяє відстежувати зміну видимості елементів на сторінці

У JavaScript є багато інструментів для взаємодії з DOM-структурою веб-сторінок, і Intersection Observer API є одним з них. Цей API дозволяє відстежувати зміну видимості елементів на сторінці, коли вони перетинаються з вікном браузера або іншим елементом. У цій статті ми розглянемо, як використовувати Intersection Observer API з прикладами використання та кодом.

Огляд Intersection Observer API

Intersection Observer API дозволяє відстежувати перетин елементів з вікном браузера або іншим елементом. Це дозволяє реагувати на зміну видимості елементів, коли вони потрапляють в зону видимості або залишають її.

Для використання Intersection Observer API ми створюємо екземпляр IntersectionObserver, який приймає функцію зворотнього виклику (callback), що викликається при зміні видимості елементів. Ця функція отримує список об'єктів IntersectionObserverEntry, кожен з яких містить інформацію про елемент та його видимість.

const observer = new IntersectionObserver(callback, options);

Функція зворотного виклику (callback) приймає список об'єктів IntersectionObserverEntry:

function callback(entries, observer) {
  // Обробка зміни видимості елементів
}

Приклад 1: Зміна стилю елементу при його появі в зоні видимості

У цьому прикладі ми використовуємо Intersection Observer API, щоб змінити стиль елементу при його появі в зоні видимості.

<div class="box">Якийсь текст</div>
const box = document.querySelector('.box');
const options = {
  root: null,
  rootMargin: '0px',
  threshold: 0.5,
};

const observer = new IntersectionObserver(function(entries, observer) {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.style.backgroundColor = 'red';
    } else {
      entry.target.style.backgroundColor = 'transparent';
    }
  });
}, options);

observer.observe(box);

У цьому прикладі ми відстежуємо зміну видимості елементу з класом .box і встановлюємо червоний колір фону, якщо елемент потрапляє в зону видимості з пороговим значенням 0,5. Якщо елемент не перетинається з вікном браузера, фоновий колір змінюється на прозорий.

Приклад 2: Завантаження зображення при його появі в зоні видимості

У цьому прикладі ми використовуємо Intersection Observer API, щоб завантажити зображення при його появі в зоні видимості.

<img class="lazy" data-src="path/to/image.jpg" alt="Зображення">
const lazyImages = document.querySelectorAll('.lazy');
const options = {
  root: null,
  rootMargin: '0px',
  threshold: 0.5,
};

const observer = new IntersectionObserver(function(entries, observer) {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const image = entry.target;
      const src = image.getAttribute('data-src');
      image.setAttribute('src', src);
      image.classList.remove('lazy');
      observer.unobserve(image);
    }
  });
}, options);

lazyImages.forEach(image => {
  observer.observe(image);
});

У цьому прикладі ми відстежуємо зміну видимості зображень з класом .lazy. Коли зображення потрапляє в зону видимості з пороговим значенням 0,5, ми завантажуємо його і встановлюємо його src атрибут зі значенням з атрибута data-src. Потім ми видаляємо клас .lazy, щоб відключити відкладене завантаження зображення, та перестаємо спостерігати за зображенням.

Приклад 3: Нескінченна прокрутка

У цьому прикладі ми використовуємо Intersection Observer API для завантаження додаткового контенту, коли користувач доскролює до кінця сторінки.

<div id="container">
  <ul id="list">
    <li>Елемент 1</li>
    <li>Елемент 2</li>
    <li>Елемент 3</li>
    <li>Елемент 4</li>
    <li>Елемент 5</li>
    <li>Елемент 6</li>
    <li>Елемент 7</li>
    <li>Елемент 8</li>
    <li>Елемент 9</li>
    <li>Елемент 10</li>
  </ul>
  <div id="loader">Завантаження...</div
const options = {
  root: null,
  rootMargin: '0px',
  threshold: 0.5,
};

const observer = new IntersectionObserver(function(entries, observer) {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      loadMoreData();
    }
  });
}, options);

observer.observe(document.querySelector('#loader'));

У цьому прикладі ми створюємо новий екземпляр IntersectionObserver з пороговим значенням 0,5 та спостерігаємо за елементом з ідентифікатором #loader. Коли цей елемент потрапляє в зону видимості з пороговим значенням 0,5, ми викликаємо функцію loadMoreData(), яка завантажує додатковий контент на сторінку.

 

Висновок

Intersection Observer API є потужним інструментом, який дозволяє відстежувати зміну видимості елементів на сторінці та виконувати певні дії, коли вони потрапляють в зону видимості. Це може бути корисно для відкладеного завантаження зображень, анімації, підзавантаження контенту і багатьох інших випадків використання. Використання Intersection Observer API дозволяє покращити швидкість завантаження сторінки та підвищити її продуктивність.