Событие enter является одним из ключевых механизмов в
библиотеке ScrollMagic и используется для отслеживания момента, когда
сцена (Scene) становится активной. Это означает, что точка
триггера (trigger) пересекает заданную границу области
просмотра (viewport), и сцена начинает свое действие.
Каждая сцена в ScrollMagic проходит через несколько состояний:
Событие enter срабатывает в момент перехода сцены из
состояния BEFORE в DURING. Это фактически
сигнал о том, что пользователь прокрутил страницу до точки начала
сцены.
scene.on("enter", function (event) {
// обработка события
});
Где:
scene — экземпляр ScrollMagic.Scene"enter" — имя событияevent — объект события, содержащий дополнительную
информациюПри срабатывании обработчика передается объект event,
содержащий следующие свойства:
type — тип события ("enter")target — ссылка на сценуprogress — текущий прогресс сцены (от 0 до 1)state — текущее состояние сцены
("DURING")scrollDirection — направление прокрутки
("FORWARD" или "REVERSE")Пример использования:
scene.on("enter", function (event) {
console.log("Сцена активирована");
console.log("Направление:", event.scrollDirection);
});
Событие enter часто используется для запуска анимаций
при появлении элемента в области видимости:
scene.on("enter", function () {
document.querySelector(".box").classList.add("animate");
});
При прокрутке страницы можно загружать ресурсы только тогда, когда они становятся видимыми:
scene.on("enter", function () {
loadImages();
});
Событие удобно для запуска любых сценариев:
scene.on("enter", function () {
console.log("Пользователь дошел до нужного блока");
});
Событие enter срабатывает как при прокрутке вниз, так и
вверх. Для различения используется scrollDirection:
scene.on("enter", function (event) {
if (event.scrollDirection === "FORWARD") {
console.log("Прокрутка вниз");
} else {
console.log("Прокрутка вверх");
}
});
reverseПараметр reverse определяет, должна ли сцена повторно
активироваться при обратной прокрутке:
new ScrollMagic.Scene({
triggerElement: "#trigger",
reverse: false
});
reverse: true (по умолчанию) — событие
enter срабатывает каждый раз при входе в сценуreverse: false — событие enter срабатывает
только один разenter vs startenter — срабатывает при входе сцены в активную
областьstart — срабатывает в момент достижения точки начала
сценыЧасто эти события совпадают, но при использовании offset
или duration поведение может различаться.
enter vs
progressenter — одноразовое событие (в момент входа)progress — вызывается непрерывно во время прокрутки
сценыenter vs leaveenter — вход в активную фазуleave — выход из активной фазыdurationЕсли сцена имеет длительность (duration > 0), событие
enter:
new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 300
});
К одной сцене можно привязать несколько обработчиков:
scene.on("enter", handler1);
scene.on("enter", handler2);
Также возможно удаление обработчика:
scene.off("enter", handler1);
Внутри обработчика this ссылается на сцену:
scene.on("enter", function () {
console.log(this === scene); // true
});
1. Повторное срабатывание без учета направления
scene.on("enter", function () {
// код выполнится и при прокрутке вверх
});
Решение — проверка scrollDirection.
2. Непонимание reverse
Ожидание одноразового события при reverse: true приводит
к дублированию логики.
3. Использование enter вместо
progress
Если требуется отслеживать процесс внутри сцены, enter
не подходит.
Для более точного контроля часто используется связка:
scene
.on("enter", function () {
console.log("Вход");
})
.on("leave", function () {
console.log("Выход");
});
При резкой прокрутке (например, колесом мыши или свайпом) событие
enter гарантированно срабатывает, даже если пользователь
«перескочил» сцену. Это обеспечивается внутренним механизмом проверки
состояния сцены.
Для визуального контроля удобно использовать индикаторы:
scene.addIndicators();
Это позволяет увидеть:
enterenter для одноразовых триггеровleave для контроля жизненного цикла
сценыvar controller = new ScrollMagic.Controller();
var scene = new ScrollMagic.Scene({
triggerElement: "#section",
triggerHook: 0.8,
reverse: true
})
.on("enter", function (event) {
if (event.scrollDirection === "FORWARD") {
console.log("Вход вниз");
} else {
console.log("Вход вверх");
}
})
.addTo(controller);
triggerHookПараметр triggerHook определяет точку срабатывания:
0 — верх экрана0.5 — центр1 — низСобытие enter срабатывает, когда
triggerElement достигает этой позиции.
offsetДополнительное смещение изменяет момент входа:
new ScrollMagic.Scene({
triggerElement: "#block",
offset: 100
});
Событие enter произойдет позже на 100 пикселей
прокрутки.
При изменении размеров страницы или элементов необходимо обновлять сцену:
scene.refresh();
Иначе событие enter может сработать в некорректный
момент.
.fade-in {
opacity: 0;
transition: opacity 0.5s;
}
.fade-in.visible {
opacity: 1;
}
scene.on("enter", function () {
document.querySelector(".fade-in").classList.add("visible");
});
При большом количестве сцен:
enterСобытие enter играет фундаментальную роль в построении
интерактивных интерфейсов с привязкой к прокрутке, обеспечивая точный
контроль над моментом активации сцены и запуском связанных действий.