ScrollMagic предоставляет гибкий способ управления анимациями на
основе прокрутки страницы. Одним из мощных инструментов в современном
фронтенде является <canvas> — элемент HTML5,
позволяющий рендерить 2D и 3D графику напрямую в браузере. Интеграция
ScrollMagic с canvas открывает возможности для создания сложных
интерактивных эффектов, от динамических визуализаций до анимаций,
управляемых скроллом.
Взаимодействие ScrollMagic с canvas строится на двух ключевых принципах:
requestAnimationFrame — инструментом плавного обновления
кадров.Простейший пример интеграции начинается с инициализации контроллера и сцены:
// Создание контроллера ScrollMagic
const controller = new ScrollMagic.Controller();
// Выбор canvas и контекста
const canvas = document.querySelector("#myCanvas");
const ctx = canvas.getContext("2d");
// Настройка сцены
const scene = new ScrollMagic.Scene({
duration: 1000, // Длина сцены в пикселях прокрутки
triggerElement: "#trigger", // Элемент, при котором начинается сцена
triggerHook: 0.5 // Процент видимости, где сцена активируется
})
.addTo(controller);
// Событие обновления сцены
scene.on("progress", function(event) {
const progress = event.progress; // Значение от 0 до 1
draw(progress); // Передача прогресса в функцию рендеринга
});
Ключевой элемент интеграции — использование прогресса сцены для анимации элементов на canvas. Ниже пример плавного движения круга по оси X:
function draw(progress) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
const x = progress * canvas.width;
const y = canvas.height / 2;
const radius = 50;
ctx.beginPath();
ctx.arc(x, y, radius, 0, Math.PI * 2);
ctx.fillStyle = "#3498db";
ctx.fill();
ctx.closePath();
}
Особенности:
event.progress изменяется от 0 до 1, что позволяет
создавать синхронные анимации.clearRect используется для очистки предыдущего кадра,
предотвращая наложение.ScrollMagic позволяет создавать несколько сцен, каждая из которых управляет разными аспектами canvas:
const scene2 = new ScrollMagic.Scene({
duration: 500,
triggerElement: "#trigger2",
triggerHook: 0.7
})
.addTo(controller);
scene2.on("progress", function(event) {
const scale = 1 + event.progress;
drawCircle(scale);
});
function drawCircle(scale) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.arc(canvas.width / 2, canvas.height / 2, 50 * scale, 0, Math.PI * 2);
ctx.fillStyle = "#e74c3c";
ctx.fill();
ctx.closePath();
}
Таким образом, можно комбинировать несколько анимаций одновременно: перемещение, масштабирование, вращение, изменение цвета, формируя полноценные интерактивные истории.
Для сложных эффектов часто используют сторонние библиотеки, интегрируемые с ScrollMagic:
const tl = gsap.timeline({
scrollTrigger: {
trigger: "#trigger",
start: "top center",
end: "bottom center",
scrub: true
}
});
tl.to({}, {duration: 1, onUpdate: () => drawCircle(tl.progress())});
const app = new PIXI.Application({ width: 800, height: 600, view: canvas });
const circle = new PIXI.Graphics();
circle.beginFill(0x3498db);
circle.drawCircle(0, 0, 50);
circle.endFill();
app.stage.addChild(circle);
scene.on("progress", event => {
circle.x = event.progress * canvas.width;
});
Canvas часто используется для анимации спрайтов. ScrollMagic позволяет изменять индекс кадра спрайта в зависимости от прокрутки:
const sprite = new Image();
sprite.src = "sprite.png";
const frames = 10;
scene.on("progress", function(event) {
const frame = Math.floor(event.progress * (frames - 1));
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(sprite, frame * 100, 0, 100, 100, 50, 50, 100, 100);
});
Так можно создать эффект «скролл-анимации», где каждая прокрутка страницы соответствует новому кадру анимации.
Интеграция ScrollMagic с canvas превращает статические страницы в динамичные, интерактивные визуальные истории, где каждая прокрутка управляет рендерингом графики и анимации в реальном времени.