Библиотека ScrollMagic позволяет связывать прокрутку страницы с анимацией элементов. Покадровая перемотка (frame-by-frame animation) реализуется через управление кадрами анимации в зависимости от текущей позиции скролла. Основной подход заключается в синхронизации прокрутки страницы с изменением состояния элемента, например, последовательностью изображений или анимацией canvas.
Для управления покадровой анимацией необходимо создать контроллер и сцену:
var controller = new ScrollMagic.Controller();
var scene = new ScrollMagic.Scene({
triggerElement: "#animation-container", // элемент, при котором начинается анимация
duration: 1000, // длина анимации в пикселях прокрутки
triggerHook: 0 // момент старта анимации относительно viewport
})
.setPin("#animation-container") // закрепление элемента на время анимации
.addTo(controller);
Пояснения ключевых параметров:
triggerElement — DOM-элемент, который инициирует начало
сцены.duration — длина сцены в пикселях прокрутки. Для
покадровой перемотки этот параметр напрямую влияет на скорость смены
кадров.triggerHook — точка запуска сцены относительно видимой
части окна. Значение 0 соответствует верхней границе,
1 — нижней.setPin() закрепляет элемент на экране на протяжении всей
сцены, позволяя проигрывать анимацию, не двигая сам элемент.
Для покадровой анимации чаще всего используется массив изображений, загруженных заранее. При скролле выбирается соответствующий кадр из массива:
var images = [];
for (var i = 1; i <= 60; i++) {
images.push("frames/frame" + i + ".jpg");
}
var imgElement = document.getElementById("frame-image");
scene.on("progress", function(event) {
var frameIndex = Math.floor(event.progress * (images.length - 1));
imgElement.src = images[frameIndex];
});
Ключевые моменты:
event.progress возвращает значение от 0 до 1,
соответствующее текущей позиции скролла внутри сцены.Math.floor(event.progress * (images.length - 1))
определяет индекс текущего кадра, плавно изменяя его по мере
прокрутки.Анимация через <canvas> позволяет эффективнее
управлять большим количеством кадров и изменять их свойства
динамически:
var canvas = document.getElementById("animation-canvas");
var context = canvas.getContext("2d");
var frames = [];
for (var i = 1; i <= 100; i++) {
var img = new Image();
img.src = "frames/frame" + i + ".png";
frames.push(img);
}
scene.on("progress", function(event) {
var index = Math.floor(event.progress * (frames.length - 1));
context.clearRect(0, 0, canvas.width, canvas.height);
context.drawImage(frames[index], 0, 0, canvas.width, canvas.height);
});
Преимущества canvas:
Помимо смены изображений, ScrollMagic позволяет управлять CSS-свойствами через прогресс сцены. Это полезно для покадровой анимации с элементами SVG или блоками DOM:
scene.on("progress", function(event) {
var rotation = event.progress * 360; // вращение элемента
var scale = 1 + event.progress * 0.5; // масштабирование
document.getElementById("animated-box").style.transform =
"rotate(" + rotation + "deg) scale(" + scale + ")";
});
Особенности:
ScrollMagic тесно интегрируется с GSAP для плавных анимаций:
var tween = gsap.to("#animated-box", {rotation: 360, duration: 1, ease: "none"});
var scene = new ScrollMagic.Scene({
triggerElement: "#animation-container",
duration: 1000
})
.setTween(tween)
.addTo(controller);
setPin только для ключевых элементов,
чтобы не перегружать браузер.Эта методика позволяет создавать плавные, интерактивные и отзывчивые анимации, полностью синхронизированные с прокруткой, используя возможности ScrollMagic и современные подходы к рендерингу в браузере.