Появление полей формы при прокрутке — один из распространённых приёмов в современных интерфейсах. Он позволяет постепенно вовлекать пользователя, снижает визуальную перегрузку и делает взаимодействие более динамичным. Библиотека ScrollMagic предоставляет удобные инструменты для реализации подобных сценариев, управляя состояниями элементов в зависимости от позиции прокрутки.
Ключевая идея заключается в том, что элементы формы (input, textarea, select, кнопки) изначально скрыты или находятся в неактивном состоянии, а затем появляются или анимируются при достижении определённой точки на странице.
Форма разбивается на отдельные блоки, каждый из которых будет анимироваться независимо:
<form class="contact-form">
<div class="form-group" id="field-name">
<input type="text" placeholder="Имя">
</div>
<div class="form-group" id="field-email">
<input type="email" placeholder="Email">
</div>
<div class="form-group" id="field-message">
<textarea placeholder="Сообщение"></textarea>
</div>
<div class="form-group" id="field-submit">
<button type="submit">Отправить</button>
</div>
</form>
Каждому блоку задаётся уникальный идентификатор или класс для последующего управления.
Перед анимацией элементы должны быть скрыты или смещены:
.form-group {
opacity: 0;
transform: translateY(50px);
transition: all 0.6s ease;
}
.form-group.visible {
opacity: 1;
transform: translateY(0);
}
Ключевые параметры:
opacity — отвечает за плавное появлениеtransform — создаёт эффект движенияtransition — обеспечивает анимацию без дополнительных
библиотекПодключение контроллера — базовый шаг для работы со сценами:
const controller = new ScrollMagic.Controller();
Контроллер отслеживает прокрутку и управляет всеми сценами.
Каждое поле формы получает собственную сцену. Это позволяет управлять последовательностью появления:
document.querySelectorAll('.form-group').forEach((field) => {
new ScrollMagic.Scene({
triggerElement: field,
triggerHook: 0.9,
reverse: false
})
.setClassToggle(field, 'visible')
.addTo(controller);
});
triggerElement Элемент, при достижении которого запускается сцена.
triggerHook Позиция на экране, где происходит срабатывание:
0 — верх экрана1 — низ экрана Значение 0.9 означает, что
элемент почти полностью вошёл в область видимости.reverse
false — анимация выполняется один разtrue — анимация повторяется при прокрутке вверхsetClassToggle Добавляет или удаляет класс, управляющий CSS-анимацией.
Для более плавного UX используется задержка между элементами:
document.querySelectorAll('.form-group').forEach((field, index) => {
new ScrollMagic.Scene({
triggerElement: field,
triggerHook: 0.9,
reverse: false
})
.on("enter", () => {
setTimeout(() => {
field.classList.add('visible');
}, index * 200);
})
.addTo(controller);
});
Каждое следующее поле появляется с задержкой:
ScrollMagic часто применяется совместно с GSAP для более гибких эффектов:
document.querySelectorAll('.form-group').forEach((field) => {
const tween = gsap.fromTo(field,
{ opacity: 0, y: 50 },
{ opacity: 1, y: 0, duration: 0.6 }
);
new ScrollMagic.Scene({
triggerElement: field,
triggerHook: 0.85,
reverse: false
})
.setTween(tween)
.addTo(controller);
});
Преимущества GSAP:
Иногда требуется, чтобы вся форма появлялась сразу:
new ScrollMagic.Scene({
triggerElement: ".contact-form",
triggerHook: 0.8,
reverse: false
})
.setClassToggle(".contact-form", "visible")
.addTo(controller);
В этом случае анимация применяется к контейнеру, а не к отдельным элементам.
Часто поля формы делают неактивными до появления:
.form-group input,
.form-group textarea {
pointer-events: none;
}
.form-group.visible input,
.form-group.visible textarea {
pointer-events: auto;
}
Это предотвращает взаимодействие с невидимыми элементами.
При большом количестве сцен важно учитывать оптимизацию:
reverse, если повторная анимация не
нужнаПоля формы могут появляться внутри закреплённой секции:
new ScrollMagic.Scene({
triggerElement: ".form-section",
duration: 500
})
.setPin(".form-section")
.addTo(controller);
Это создаёт эффект, при котором форма остаётся на месте, а поля появляются по мере прокрутки.
ScrollMagic предоставляет встроенные индикаторы:
scene.addIndicators();
Они показывают:
Используется только в режиме разработки.
1. Неправильный triggerHook Слишком маленькое значение приводит к преждевременному запуску.
2. Отсутствие высоты страницы Если контента мало, сцены могут не срабатывать.
3. Конфликты CSS-анимаций Переходы
(transition) и GSAP-анимации не должны дублировать друг
друга.
4. Множественные контроллеры Создание нескольких
ScrollMagic.Controller() без необходимости снижает
производительность.
Динамическое добавление полей
const newField = document.createElement('div');
newField.classList.add('form-group');
document.querySelector('.contact-form').appendChild(newField);
new ScrollMagic.Scene({
triggerElement: newField,
triggerHook: 0.9
})
.setClassToggle(newField, 'visible')
.addTo(controller);
Появление с изменением масштаба
.form-group {
transform: scale(0.8);
}
.form-group.visible {
transform: scale(1);
}
Плавное проявление с размытием
.form-group {
filter: blur(5px);
}
.form-group.visible {
filter: blur(0);
}
При работе с крупными формами рекомендуется:
Пример:
function createScene(element) {
return new ScrollMagic.Scene({
triggerElement: element,
triggerHook: 0.9,
reverse: false
})
.setClassToggle(element, 'visible')
.addTo(controller);
}
document.querySelectorAll('.form-group').forEach(createScene);
Особенности:
Рекомендуется:
triggerHook (например, до
0.95)Такая модель обеспечивает плавное и управляемое появление формы, улучшая восприятие интерфейса и снижая когнитивную нагрузку.