ScrollMagic — библиотека для управления анимациями при скролле, которая активно использует внутренние механизмы браузера для отслеживания позиций элементов и выполнения сцен. Эффективное кеширование в ScrollMagic позволяет минимизировать перерасчёты и повысить производительность, особенно при сложных анимациях на длинных страницах.
Ключевое понятие: кеширование — это сохранение промежуточных данных (например, размеров и позиций элементов, состояния сцен) для повторного использования без повторного вычисления.
ScrollMagic постоянно обращается к DOM, чтобы определить текущую
позицию элементов и контейнеров. Каждое обращение к
getBoundingClientRect или offsetTop может быть
затратным, особенно при множестве сцен на странице. Для оптимизации
ScrollMagic использует кеширование:
var controller = new ScrollMagic.Controller();
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 300
})
.setClassToggle("#animate", "active")
.addTo(controller);
В этом примере triggerElement вычисляется один раз при
инициализации сцены и сохраняется в памяти. Если размеры страницы
изменяются, необходимо вызвать метод
controller.update(true), чтобы пересчитать кешированные
значения.
controller.update(force)Метод обновляет позиции и размеры всех сцен. Параметр
force заставляет пересчитать кеш даже без изменений DOM.
Это важно после динамических изменений контента:
controller.update(true); // Принудительное обновление кеша
scene.refresh()Обновляет данные конкретной сцены:
scene.refresh();
Используется, когда только одна сцена изменяется, вместо полного обновления всех сцен.
Для повышения производительности при большом количестве элементов можно использовать ленивое кеширование:
var scene = new ScrollMagic.Scene({
triggerElement: function() {
return document.querySelector("#lazy-trigger");
}
});
Функция возвращает элемент только при необходимости, позволяя ScrollMagic кешировать значение один раз и не держать прямую ссылку на элемент до его первого использования.
ScrollMagic хранит состояние сцены (active,
progress, triggered) для каждой анимации. Это
позволяет:
enter, leave и
progress.scene.on("progress", function(event) {
console.log("Текущий прогресс:", event.progress);
});
Внутри библиотеки event.progress обновляется из кеша и
не требует вычислений каждый кадр.
Минимизация количества сцен Чем меньше сцен, тем меньше объектов кешируется. Объединение связанных анимаций в одну сцену снижает нагрузку.
Использование triggerHook с фиксированными
значениями Постоянные значения, такие как 0 или
1, позволяют ScrollMagic кешировать позиции один
раз.
Принудительное обновление при динамическом
контенте После загрузки изображений, AJAX-запросов или
изменения DOM вызывать controller.update(true).
Ленивое создание сцен Создавать сцену только когда она реально понадобится в видимой области страницы, снижая объём кеша в начале.
При использовании GSAP или Velocity.js
ScrollMagic кеширует объекты анимации. Это означает:
tween создаётся один раз и не пересоздаётся при каждом
скролле.var tween = gsap.to("#animate", {x: 300, duration: 1});
var scene = new ScrollMagic.Scene({triggerElement: "#trigger"})
.setTween(tween)
.addTo(controller);
Необновлённые позиции после изменения DOM Если контент динамически добавляется или изменяется, кеш может быть устаревшим, что приведёт к неверной активации сцен.
Пересоздание сцен без необходимости Это ломает преимущества кеша и повышает нагрузку на браузер.
Излишняя глубина DOM-дерева Сложные структуры
замедляют вычисление getBoundingClientRect, даже при
кешировании.
update и refresh управляют
принудительным обновлением кеша.Правильное использование кеширования в ScrollMagic критично для плавной работы сложных скролл-анимаций и больших страниц.