Событие leave в библиотеке ScrollMagic возникает в
момент, когда сцена (Scene) перестаёт быть активной — то
есть когда пользователь прокручивает страницу за пределы зоны действия
сцены. Это одно из ключевых событий жизненного цикла сцены, позволяющее
реагировать на выход из триггерной области.
Событие leave вызывается, когда:
Это означает, что событие может сработать в двух направлениях — важно учитывать направление прокрутки.
var controller = new ScrollMagic.Controller();
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 300
})
.on("leave", function(event) {
console.log("Сцена покинута");
})
.addTo(controller);
В этом примере:
leaveОбработчик leave получает объект события, содержащий
важные свойства:
.on("leave", function(event) {
console.log(event.type); // "leave"
console.log(event.target); // объект Scene
console.log(event.scrollDirection); // "FORWARD" или "REVERSE"
})
type — тип события
(leave)
target — текущая сцена
scrollDirection:
"FORWARD" — прокрутка вниз"REVERSE" — прокрутка вверхСобытие leave ведёт себя по-разному в зависимости от
направления:
FORWARD)REVERSE)Событие leave тесно связано с:
enter — вход в сценуstart — достижение начала сценыend — достижение конца сценыenterstartendleaveenterendstartleaveСобытие leave часто применяется для:
.on("leave", function() {
document.querySelector("#box").classList.remove("active");
})
.on("leave", function() {
animation.pause();
})
.on("leave", function() {
scene.removeClassToggle(true);
})
При наличии duration событие leave означает
полное завершение сцены:
new ScrollMagic.Scene({
triggerElement: "#section",
duration: 500
})
.on("leave", function() {
console.log("Прокрутка прошла всю сцену");
});
endВажно различать:
end — достижение конца сцены
(точка)leave — выход за пределы сцены
(состояние)Пример:
.on("end", function() {
console.log("Достигнут конец сцены");
})
.on("leave", function() {
console.log("Сцена полностью покинута");
})
Если duration: 0, сцена становится точечной:
new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 0
})
В этом случае:
enter и leave происходят почти
одновременноvar scene = new ScrollMagic.Scene({
triggerElement: "#header",
duration: 200
})
.on("enter", function() {
document.body.classList.add("fixed-header");
})
.on("leave", function(event) {
if (event.scrollDirection === "REVERSE") {
document.body.classList.remove("fixed-header");
}
})
.addTo(controller);
Логика:
.on("leave", function() {
// ошибка: не учитывается направление
})
Корректно:
.on("leave", function(event) {
if (event.scrollDirection === "FORWARD") {
// логика для прокрутки вниз
}
})
endСобытие end не означает, что сцена завершена — только
достигнута её конечная точка.
Событие leave может вызываться многократно при прокрутке
туда-обратно. Это требует контроля состояния:
let triggered = false;
scene.on("leave", function() {
if (!triggered) {
triggered = true;
// действие
}
});
Часто leave используется вместе с CSS-классами:
scene.on("leave", function() {
document.querySelector("#section").classList.add("hidden");
});
Для анализа работы события удобно использовать логирование:
scene.on("leave", function(event) {
console.log("leave", event.scrollDirection, event.target);
});
Или включить индикаторы:
scene.addIndicators();
(при использовании плагина debug.addIndicators)
scene
.on("enter", handlerEnter)
.on("leave", handlerLeave)
.on("progress", handlerProgress);
Позволяет выстроить полный контроль над жизненным циклом сцены.
Параметры сцены влияют на момент срабатывания leave:
new ScrollMagic.Scene({
triggerElement: "#block",
offset: 100,
triggerHook: 0.5,
duration: 300
})
offset смещает точку началаtriggerHook определяет позицию на экранеЭто напрямую влияет на то, когда произойдёт leave.
Если сцена уничтожается:
scene.destroy(true);
Событие leave не вызывается
автоматически, поэтому при необходимости нужно вызывать логику
вручную.
Событие leave — это индикатор того, что сцена полностью
покинута. Оно используется для завершения действий, начатых при
enter, и обеспечивает контроль над состоянием интерфейса
при прокрутке страницы.