Ленивая загрузка (lazy loading) позволяет откладывать загрузку изображений до того момента, когда они становятся видимыми в области просмотра пользователя. Это значительно снижает время первоначальной загрузки страницы и экономит трафик, особенно при работе с длинными скролл-страницами и большим количеством медиа-контента. В сочетании с библиотекой ScrollMagic можно реализовать продвинутую логику появления изображений при прокрутке.
Ключевые моменты ленивой загрузки:
Для реализации ленивой загрузки через ScrollMagic используется объект Scene, который отслеживает положение элемента на странице относительно области просмотра.
// Инициализация контроллера ScrollMagic
const controller = new ScrollMagic.Controller();
// Выбор всех изображений с атрибутом data-src
const lazyImages = document.querySelectorAll('img[data-src]');
lazyImages.forEach(img => {
// Создание сцены для каждого изображения
new ScrollMagic.Scene({
triggerElement: img, // Элемент, который будет инициировать событие
triggerHook: 0.9 // Появление элемента почти у нижнего края окна
})
.on('enter', () => {
// Замена атрибута src на реальный источник изображения
img.src = img.dataset.src;
img.classList.add('loaded'); // Добавление класса для CSS-анимации
})
.addTo(controller);
});
Объяснение ключевых параметров:
Для более плавного отображения изображений после загрузки применяются CSS-переходы и анимации. Например:
img {
opacity: 0;
transition: opacity 0.5s ease-in-out;
}
img.loaded {
opacity: 1;
}
Такой подход позволяет избежать резкой подстановки изображения, создавая эффект постепенного появления.
ScrollMagic позволяет закреплять элемент на определённом участке страницы с помощью свойства pin, что полезно для эффекта «залипания» изображения при прокрутке и последовательной загрузки других элементов.
new ScrollMagic.Scene({
triggerElement: '#section',
duration: 500,
triggerHook: 0
})
.setPin('#section')
.addTo(controller);
Это можно сочетать с ленивой загрузкой, чтобы изображения загружались и оставались на экране на протяжении заданного диапазона прокрутки.
Часто ленивую загрузку совмещают с параллакс-анимацией изображений для более динамичного интерфейса:
lazyImages.forEach(img => {
new ScrollMagic.Scene({
triggerElement: img,
triggerHook: 0.8
})
.setTween(TweenMax.from(img, 1, {y: 50, opacity: 0}))
.on('enter', () => {
img.src = img.dataset.src;
})
.addTo(controller);
});
Здесь TweenMax.from используется для анимации появления изображения с вертикальным сдвигом и постепенной прозрачностью.
При ленивой загрузке можно применять атрибут data-srcset для подгрузки изображений разного разрешения в зависимости от устройства:
<img data-src="image-small.jpg" data-srcset="image-2x.jpg 2x" alt="Пример изображения">
В JavaScript нужно заменить не только src, но и
srcset:
img.src = img.dataset.src;
if (img.dataset.srcset) {
img.srcset = img.dataset.srcset;
}
Это гарантирует качественное отображение изображений на экранах с высокой плотностью пикселей.
Для больших страниц с множеством изображений важно:
.destroy():scene.on('enter', () => {
img.src = img.dataset.src;
scene.destroy();
});
Такой подход предотвращает излишние вычисления при дальнейшем скролле.
Если изображения подгружаются динамически (например, через AJAX), сцены ScrollMagic необходимо создавать после добавления новых элементов в DOM:
function addImages(newImages) {
newImages.forEach(img => {
document.body.appendChild(img);
new ScrollMagic.Scene({
triggerElement: img,
triggerHook: 0.9
})
.on('enter', () => { img.src = img.dataset.src; })
.addTo(controller);
});
}
Таким образом, ленивую загрузку можно масштабировать на любые динамически создаваемые блоки контента.
<section id="gallery">
<img data-src="photo1.jpg" alt="Фото 1">
<img data-src="photo2.jpg" alt="Фото 2">
<img data-src="photo3.jpg" alt="Фото 3">
</section>
Сочетание ScrollMagic, правильных триггеров и CSS-анимации обеспечивает высокую производительность и плавное появление изображений при прокрутке. Такой подход особенно эффективен для длинных лендингов, галерей и страниц с большим количеством графического контента.