Взаимодействие с пользователем на основе положения прокрутки — одна из ключевых задач при работе с ScrollMagic. Один из распространённых сценариев — выполнение действия при достижении конца страницы или определённого контейнера. Это может быть автоматическая отправка формы (submit), активация кнопки, подгрузка данных или запуск анимации.
ScrollMagic предоставляет гибкий механизм отслеживания позиции через
сцены (Scene) и контроллер (Controller), что
позволяет точно определить момент, когда пользователь достиг нужной
точки.
Перед реализацией логики необходимо инициализировать контроллер:
var controller = new ScrollMagic.Controller();
Контроллер управляет всеми сценами и синхронизирует их с прокруткой страницы.
Конец страницы можно определить разными способами:
document.body.scrollHeight)#footer)Наиболее удобный и управляемый способ — использование триггер-элемента.
var scene = new ScrollMagic.Scene({
triggerElement: "#end",
triggerHook: 1,
reverse: false
})
.addTo(controller);
Ключевые параметры:
triggerElement — элемент, при достижении которого
срабатывает сценаtriggerHook: 1 — означает нижнюю границу viewportreverse: false — сцена срабатывает один разscene.on("enter", function () {
document.querySelector("#myForm").submit();
});
Событие "enter" срабатывает в момент входа
триггер-элемента в область viewport.
Даже при reverse: false важно предусмотреть защиту от
повторного сабмита:
var submitted = false;
scene.on("enter", function () {
if (!submitted) {
submitted = true;
document.querySelector("#myForm").submit();
}
});
Вместо привязки к реальному элементу можно добавить специальный маркер:
<div id="scroll-end"></div>
И задать ему стили:
#scroll-end {
height: 1px;
}
Сцена:
new ScrollMagic.Scene({
triggerElement: "#scroll-end",
triggerHook: 1,
reverse: false
})
.on("enter", function () {
document.querySelector("#myForm").submit();
})
.addTo(controller);
Если отсутствует явный DOM-элемент конца, можно вычислить позицию вручную:
window.addEventListener("scroll", function () {
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
var windowHeight = window.innerHeight;
var docHeight = document.documentElement.scrollHeight;
if (scrollTop + windowHeight >= docHeight) {
document.querySelector("#myForm").submit();
}
});
Однако такой подход не использует преимущества ScrollMagic, такие как сцены и управление состояниями.
Перед отправкой формы можно добавить визуальную индикацию:
scene.on("enter", function () {
var button = document.querySelector("#submitBtn");
button.classList.add("active");
setTimeout(function () {
document.querySelector("#myForm").submit();
}, 500);
});
Вместо стандартного submit() часто используется
AJAX:
scene.on("enter", function () {
fetch("/submit", {
method: "POST",
body: new FormData(document.querySelector("#myForm"))
});
});
Это позволяет избежать перезагрузки страницы и сохранить плавность пользовательского опыта.
ScrollMagic поддерживает визуализацию триггеров через плагин
debug.addIndicators:
scene.addIndicators({
name: "End Trigger",
colorStart: "green",
colorTrigger: "red"
});
Это помогает точно понять, когда сцена срабатывает.
Если высота страницы изменяется (например, при подгрузке данных), необходимо обновлять контроллер:
controller.update(true);
Или пересоздавать сцену при изменении DOM.
window.innerHeighttriggerHook (например, 0.9
вместо 1)1. Сабмит только при достижении конца и наличии условий:
scene.on("enter", function () {
if (formIsValid()) {
document.querySelector("#myForm").submit();
}
});
2. Сабмит после полной прокрутки секции:
new ScrollMagic.Scene({
triggerElement: "#section",
duration: document.querySelector("#section").offsetHeight,
triggerHook: 0
})
.on("end", function () {
document.querySelector("#myForm").submit();
})
.addTo(controller);
Событие "end" срабатывает после прохождения всей
длительности сцены.
ScrollMagic предоставляет доступ к состоянию:
scene.on("progress", function (event) {
if (event.progress === 1) {
document.querySelector("#myForm").submit();
}
});
progress изменяется от 0 до 1,
где 1 означает достижение конца сцены.
reverse: false снижает риск повторных
действийДля масштабируемости логики рекомендуется выносить обработчики:
function handleScrollEnd() {
document.querySelector("#myForm").submit();
}
scene.on("enter", handleScrollEnd);
Это упрощает тестирование и повторное использование.
ScrollMagic часто используется вместе с:
Однако ScrollMagic остаётся более гибким при сложных сценариях прокрутки.
requestAnimationFrame при
необходимостиПри автоматической отправке важно учитывать:
if (confirmSubmit) {
form.submit();
}
Если требуется повторное выполнение при повторной прокрутке:
reverse: true
И сброс состояния:
scene.on("leave", function () {
submitted = false;
});
document.querySelectorAll("form.auto-submit").forEach(function(form) {
scene.on("enter", function () {
form.submit();
});
});
Такая организация позволяет точно контролировать момент отправки данных, интегрируя пользовательское поведение прокрутки в бизнес-логику приложения.