В ScrollMagic закрепление элемента на определённое время реализуется
через свойство duration сцены. Когда создаётся сцена с
закреплением, элемент фиксируется на экране в момент, когда триггер
достигает заданной позиции, и остаётся закреплённым на протяжении
указанной длительности.
var controller = new ScrollMagic.Controller();
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger", // элемент, при котором начинается закрепление
duration: 300 // длина закрепления в пикселях прокрутки
})
.setPin("#pinned-element") // элемент, который будет закреплён
.addTo(controller);
Пояснение ключевых параметров:
triggerElement — элемент, относительно которого
вычисляется начало сцены.duration — длина закрепления, измеряется в пикселях
прокрутки; если 0 или не указан, элемент закрепляется
только на момент входа триггера.setPin(element) — фиксирует элемент на время
сцены.При использовании duration ScrollMagic автоматически
создаёт пространственный «буфер», в котором элемент остаётся
закреплённым, после чего он возвращается в обычное поведение.
Закрепление можно комбинировать с анимациями через
TweenMax или GSAP. Например, элемент может
менять прозрачность или масштаб во время закрепления.
var tween = TweenMax.to("#pinned-element", 1, {scale: 1.5, opacity: 0.5});
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 400
})
.setTween(tween)
.setPin("#pinned-element")
.addTo(controller);
В данном примере:
tween.pushFollowersПо умолчанию закрепление элемента «толкает» последующие элементы
вниз, создавая эффект сдвига контента. Это поведение можно
контролировать с помощью опции pushFollowers.
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 300,
pushFollowers: false
})
.setPin("#pinned-element")
.addTo(controller);
pushFollowers: true (по умолчанию) — последующие
элементы сдвигаются вниз на время закрепления.pushFollowers: false — закрепление не влияет на
положение соседних элементов.Иногда длительность сцены должна зависеть от размера контента или
других условий. В ScrollMagic duration можно задавать как
функцию:
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: function() {
return document.querySelector("#content").offsetHeight;
}
})
.setPin("#pinned-element")
.addTo(controller);
Функция возвращает значение пикселей, позволяя динамически подстраивать длительность закрепления под изменяющийся контент.
Можно создавать несколько сцен с различными длительностями и триггерами, чтобы один элемент закреплялся поэтапно в разных частях страницы.
var scene1 = new ScrollMagic.Scene({
triggerElement: "#section1",
duration: 200
})
.setPin("#pinned-element")
.addTo(controller);
var scene2 = new ScrollMagic.Scene({
triggerElement: "#section2",
duration: 400
})
.setPin("#pinned-element")
.addTo(controller);
Каждая сцена независимо управляет закреплением, а ScrollMagic автоматически обрабатывает пересечения.
will-change: transform для элементов, которые закрепляются,
чтобы браузер оптимизировал рендеринг.#pinned-element {
will-change: transform;
}
События сцены позволяют реагировать на начало и конец закрепления:
scene.on("enter", function() {
console.log("Элемент закреплён");
});
scene.on("leave", function() {
console.log("Элемент откреплён");
});
enter срабатывает при достижении триггера.leave срабатывает, когда сцена завершает свой
прогресс.Эти события полезны для запуска дополнительных эффектов, например, изменения классов или активации анимаций соседних блоков.
Для закрепления элемента на весь видимый экран можно задать
duration: "100%":
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: "100%"
})
.setPin("#full-screen-element")
.addTo(controller);