В ScrollMagic сцена (Scene) является основной единицей,
которая связывает прокрутку с действиями на странице. Управление
массивами сцен позволяет эффективно структурировать сложные анимации,
особенно когда количество интерактивных элементов велико. Работа с
массивами сцен подразумевает создание, настройку и синхронное управление
группой сцен, что повышает читаемость кода и упрощает масштабирование
проектов.
Чаще всего массив сцен формируется динамически, используя циклы или функции генерации. Стандартная практика заключается в том, чтобы хранить все сцены в одном массиве для удобного доступа и управления:
// Массив для хранения сцен
const scenes = [];
// Создание нескольких сцен через цикл
const triggers = document.querySelectorAll('.trigger');
triggers.forEach((trigger, index) => {
const scene = new ScrollMagic.Scene({
triggerElement: trigger,
duration: 200,
offset: 50 * index
})
.setClassToggle(trigger, 'active')
.addTo(controller);
scenes.push(scene);
});
Ключевые моменты:
scenes.duration и offset могут быть
динамическими, зависящими от индекса элемента.После создания массива сцен можно выполнять массовые операции: включение, отключение или удаление сцен, добавление событий и изменение параметров.
// Отключение всех сцен
scenes.forEach(scene => scene.enabled(false));
// Включение всех сцен
scenes.forEach(scene => scene.enabled(true));
Метод .enabled() позволяет временно приостанавливать
обработку сцены без её удаления из контроллера.
Для удаления всех сцен из контроллера и освобождения ресурсов
используется метод .remove():
scenes.forEach(scene => scene.remove());
scenes.length = 0; // очистка массива
События сцены (enter, leave,
start, end) можно назначать индивидуально или
массово:
scenes.forEach(scene => {
scene.on('enter', function(event) {
console.log('Сцена активирована:', event.target.triggerElement());
});
});
Важно: Использование единого обработчика для массива сцен упрощает поддержку и уменьшает дублирование кода.
Иногда требуется изменить параметры сцен после их создания, например, при изменении размера окна:
window.addEventListener('resize', () => {
scenes.forEach((scene, index) => {
scene.duration(200 + index * 50); // изменение продолжительности
scene.offset(30 * index); // изменение смещения
scene.refresh(); // обновление состояния
});
});
Метод .refresh() пересчитывает позиции триггеров и
длительность, что критично для адаптивного дизайна.
Использование массивов сцен позволяет синхронизировать анимации нескольких элементов:
scenes.forEach((scene, index) => {
scene.on('enter', () => {
gsap.to(scene.triggerElement(), {
opacity: 1,
x: index * 50,
duration: 1
});
});
});
Особенности:
Массив сцен может содержать сотни объектов. Для выборочной работы применяются методы фильтрации и поиска:
const activeScenes = scenes.filter(scene => scene.enabled());
activeScenes.forEach(scene => {
scene.setClassToggle(scene.triggerElement(), 'highlight');
});
Такой подход удобен для выборочного включения анимаций или применения специальных эффектов.
Для больших проектов сцены можно группировать по категориям:
const headerScenes = [];
const sectionScenes = [];
document.querySelectorAll('.header-trigger').forEach(el => {
headerScenes.push(new ScrollMagic.Scene({ triggerElement: el }).addTo(controller));
});
document.querySelectorAll('.section-trigger').forEach(el => {
sectionScenes.push(new ScrollMagic.Scene({ triggerElement: el }).addTo(controller));
});
Это позволяет управлять сценами отдельно, например, отключать все сцены заголовков без влияния на основной контент.
Эффективное управление массивами сцен обеспечивает гибкость, производительность и структурированность кода при реализации сложных прокруточных анимаций.