В ScrollMagic сцена (Scene) — это объект, который
определяет участок страницы, на котором будут происходить анимации или
другие действия. Условная активация сцены позволяет
запускать эти действия только при выполнении определённых условий,
например, при достижении определённого элемента, при определённой ширине
окна или при совпадении состояния приложения.
Ключевым элементом является свойство triggerElement и
метод on, через которые задаются условия появления сцены и
реакция на события.
var controller = new ScrollMagic.Controller();
var scene = new ScrollMagic.Scene({
triggerElement: "#section1",
triggerHook: 0.5, // Сцена активируется, когда элемент достигает середины экрана
duration: 300 // Длительность сцены по прокрутке
})
.on("enter", function (event) {
if (window.innerWidth > 768) { // Условие: ширина окна больше 768px
document.querySelector("#section1").classList.add("active");
}
})
.on("leave", function (event) {
document.querySelector("#section1").classList.remove("active");
})
.addTo(controller);
Ключевые моменты:
triggerHook определяет точку появления сцены на экране:
0 — верх экрана, 1 — низ, 0.5 —
центр.enter срабатывает при достижении
triggerElement.leave срабатывает при уходе элемента за пределы
активации.Для условной активации можно использовать проверку видимости элемента в области видимости окна:
function isElementVisible(el) {
var rect = el.getBoundingClientRect();
return rect.top >= 0 && rect.bottom <= window.innerHeight;
}
var scene = new ScrollMagic.Scene({
triggerElement: "#feature",
triggerHook: 1,
})
.on("enter", function () {
var elem = document.querySelector("#feature");
if (isElementVisible(elem)) {
elem.classList.add("highlight");
}
})
.addTo(controller);
Особенности подхода:
getBoundingClientRect() возвращает координаты
относительно окна браузера.В сложных интерфейсах часто требуется активировать несколько сцен в зависимости от состояния страницы:
var sections = document.querySelectorAll(".section");
sections.forEach(function(section) {
var scene = new ScrollMagic.Scene({
triggerElement: section,
triggerHook: 0.7,
duration: 200
})
.on("enter", function () {
if (!section.classList.contains("animated")) {
section.classList.add("animated");
}
})
.on("leave", function () {
section.classList.remove("animated");
})
.addTo(controller);
});
Важные моменты:
forEach позволяет создавать сцены динамически для
всех элементов с одинаковым классом.События сцены могут зависеть не только от положения элемента, но и от пользовательского состояния:
var userLoggedIn = true;
var scene = new ScrollMagic.Scene({
triggerElement: "#premium-content",
triggerHook: 0.6
})
.on("enter", function () {
if (userLoggedIn) {
document.querySelector("#premium-content").classList.add("visible");
}
})
.addTo(controller);
Примечание:
Условная активация часто используется вместе с анимациями через
GSAP (TweenMax / TweenLite):
var scene = new ScrollMagic.Scene({
triggerElement: "#animate-box",
triggerHook: 0.8,
duration: 400
})
.on("enter", function () {
if (window.innerHeight > 600) {
TweenMax.to("#animate-box", 1, {opacity: 1, y: 0});
}
})
.addTo(controller);
Особенности интеграции:
enter позволяет запускать анимацию
только при подходящих условиях.В некоторых случаях сцены создаются заранее, но активируются только после выполнения условий:
var scene = new ScrollMagic.Scene({
triggerElement: "#delayed-section",
triggerHook: 0.5
});
function enableScene() {
if (window.innerWidth > 1024) {
scene.addTo(controller);
}
}
window.addEventListener("resize", enableScene);
enableScene();
Применение:
.active,
.animated) для предотвращения повторного срабатывания
анимации.Условная активация сцен в ScrollMagic — мощный инструмент, который позволяет создавать динамичные, адаптивные и производительные интерфейсы, реагирующие на положение элементов, размер окна, пользовательские состояния и сложные условия одновременно.