ScrollMagic предоставляет мощный механизм для создания анимаций, привязанных к скроллу, и одной из ключевых задач при работе с современными веб-приложениями является адаптивность. Контрольные точки (triggers) позволяют точно управлять моментом активации сцен в зависимости от размера экрана и устройства.
В ScrollMagic каждая сцена (Scene) может иметь параметр
triggerElement — DOM-элемент, при достижении которого
запускается сцена, и triggerHook — положение на экране, где
активируется триггер.
Пример базовой сцены:
var controller = new ScrollMagic.Controller();
var scene = new ScrollMagic.Scene({
triggerElement: "#section1",
triggerHook: 0.5 // срабатывание в середине экрана
})
.setClassToggle("#section1", "visible")
.addTo(controller);
Здесь triggerHook: 0.5 означает, что сцена активируется,
когда верхняя граница #section1 достигает 50%
высоты окна.
Чтобы сцена корректно работала на разных устройствах, важно
адаптировать triggerHook, offset и
другие параметры. Для этого часто используется проверка ширины окна
через window.innerWidth или медиазапросы в JS:
var triggerHookValue;
if (window.innerWidth < 768) {
triggerHookValue = 0.7; // для мобильных
} else if (window.innerWidth < 1200) {
triggerHookValue = 0.5; // для планшетов
} else {
triggerHookValue = 0.3; // для десктопов
}
var scene = new ScrollMagic.Scene({
triggerElement: "#section2",
triggerHook: triggerHookValue
})
.setClassToggle("#section2", "active")
.addTo(controller);
Использование динамического triggerHook
обеспечивает корректное срабатывание анимаций независимо от высоты
экрана.
offset для точной настройкиoffset позволяет смещать момент активации сцены
относительно верхней границы триггер-элемента:
var scene = new ScrollMagic.Scene({
triggerElement: "#section3",
triggerHook: 0.5,
offset: -50 // активировать на 50px раньше
})
.setClassToggle("#section3", "visible")
.addTo(controller);
Комбинация triggerHook и offset делает
контрольные точки максимально точными на любых экранах.
Для сложных проектов можно использовать функцию для вычисления параметров сцены на лету:
function getTriggerHook() {
if (window.innerWidth < 768) return 0.8;
if (window.innerWidth < 1200) return 0.6;
return 0.4;
}
var scene = new ScrollMagic.Scene({
triggerElement: "#section4",
triggerHook: getTriggerHook()
})
.setClassToggle("#section4", "visible")
.addTo(controller);
Такой подход позволяет централизованно управлять адаптивностью без дублирования кода для разных разрешений.
Для более сложных условий удобно применять объект
window.matchMedia:
var mqMobile = window.matchMedia("(max-width: 767px)");
var mqTablet = window.matchMedia("(min-width: 768px) and (max-width: 1199px)");
var triggerHookValue;
if (mqMobile.matches) {
triggerHookValue = 0.8;
} else if (mqTablet.matches) {
triggerHookValue = 0.6;
} else {
triggerHookValue = 0.4;
}
var scene = new ScrollMagic.Scene({
triggerElement: "#section5",
triggerHook: triggerHookValue
})
.setClassToggle("#section5", "visible")
.addTo(controller);
Использование matchMedia делает код более
читаемым и гибким, особенно при необходимости поддерживать
множество разрешений.
Для корректной работы анимаций при изменении размера окна важно пересоздавать сцены или обновлять их параметры:
window.addEventListener("resize", function() {
scene.triggerHook(getTriggerHook());
scene.refresh(); // пересчитывает позицию триггера
});
Метод refresh() гарантирует, что ScrollMagic правильно
пересчитает положение триггеров после изменения размера окна или
динамической загрузки контента.
scene.refresh() после изменения высоты элементов.offset и адаптивного
triggerHook позволяет добиться точного визуального эффекта
на всех устройствах.Контрольные точки в ScrollMagic — это не просто место срабатывания анимации, а инструмент для гибкой адаптивной настройки интерфейса. Корректное использование triggerHook, offset и медиазапросов обеспечивает плавные и предсказуемые анимации на любых экранах.