В ScrollMagic закрепление элементов (pinning) позволяет фиксировать
DOM-элемент на экране на определённый промежуток времени во время
прокрутки страницы. Закреплённый элемент остаётся видимым и неподвижным
относительно окна просмотра, пока сцена, к которой он привязан, активна.
Для закрепления используется метод .setPin() объекта
сцены.
const controller = new ScrollMagic.Controller();
const scene = new ScrollMagic.Scene({
triggerElement: "#section1",
duration: 300
})
.setPin("#pinElement")
.addTo(controller);
Ключевые моменты:
triggerElement — элемент, при появлении которого
начинается сцена.duration — длина сцены в пикселях, в течение которой
элемент будет закреплён..setPin() принимает селектор или
DOM-элемент.Закрепление элемента автоматически прекращается после завершения сцены. Однако ScrollMagic предоставляет дополнительную гибкость:
pushFollowers — если установлено
true, элемент занимает место в потоке документа, не
накладываясь на последующие элементы. Если false,
закрепление может перекрывать контент.scene.setPin("#pinElement", { pushFollowers: true });
Иногда необходимо освобождать закреплённый элемент вручную до
окончания сцены. Для этого используется метод
.removePin():
scene.removePin(true);
Параметры:
reset — логическое значение. Если true,
ScrollMagic возвращает элемент в исходное положение на странице. Если
false, элемент остаётся на месте в момент удаления
закрепления.Можно динамически изменять закрепление во время прокрутки, создавая несколько сцен для одного элемента. Пример:
const scene1 = new ScrollMagic.Scene({
triggerElement: "#startPin",
duration: 200
})
.setPin("#dynamicPin")
.addTo(controller);
const scene2 = new ScrollMagic.Scene({
triggerElement: "#endPin"
})
.on("enter", function() {
scene1.removePin();
})
.addTo(controller);
scene1 закрепляет элемент на 200px прокрутки.scene2 снимает закрепление при достижении следующего
триггерного элемента.Закрепление элементов не конфликтует с анимациями, управляемыми, например, с помощью GSAP. Для этого закрепленный элемент может быть анимирован одновременно с прокруткой:
const tween = gsap.to("#pinElement", { y: 200, duration: 1 });
const scene = new ScrollMagic.Scene({
triggerElement: "#section1",
duration: 400
})
.setTween(tween)
.setPin("#pinElement")
.addTo(controller);
pushFollowers: false.Закрепление элемента может повлиять на layout страницы:
pushFollowers, может
перекрывать контент.pushFollowers: true сохраняет пространство,
но может требовать корректировки высоты контейнера для плавной
прокрутки.Если контент страницы изменяется после создания сцены (например,
добавляются изображения или блоки), важно обновлять сцены через
controller.update():
controller.update(true);
Это позволяет ScrollMagic пересчитать размеры сцены и правильно управлять закреплением и освобождением элементов.
ScrollMagic предоставляет события, которые помогают отслеживать состояние pin:
pin — вызывается при закреплении элемента.unpin — вызывается при освобождении элемента.scene.on("pin", function() {
console.log("Элемент закреплён");
});
scene.on("unpin", function() {
console.log("Элемент освобождён");
});
Эти события особенно полезны при сложных интерфейсах с множественными закрепленными блоками, когда важно точно знать момент закрепления и освобождения для синхронизации анимаций и контента.