В ScrollMagic концепция бесконечной длительности
сцены используется для того, чтобы действие или анимация
оставались активными на протяжении всего скролла страницы. В отличие от
стандартной сцены с фиксированным duration, бесконечная
сцена не имеет ограничений по длине и реагирует на скролл в реальном
времени до конца документа или родительского контейнера.
В ScrollMagic это реализуется путем установки свойства
duration в значение 0 или отсутствия явного
указания длительности. Важный момент: сцена без длительности по
умолчанию срабатывает в момент попадания в триггерную точку и прекращает
действие сразу после её прохождения, поэтому для бесконечной
активности следует использовать специальные настройки.
// Инициализация контроллера
var controller = new ScrollMagic.Controller();
// Создание сцены без ограничений по длительности
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger", // Элемент, от которого начинается сцена
triggerHook: 0, // Положение триггера на экране (0 - верх)
duration: Infinity // Бесконечная длительность
})
.setClassToggle("#animate", "active") // Применение класса при активации
.addTo(controller);
Ключевые моменты:
triggerElement — элемент DOM, с которого начинается
активация сцены.triggerHook — определяет положение триггера на экране
(0 — верх, 1 — низ, 0.5 — центр).duration: Infinity — задаёт бесконечную длительность.
Можно также динамически рассчитывать длину через функции или размеры
документа.Иногда необходимо, чтобы длительность сцены зависела от контента
страницы или размеров окна. ScrollMagic поддерживает передачу функции в
duration:
var scene = new ScrollMagic.Scene({
triggerElement: "#section",
duration: function() {
return document.body.scrollHeight - window.innerHeight;
}
})
.setPin("#section") // Фиксация элемента на весь скролл
.addTo(controller);
Пояснение:
duration вычисляет длину сцены в пикселях на
основе текущей высоты документа.Бесконечная сцена часто комбинируется с setPin(). Это
позволяет закрепить элемент на экране на протяжении всего скролла или на
определённой длине. Пример с бесконечной фиксацией:
var scene = new ScrollMagic.Scene({
triggerElement: "#header",
duration: Infinity,
triggerHook: 0
})
.setPin("#header")
.addTo(controller);
Элемент #header останется закрепленным на экране при
прокрутке всей страницы.
Особенности:
triggerHook: 0, чтобы элемент фиксировался в верхней части
экрана.Бесконечная сцена часто применяется совместно с анимациями
GreenSock (GSAP) или CSS-анимациями. Для непрерывного эффекта
можно использовать tween без ограничения времени:
var tween = gsap.to("#ball", {
y: "100vh",
ease: "linear",
repeat: -1
});
var scene = new ScrollMagic.Scene({
triggerElement: "#container",
duration: Infinity
})
.setTween(tween)
.addTo(controller);
Пояснения:
repeat: -1 в GSAP делает анимацию бесконечной.setTween может управлять
анимацией плавно на протяжении всего документа.triggerHook и offsetДаже для бесконечных сцен важно правильно настраивать положение триггера:
triggerHook: 0 — сцена активируется при попадании
элемента в верхнюю часть окна.triggerHook: 1 — активация при попадании элемента в
нижнюю часть окна.offset — позволяет сместить точку срабатывания
относительно триггера, например:var scene = new ScrollMagic.Scene({
triggerElement: "#start",
triggerHook: 0.5,
offset: 100,
duration: Infinity
})
.setClassToggle("#element", "highlight")
.addTo(controller);
pin и
tween: позволяет создавать эффект «прилипших»
элементов и бесконечно проигрываемых анимаций.Бесконечная длительность сцены в ScrollMagic — мощный инструмент для создания эффектов, где элемент или анимация должны оставаться активными на протяжении всего скролла или на динамически вычисляемой длине. Такой подход позволяет строить сложные интерактивные интерфейсы с плавной и непрерывной анимацией элементов.