Lazy loading в lightbox

Lazy loading (отложенная загрузка) — это метод, позволяющий загружать изображения или другие ресурсы только по мере их необходимости, а не загружать всё содержимое сразу. В контексте использования библиотеки BasicLightbox в JavaScript, это позволяет оптимизировать работу веб-страницы, ускорить её загрузку и улучшить пользовательский опыт. В данной статье рассмотрим, как применить lazy loading в lightbox, используя BasicLightbox.

Основные принципы lazy loading

Lazy loading заключается в том, что ресурсы загружаются не сразу при загрузке страницы, а по мере того, как они становятся видимыми пользователю. Для этого необходимо отложить загрузку изображений до того момента, когда они попадут в область видимости пользователя, что помогает уменьшить время первичной загрузки страницы и снизить нагрузку на сервер.

В контексте библиотеки BasicLightbox, lazy loading используется для того, чтобы изображения или другие мультимедийные файлы в lightbox загружались только тогда, когда пользователь решит просматривать их, открывая модальные окна.

Основы работы с BasicLightbox

BasicLightbox — это лёгкая и простая в использовании библиотека для создания модальных окон (lightbox) с изображениями и другими медиа-ресурсами. Она позволяет выводить изображения в полноэкранном режиме, с возможностью их закрытия, анимациями и поддержкой клавиш управления.

Для того чтобы подключить BasicLightbox, достаточно добавить на страницу соответствующий скрипт и стили:

<link href="https://cdn.jsdelivr.net/npm/basiclightbox/dist/basicLightbox.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/basiclightbox/dist/basicLightbox.min.js"></script>

Реализация lazy loading для изображений

Прежде чем начать работу с lazy loading, важно разобраться с тем, как BasicLightbox открывает изображения. Библиотека по умолчанию не поддерживает механизмы отложенной загрузки, однако можно легко добавить эту функциональность с помощью атрибутов HTML и JavaScript.

  1. HTML-разметка Для того чтобы изображения использовались с отложенной загрузкой, необходимо использовать атрибут data-src вместо обычного src. Этот атрибут будет хранить ссылку на изображение, а сам элемент изображения будет загружаться только когда это будет нужно. Пример:
<img class="lazyload" data-src="image1.jpg" alt="Пример изображения" />
  1. Загрузка изображения по мере необходимости Для того чтобы обеспечить отложенную загрузку, можно использовать Intersection Observer API, который отслеживает, когда элемент появляется в области видимости экрана.
const images = document.querySelectorAll('.lazyload');

const loadImage = (image) => {
  const src = image.getAttribute('data-src');
  image.setAttribute('src', src);
};

const observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      loadImage(entry.target);
      observer.unobserve(entry.target);
    }
  });
}, { threshold: 0.1 });

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

Этот код отслеживает все изображения с классом .lazyload, и как только они появляются в области видимости, загружает их с помощью метода loadImage.

Внедрение lazy loading в BasicLightbox

Теперь, когда мы понимаем, как работает отложенная загрузка, можно интегрировать её в BasicLightbox. Основная задача заключается в том, чтобы отложить загрузку изображений до того момента, как они будут отображены в модальном окне.

  1. Добавление обработчика для открытия lightbox При клике на изображение будет открываться модальное окно с изображением. Для этого нужно использовать событие click на изображении и передать нужный URL изображения в BasicLightbox:
const images = document.querySelectorAll('.lightbox-image');

images.forEach(image => {
  image.addEventListener('click', () => {
    const src = image.getAttribute('data-src');
    const lightbox = basicLightbox.create(`
      <img src="${src}" alt="Image">
    `);
    lightbox.show();
  });
});
  1. Использование отложенной загрузки с data-src При использовании отложенной загрузки для изображений, нужно обязательно использовать атрибут data-src для хранения ссылок на изображения. Тогда при клике на изображение, которое ещё не было загружено, оно подгрузится только в момент открытия lightbox.
<img class="lightbox-image lazyload" data-src="image1.jpg" alt="Пример изображения">

Таким образом, при нажатии на изображение с атрибутом data-src, оно будет загружено и отображено в модальном окне BasicLightbox.

Обработка различных типов контента

Хотя основной фокус в реализации lazy loading будет на изображениях, часто в lightbox требуется отображать и другие медиа-ресурсы, такие как видео, аудио или даже HTML-контент. В таких случаях можно использовать аналогичный подход.

Для видео:

<video class="lazyload" data-src="video.mp4" controls>
  Ваш браузер не поддерживает видео.
</video>

С помощью Intersection Observer API можно также отложенно загружать видео, заменяя атрибут data-src на src непосредственно перед воспроизведением:

const videos = document.querySelectorAll('.lazyload');

videos.forEach(video => {
  observer.observe(video);
});

const loadVideo = (video) => {
  const src = video.getAttribute('data-src');
  video.setAttribute('src', src);
};

Преимущества применения lazy loading

Использование lazy loading в lightbox с BasicLightbox приносит ряд преимуществ:

  • Ускорение загрузки страницы — изображения и другие медиа-ресурсы загружаются только тогда, когда они действительно нужны, что снижает начальное время загрузки страницы.
  • Снижение нагрузки на сервер — ресурсы загружаются только по мере необходимости, что уменьшает количество запросов, отправляемых на сервер.
  • Экономия трафика у пользователей — если пользователь не просматривает определённые изображения, то они не загружаются, экономя его трафик.

Вывод

Интеграция lazy loading в BasicLightbox позволяет значительно улучшить производительность веб-страниц, особенно если они содержат большое количество изображений и мультимедийных файлов. Используя Intersection Observer API и подход с атрибутом data-src, можно легко реализовать отложенную загрузку изображений и других медиа, обеспечив эффективную работу сайта с минимальной нагрузкой на сервер и улучшенным пользовательским опытом.