При работе с библиотекой ScrollMagic критически важно учитывать производительность устройства. Сложные анимации, многочисленные сцены и обработка прокрутки в реальном времени могут заметно замедлять работу интерфейса на слабых устройствах. Определение возможностей устройства позволяет выбирать, какие эффекты запускать, а какие — временно отключать, чтобы сохранить плавность взаимодействия.
Проверка мощности процессора Можно использовать
объект navigator.hardwareConcurrency, который возвращает
количество логических ядер процессора. Устройства с 2 ядрами или меньше
часто испытывают трудности с плавной анимацией больших сцен.
const isLowPerformance = navigator.hardwareConcurrency <= 2;Определение поддержки WebGL Для сложных анимаций, особенно с библиотеками вроде GSAP, важно наличие аппаратного ускорения. Проверка WebGL:
function isWebGLSupported() {
try {
const canvas = document.createElement('canvas');
return !!window.WebGLRenderingContext &&
(canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));
} catch(e) {
return false;
}
}Оценка ширины экрана и устройства Малые экраны смартфонов часто требуют упрощенных анимаций. Можно использовать:
const isSmallDevice = window.innerWidth < 768;Для отключения эффектов на слабых устройствах применяются следующие подходы:
Прерывание создания сцен Если устройство определяется как слабое, создание сцен можно полностью пропустить:
if (!isLowPerformance && isWebGLSupported() && !isSmallDevice) {
const controller = new ScrollMagic.Controller();
const scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 500
})
.setTween("#animate", {opacity: 1, y: -100})
.addTo(controller);
}Упрощение анимаций Вместо сложных трансформаций с несколькими свойствами можно ограничиться одной анимацией:
const simpleTween = TweenMax.to("#animate", 1, {opacity: 1});
Это снижает нагрузку на процессор и GPU.
Отключение анимаций при малой скорости
соединения Через API NetworkInformation можно
ограничивать тяжелые эффекты для пользователей с медленным
интернетом:
const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
const slowConnection = connection && connection.effectiveType.includes('2g');
if (!slowConnection) {
// Создание сложных сцен ScrollMagic
}ScrollMagic.Controller предоставляет методы для динамического включения и отключения сцен:
scene.enabled(false) — временно отключает сцену.scene.destroy(true) — полностью удаляет сцену и очищает
слушатели событий.Пример динамического отключения при уменьшении производительности:
const controller = new ScrollMagic.Controller();
const scene = new ScrollMagic.Scene({triggerElement: "#trigger", duration: 500})
.setTween("#animate", {opacity: 1, y: -100})
.addTo(controller);
if (isLowPerformance || isSmallDevice) {
scene.enabled(false); // анимация не будет выполняться
}
Можно интегрировать ScrollMagic с CSS-медиа-запросами, чтобы анимации запускались только на определенных разрешениях:
function initScene() {
if (window.matchMedia("(min-width: 1024px)").matches) {
const controller = new ScrollMagic.Controller();
new ScrollMagic.Scene({triggerElement: "#trigger", duration: 500})
.setTween("#animate", {opacity: 1, y: -100})
.addTo(controller);
}
}
window.addEventListener('resize', initScene);
initScene();
Таким образом, на мобильных устройствах и слабых ноутбуках тяжелые сцены не создаются, что существенно повышает общую производительность страницы.
setTween с множеством
свойств на слабых устройствах.scene.enabled(false) вместо полного
удаления, если планируется повторное включение анимации.requestAnimationFrame и throttling событий прокрутки.Эти методы позволяют гибко управлять визуальными эффектами ScrollMagic и поддерживать стабильную работу на всех типах устройств.