При работе с библиотекой ScrollMagic ключевым аспектом становится оптимизация производительности, особенно когда на странице создаётся множество сцен. Каждая сцена добавляет слушатели событий и вычисления на каждом скролле, что может привести к заметной нагрузке на браузер.
Основной принцип — не создавать сцены без необходимости. Если несколько элементов имеют одинаковое поведение при скролле, их можно объединить в одну сцену и управлять изменениями через CSS-классы или функции коллбэков.
Пример объединения нескольких анимаций:
const controller = new ScrollMagic.Controller();
const elements = document.querySelectorAll('.animate');
const scene = new ScrollMagic.Scene({
triggerElement: '#trigger',
duration: 500
})
.setClassToggle(elements, 'visible')
.addTo(controller);
Вместо создания отдельной сцены для каждого элемента, одна сцена управляет всеми сразу.
triggerHook и duration с умомПри работе с большим количеством элементов рекомендуется задавать минимально возможную длительность и точные триггеры.
Создание всех сцен сразу для длинных страниц с сотнями элементов приводит к высокой нагрузке на рендер. Решение — создавать сцены только когда они близки к видимости.
const elements = document.querySelectorAll('.animate');
elements.forEach(el => {
const observer = new IntersectionObserver((entries, obs) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
new ScrollMagic.Scene({
triggerElement: el,
duration: 300
})
.setClassToggle(el, 'visible')
.addTo(controller);
obs.unobserve(el);
}
});
});
observer.observe(el);
});
Такой подход снижает количество активных сцен и уменьшает нагрузку на обработку скролла.
tween вместо onEnter/onLeave для
сложных анимацийСоздание сцен с коллбэками onEnter и
onLeave для каждого элемента может привести к множественным
вызовам функций при быстром скролле. Более производительный способ —
использование GSAP-твинов или других CSS-анимаций,
которые ScrollMagic контролирует напрямую через
setTween.
const tween = gsap.to('.box', {x: 500, rotation: 360, duration: 1});
new ScrollMagic.Scene({
triggerElement: '.box',
duration: 400
})
.setTween(tween)
.addTo(controller);
Твины обрабатываются GPU и браузерными оптимизациями, что снижает нагрузку по сравнению с множественными JS-коллбэками.
Если элемент больше не нужен на странице или удаляется из DOM, важно отключать сцены, чтобы ScrollMagic не продолжал слушать события скролла для этих элементов:
scene.destroy(true); // true — удаляет все слушатели и сбрасывает изменения
Для сложных страниц с разными секциями можно создавать несколько контроллеров, каждый из которых управляет своей областью. Это снижает общий объём вычислений при скролле, так как каждая часть страницы обрабатывается локально.
const mainController = new ScrollMagic.Controller();
const sectionController = new ScrollMagic.Controller({container: '#section'});
// Сцены для основной страницы
new ScrollMagic.Scene({...}).addTo(mainController);
// Сцены для отдельной секции
new ScrollMagic.Scene({...}).addTo(sectionController);
Для оценки нагрузки рекомендуется использовать:
Цель — поддерживать минимум 50–60 кадров в секунду, иначе пользовательский опыт заметно ухудшается.
triggerHook.Эти методы позволяют ScrollMagic оставаться быстрым даже при работе с сотнями сцен и динамическим контентом.