Колбэки enter и exit используются для
отслеживания момента, когда элемент пересекает границу области видимости
(viewport) при прокрутке страницы. Эти обработчики позволяют точно
реагировать на появление и исчезновение элемента относительно заданной
точки (offset).
Библиотека Waypoints отслеживает позицию элемента относительно viewport. Когда элемент достигает определённой позиции, срабатывает один из двух ключевых колбэков:
enter — вызывается в момент входа
элемента в область отслеживанияexit — вызывается в момент выхода
элемента из этой областиОба колбэка получают аргумент direction, который
указывает направление прокрутки:
"down" — прокрутка вниз"up" — прокрутка вверхfunction(direction) {
// direction: 'up' или 'down'
}
const waypoint = new Waypoint({
element: document.getElementById('section'),
handler: function(direction) {
if (direction === 'down') {
console.log('Элемент вошёл в область');
} else {
console.log('Элемент вышел из области');
}
},
offset: '50%'
});
В этом примере используется универсальный handler,
который фактически объединяет поведение enter и
exit. Однако для более явной логики часто разделяют
события.
inview)Waypoints предоставляет специальный shortcut — Inview,
который явно реализует enter и exit:
const inview = new Waypoint.Inview({
element: document.getElementById('block'),
enter: function(direction) {
console.log('Вход:', direction);
},
entered: function(direction) {
console.log('Полностью внутри:', direction);
},
exit: function(direction) {
console.log('Выход:', direction);
},
exited: function(direction) {
console.log('Полностью вышел:', direction);
}
});
enter, entered, exit,
exited| Колбэк | Когда вызывается |
|---|---|
enter |
Когда элемент начинает входить во viewport |
entered |
Когда элемент полностью оказался внутри |
exit |
Когда элемент начинает покидать viewport |
exited |
Когда элемент полностью вышел |
Это разделение важно при работе с частичной видимостью элементов.
offsetПараметр offset определяет точку срабатывания:
offset: '75%'
Это означает, что событие enter произойдёт, когда верх
элемента достигнет 75% высоты viewport.
Можно использовать:
'50%')'200px')offset: function() {
return window.innerHeight - 100;
}
new Waypoint.Inview({
element: document.querySelector('.fade-in'),
enter: function() {
this.element.classList.add('visible');
},
exit: function() {
this.element.classList.remove('visible');
}
});
CSS:
.fade-in {
opacity: 0;
transition: opacity 0.5s;
}
.fade-in.visible {
opacity: 1;
}
Аргумент direction позволяет реализовывать разные
сценарии:
enter: function(direction) {
if (direction === 'down') {
console.log('Прокрутка вниз — элемент появился');
} else {
console.log('Прокрутка вверх — элемент снова появился');
}
}
Это полезно, например, для:
1. Lazy loading изображений
enter: function() {
const img = this.element;
img.src = img.dataset.src;
}
2. Запуск анимаций только один раз
enter: function() {
this.element.classList.add('animate');
this.destroy(); // отключение waypoint
}
3. Слежение за активной секцией (scrollspy)
enter: function() {
document.querySelector('.active').classList.remove('active');
document.querySelector(`a[href="#${this.element.id}"]`).classList.add('active');
}
Каждый waypoint можно отключить:
waypoint.destroy();
Или временно отключить:
waypoint.disable();
waypoint.enable();
offset может приводить к преждевременным
срабатываниямWaypoint.refreshAll();
Для оптимальной работы:
enter и
exitrequestAnimationFrame при сложных
анимацияхWaypoints часто комбинируется с:
Waypoints хранит список всех наблюдаемых элементов и пересчитывает их позиции при:
scroll)resize)refreshКолбэки enter и exit вызываются на основе
сравнения предыдущего и текущего положения элемента относительно точки
срабатывания.
new Waypoint.Inview({
element: el,
enter: onEnter,
exit: onExit,
offset: '50%'
});
Где:
onEnter — реакция на появлениеonExit — реакция на исчезновениеoffset — контроль точки срабатыванияТакая модель позволяет точно управлять поведением интерфейса при прокрутке и создавать интерактивные сценарии без постоянного отслеживания scroll-событий вручную.