Ленивая загрузка (lazy loading) — это техника, при которой ресурсы (изображения, видео, iframe, сложные DOM-элементы) подгружаются не сразу при открытии страницы, а только в момент, когда они действительно становятся необходимыми. В контексте fullPage.js это особенно важно, поскольку библиотека часто используется для создания полноэкранных секций с богатым мультимедийным содержимым.
Основная цель — снизить начальное время загрузки страницы и уменьшить потребление ресурсов, особенно при наличии большого количества секций.
fullPage.js имеет встроенный механизм ленивой загрузки, который активируется автоматически при использовании специальных атрибутов:
data-src вместо src для изображенийdata-src для iframedata-background для фоновых изображенийПример:
<div class="section">
<img data-src="image.jpg" alt="Example">
</div>
В этом случае изображение не загружается при инициализации страницы. Оно подгрузится только тогда, когда секция станет активной.
При прокрутке fullPage.js отслеживает текущую активную секцию и ближайшие к ней. Когда секция становится видимой:
data-src,
data-srcset, data-backgroundsrc, srcset,
style.background-image)Это происходит автоматически, без необходимости ручного вмешательства.
Изображения
<img data-src="photo.jpg">
Адаптивные изображения
<img data-srcset="small.jpg 480w, large.jpg 800w">
Фоновые изображения
<div class="section" data-background="bg.jpg"></div>
Видео и iframe
<iframe data-src="https://example.com"></iframe>
В fullPage.js есть параметр lazyLoading, который
позволяет включать или отключать механизм:
new fullpage('#fullpage', {
lazyLoading: true
});
По умолчанию он включён.
Дополнительно используется параметр:
lazyLoadThreshold: 2
Он определяет, сколько соседних секций (вверх и вниз) будут загружаться заранее.
Механизм lazyLoadThreshold позволяет балансировать между
производительностью и плавностью:
0 — загрузка только текущей секции1 — текущая + одна соседняя2 — текущая + две соседниеПример:
new fullpage('#fullpage', {
lazyLoadThreshold: 1
});
Это уменьшает вероятность «пустых» секций при быстром скролле.
Для максимальной эффективности lazy loading важно:
width,
height)Пример:
<img
data-src="image.webp"
width="800"
height="600"
alt="Optimized image">
Современные браузеры поддерживают атрибут
loading="lazy":
<img src="image.jpg" loading="lazy">
Однако при использовании fullPage.js это может конфликтовать с внутренней системой, так как библиотека управляет загрузкой вручную. Рекомендуется использовать только один подход, предпочтительно встроенный механизм fullPage.js.
Фоновые изображения часто создают наибольшую нагрузку. В fullPage.js
применяется атрибут data-background, который позже
преобразуется в:
background-image: url('...');
Пример:
<div class="section" data-background="large-bg.jpg"></div>
Важно учитывать:
Видео — один из самых тяжёлых ресурсов. Ленивая загрузка позволяет отложить их загрузку:
<video data-src="video.mp4"></video>
После активации секции:
src устанавливаетсяДополнительно можно использовать:
<video data-src="video.mp4" muted autoplay loop></video>
fullPage.js предоставляет события, которые можно использовать для дополнительной логики:
afterLoad: function(origin, destination, direction){
// секция загружена
}
Можно вручную инициировать загрузку ресурсов:
afterLoad: function(origin, destination){
const section = destination.item;
const images = section.querySelectorAll('[data-src]');
images.forEach(img => {
img.setAttribute('src', img.getAttribute('data-src'));
});
}
Использование src вместо
data-src
<img src="image.jpg"> <!-- загрузится сразу -->
Отсутствие размеров изображений
Приводит к «прыжкам» layout при загрузке.
Слишком большой threshold
lazyLoadThreshold: 10
Фактически отключает ленивую загрузку.
Дублирование механизмов
Одновременное использование:
loading="lazy"может вызвать некорректное поведение.
Можно полностью отключить встроенную систему и реализовать свою:
new fullpage('#fullpage', {
lazyLoading: false
});
После этого применяется собственная логика, например через Intersection Observer:
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const el = entry.target;
el.src = el.dataset.src;
observer.unobserve(el);
}
});
});
document.querySelectorAll('[data-src]').forEach(el => {
observer.observe(el);
});
Ленивая загрузка напрямую влияет на:
Правильная настройка позволяет:
Однако чрезмерная агрессивность (слишком поздняя загрузка) может приводить к задержкам отображения контента.
data-src для всех тяжёлых ресурсовlazyLoadThreshold в зависимости от
сценарияПри добавлении секций после инициализации:
fullpage_api.reBuild();
После этого lazy loading снова применяется к новым элементам.
Если контент подгружается через AJAX, необходимо:
data-srcreBuild()data-* атрибутамиТакая схема обеспечивает высокую производительность даже при сложных интерфейсах с большим количеством медиа-контента.