Lazy-loading анимаций — это подход к оптимизации производительности веб-приложений, при котором анимации создаются и выполняются только тогда, когда они действительно необходимы. Это особенно важно для страниц с большим количеством интерактивных элементов, параллакс-эффектов и сложных визуальных переходов, чтобы не перегружать браузер и не снижать FPS. В GSAP (GreenSock Animation Platform) существуют встроенные инструменты и техники, которые позволяют реализовать ленивую загрузку анимаций эффективно и гибко.
Основная идея lazy-loading состоит в том, чтобы:
В GSAP это достигается комбинацией ScrollTrigger,
динамического создания анимаций и условной инициализации.
ScrollTrigger для ленивой загрузкиGSAP предоставляет плагин ScrollTrigger, который идеально подходит для lazy-loading анимаций. Он позволяет запускать анимации только при прокрутке до определённого элемента.
Пример базовой реализации:
gsap.registerPlugin(ScrollTrigger);
gsap.utils.toArray('.animate-on-scroll').forEach(element => {
gsap.from(element, {
scrollTrigger: {
trigger: element,
start: "top 80%",
toggleActions: "play none none none"
},
opacity: 0,
y: 50,
duration: 1,
ease: "power2.out"
});
});
Здесь ключевые моменты:
trigger указывает элемент, который будет контролировать
запуск анимации.start: "top 80%" — точка, в которой анимация начинается
относительно viewport.toggleActions управляет поведением анимации при входе и
выходе из области видимости.Иногда необходимо, чтобы сама анимация создавалась только при скролле, а не заранее. В GSAP это можно сделать с использованием функции-обёртки:
const lazyAnimate = (selector) => {
const element = document.querySelector(selector);
ScrollTrigger.create({
trigger: element,
start: "top 80%",
onEnter: () => {
gsap.fromTo(element,
{ opacity: 0, y: 50 },
{ opacity: 1, y: 0, duration: 1, ease: "power2.out" }
);
},
once: true
});
};
lazyAnimate('.lazy-item');
Особенности данного подхода:
once: true предотвращает повторное создание
анимации.Для ленивых анимаций на страницах с динамическим контентом (например, при infinite scroll) GSAP легко интегрируется с JavaScript-логикой добавления элементов в DOM.
function addNewItem(content) {
const container = document.querySelector('.list');
const newItem = document.createElement('div');
newItem.classList.add('lazy-item');
newItem.innerHTML = content;
container.appendChild(newItem);
gsap.from(newItem, {
scrollTrigger: {
trigger: newItem,
start: "top 80%",
toggleActions: "play none none none"
},
opacity: 0,
y: 50,
duration: 0.8
});
}
В этом примере каждая новая карточка получает анимацию только при добавлении в DOM и попадании в область видимости, что предотвращает лишние вычисления и повышает производительность.
При использовании ленивых анимаций важно учитывать:
Удаление ScrollTrigger после завершения анимации:
let trigger = ScrollTrigger.create({
trigger: element,
start: "top 80%",
onEnter: () => {
gsap.to(element, { opacity: 1, y: 0, duration: 1 });
trigger.kill(); // освобождаем ресурсы
}
});Использование once: true для
анимаций, которые должны выполняться один раз.
Группировка анимаций с
gsap.timeline() для элементов, которые появляются
одновременно. Это снижает количество отдельных анимационных
объектов.
Если анимация состоит из нескольких последовательностей, лучше
использовать gsap.timeline() с ленивой инициализацией:
ScrollTrigger.create({
trigger: ".section",
start: "top 80%",
onEnter: () => {
const tl = gsap.timeline();
tl.from(".section .title", { opacity: 0, y: -50, duration: 0.5 })
.from(".section .image", { opacity: 0, scale: 0.8, duration: 0.7 })
.from(".section .text", { opacity: 0, y: 30, duration: 0.5 });
},
once: true
});
Преимущества:
gsap.utils.toArray для
автоматического перебора элементов.Этот подход позволяет создавать интерактивные, плавные анимации без перегрузки страницы, поддерживая высокий FPS и снижая потребление ресурсов браузера, что критично для сложных веб-приложений с множеством визуальных эффектов.