Для управления анимацией появления и затухания элементов при скролле используется объект Scene из библиотеки ScrollMagic. Каждая сцена привязывается к конкретному элементу или позиции на странице и задаёт параметры, определяющие, когда и как будет происходить анимация.
Пример базового подключения:
// Инициализация контроллера ScrollMagic
const controller = new ScrollMagic.Controller();
// Создание сцены для абзаца
const scene = new ScrollMagic.Scene({
triggerElement: "#paragraph1", // Элемент, к которому привязана сцена
triggerHook: 0.8, // Момент появления (0 - верх окна, 1 - низ окна)
duration: 200 // Длительность действия сцены
})
.setClassToggle("#paragraph1", "visible") // Добавление класса при активации сцены
.addTo(controller);
Ключевой момент: triggerHook управляет
точкой, в которой сцена активируется, а duration задаёт,
насколько долго будет действовать эффект затухания или появления.
ScrollMagic часто работает в связке с CSS-анимациями для плавного появления текста. Для этого можно использовать классы с переходами (transition) и свойством opacity.
#paragraph1 {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}
#paragraph1.visible {
opacity: 1;
transform: translateY(0);
}
Особенности:
translateY создаёт ощущение движения снизу
вверх.opacity плавно увеличивается от 0 до 1, создавая
затухание.transition определяет скорость и стиль анимации.Для блоков текста, состоящих из нескольких абзацев, можно создать отдельные сцены для каждого абзаца. Это позволяет добиться эффекта последовательного появления.
const paragraphs = document.querySelectorAll(".fade-paragraph");
paragraphs.forEach((para, index) => {
new ScrollMagic.Scene({
triggerElement: para,
triggerHook: 0.85,
offset: 50 * index // Смещение для последовательности
})
.setClassToggle(para, "visible")
.addTo(controller);
});
Примечание: использование offset
позволяет контролировать задержку между появлением абзацев, создавая
эффект каскадного появления.
ScrollMagic позволяет не только появляться элементам, но и исчезать
при скролле вверх. Для этого используется метод
.reverse(true) или настройка setClassToggle с
CSS-анимацией, включающей обратное затухание.
.fade-paragraph {
opacity: 0;
transition: opacity 0.5s ease-out;
}
.fade-paragraph.visible {
opacity: 1;
}
new ScrollMagic.Scene({
triggerElement: "#paragraph2",
triggerHook: 0.9
})
.setClassToggle("#paragraph2", "visible")
.reverse(true) // Позволяет элементу исчезать при скролле вверх
.addTo(controller);
Ключевой момент: reverse(true)
обеспечивает обратное снятие класса, что создаёт эффект исчезновения
текста.
Для более сложных анимаций можно подключать GSAP (TweenMax или TweenLite). ScrollMagic позволяет привязывать анимации напрямую к сценам.
const tween = gsap.from("#paragraph3", {opacity: 0, y: 50, duration: 1});
new ScrollMagic.Scene({
triggerElement: "#paragraph3",
triggerHook: 0.85,
reverse: false
})
.setTween(tween)
.addTo(controller);
Преимущества использования GSAP:
opacity, scale, rotate).timeline.Для текста из нескольких абзацев или строк можно создать цепочку анимаций с помощью GSAP Timeline.
const timeline = gsap.timeline();
timeline.from("#para1", {opacity: 0, y: 20, duration: 0.5})
.from("#para2", {opacity: 0, y: 20, duration: 0.5}, "-=0.3")
.from("#para3", {opacity: 0, y: 20, duration: 0.5}, "-=0.3");
new ScrollMagic.Scene({
triggerElement: "#text-block",
triggerHook: 0.8
})
.setTween(timeline)
.addTo(controller);
Особенности:
"-=0.3" позволяет запускать следующую анимацию раньше
окончания предыдущей, создавая эффект плавного наложения.triggerHook в диапазоне 0.7–0.9 для
естественного появления текста при скролле.offset для тонкой настройки времени.reverse и CSS-анимации на плавность.