Lazy loading (отложенная загрузка) — это метод, позволяющий загружать изображения или другие ресурсы только по мере их необходимости, а не загружать всё содержимое сразу. В контексте использования библиотеки BasicLightbox в JavaScript, это позволяет оптимизировать работу веб-страницы, ускорить её загрузку и улучшить пользовательский опыт. В данной статье рассмотрим, как применить lazy loading в lightbox, используя BasicLightbox.
Lazy loading заключается в том, что ресурсы загружаются не сразу при загрузке страницы, а по мере того, как они становятся видимыми пользователю. Для этого необходимо отложить загрузку изображений до того момента, когда они попадут в область видимости пользователя, что помогает уменьшить время первичной загрузки страницы и снизить нагрузку на сервер.
В контексте библиотеки BasicLightbox, lazy loading используется для того, чтобы изображения или другие мультимедийные файлы в lightbox загружались только тогда, когда пользователь решит просматривать их, открывая модальные окна.
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, важно разобраться с тем, как BasicLightbox открывает изображения. Библиотека по умолчанию не поддерживает механизмы отложенной загрузки, однако можно легко добавить эту функциональность с помощью атрибутов HTML и JavaScript.
data-src вместо обычного src. Этот атрибут
будет хранить ссылку на изображение, а сам элемент изображения будет
загружаться только когда это будет нужно. Пример:<img class="lazyload" data-src="image1.jpg" alt="Пример изображения" />
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.
Теперь, когда мы понимаем, как работает отложенная загрузка, можно интегрировать её в BasicLightbox. Основная задача заключается в том, чтобы отложить загрузку изображений до того момента, как они будут отображены в модальном окне.
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();
});
});
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 в lightbox с BasicLightbox приносит ряд преимуществ:
Интеграция lazy loading в BasicLightbox позволяет значительно
улучшить производительность веб-страниц, особенно если они содержат
большое количество изображений и мультимедийных файлов. Используя
Intersection Observer API и подход с атрибутом data-src,
можно легко реализовать отложенную загрузку изображений и других медиа,
обеспечив эффективную работу сайта с минимальной нагрузкой на сервер и
улучшенным пользовательским опытом.