ScrollMagic — это мощная библиотека для управления анимациями и событиями на странице в зависимости от прокрутки. В контексте видеоконтента она позволяет синхронизировать воспроизведение видео с прокруткой, создавать интерактивные эффекты и повышать вовлечённость пользователя без чрезмерной нагрузки на браузер. Основной подход заключается в использовании сцен (scenes) и контроллеров (controllers), которые отслеживают положение скролла и активируют определённые действия.
// Создание контроллера ScrollMagic
var controller = new ScrollMagic.Controller();
Для синхронизации видео с прокруткой требуется сначала получить
доступ к DOM-элементу <video>. Далее создаётся сцена,
которая будет управлять видео в зависимости от положения страницы.
var video = document.querySelector('#myVideo');
var scene = new ScrollMagic.Scene({
triggerElement: '#videoSection', // элемент, от которого начинается действие
duration: 1000 // протяжённость прокрутки для сцены
})
.addTo(controller)
.on('progress', function(e) {
video.currentTime = e.progress * video.duration;
});
Ключевые моменты:
triggerElement определяет, когда сцена становится
активной.duration задаёт диапазон прокрутки, в котором видео
будет синхронизировано.progress возвращает значение от 0 до 1, которое
удобно использовать для вычисления текущего времени видео.Видеоконтент может сильно нагружать страницу, особенно при большом разрешении и автозапуске. Для оптимизации следует использовать следующие приёмы:
Декодирование только при необходимости
Устанавливать preload="none" или
preload="metadata", чтобы браузер не загружал весь файл до
его активации:
<video id="myVideo" preload="metadata" muted>
<source src="video.mp4" type="video/mp4">
</video>Фрагментация длительности сцены Делить длинные
видео на несколько сцен с короткой продолжительностью, чтобы вычисления
currentTime происходили реже и точнее.
Использование requestAnimationFrame
Встроенное событие progress ScrollMagic не всегда идеально
синхронизируется с частотой кадров видео. Обернуть обновление
currentTime в requestAnimationFrame снижает
рывки:
scene.on('progress', function(e) {
requestAnimationFrame(() => {
video.currentTime = e.progress * video.duration;
});
});Lazy loading видео Загружать видео только при приближении к секции:
var lazyScene = new ScrollMagic.Scene({
triggerElement: '#videoSection',
triggerHook: 0.8
})
.on('enter', function() {
video.load();
})
.addTo(controller);ScrollMagic позволяет создавать сложные эффекты, когда видео не просто проигрывается, а изменяется визуально:
var tween = gsap.to("#myVideo", {opacity: 1, scale: 1.1});
var scene = new ScrollMagic.Scene({
triggerElement: "#videoSection",
duration: 500
})
.setTween(tween)
.addTo(controller);
filter: brightness() можно изменять через
сцены, создавая динамический визуальный эффект без изменения исходного
видеофайла.Для соблюдения современных требований браузеров рекомендуется:
muted для автозапуска.scene.on('leave', function() {
video.pause();
});
scene.on('enter', function() {
video.play();
});
controller.removeScene(scene);
ScrollMagic открывает возможности для:
Эти методы позволяют добиться плавной интеграции видео в интерактивный контент с минимальной нагрузкой на производительность и оптимизированным временем отклика браузера.