Waypoints в JavaScript отслеживает, когда элемент пересекает границу
видимой области (viewport) или другого контейнера, и может срабатывать в
зависимости от направления прокрутки. Основным понятием является
“направление”, которое определяется как
down (движение вниз по странице) или up
(движение вверх). Важно понимать, что направление вычисляется
относительно позиции Waypoint, а не относительно прокрутки
всего документа в целом.
var waypoint = new Waypoint({
element: document.getElementById('target'),
handler: function(direction) {
console.log('Пройден waypoint. Направление:', direction);
}
});
Здесь direction принимает значение 'down'
или 'up'. Ошибки в логике определения направления чаще
всего возникают, когда Waypoint создаётся внутри контейнера с
прокруткой, или когда позиция элемента вычисляется некорректно.
Параметр offset задаёт смещение точки срабатывания
Waypoint относительно верха окна или контейнера. Он может быть задан в
пикселях, процентах или функцией. Неправильный offset часто
приводит к ложному определению направления.
Примеры корректного использования:
// Смещение 100px от верхней границы окна
var waypoint = new Waypoint({
element: document.getElementById('section1'),
handler: function(direction) {
console.log(direction);
},
offset: 100
});
// Смещение 50% высоты окна
var waypoint = new Waypoint({
element: document.getElementById('section2'),
handler: function(direction) {
console.log(direction);
},
offset: '50%'
});
Если указать отрицательный offset или неверно рассчитать процентное смещение, Waypoint может срабатывать в момент движения вверх, хотя визуально элемент ещё не пересёк видимую границу.
По умолчанию Waypoints отслеживает прокрутку документа
(window). Если элемент находится в контейнере с
overflow: scroll или overflow: auto,
необходимо явно указать context:
var waypoint = new Waypoint({
element: document.getElementById('inner-element'),
handler: function(direction) {
console.log('Direction in container:', direction);
},
context: document.getElementById('scrollable-container')
});
Ключевой момент: направление вычисляется
относительно прокрутки контейнера, а не окна браузера. Часто наблюдается
ошибка с ложным up, когда скролл
контейнера вниз воспринимается как движение вверх документа.
Waypoints поддерживает группы, что позволяет объединять несколько Waypoints и контролировать порядок их срабатывания. Неправильная настройка групп может приводить к некорректному определению направления:
Waypoint.Group.add({
name: 'sectionGroup',
waypoints: [waypoint1, waypoint2]
});
Для горизонтальной прокрутки задаётся horizontal: true.
В этом случае direction принимает значения
'right' и 'left' вместо 'down' и
'up'. Ошибки возникают, если забыть переключить
горизонтальный режим, что приводит к некорректной интерпретации
направления.
Если страница сочетает прокрутку документа и внутренние контейнеры с прокруткой, Waypoints может срабатывать с непредсказуемым direction, если:
window, а handler
привязан к контейнеру.Решение — использовать один источник truth: либо глобальный документ, либо конкретный контейнер, и корректно рассчитывать offset относительно выбранного контекста.
getBoundingClientRect() при дебаге.offset для динамического расчёта
на основе высоты контейнера.context.Частая проблема — срабатывание Waypoint в момент загрузки страницы, даже без прокрутки. Для предотвращения:
var waypoint = new Waypoint({
element: document.getElementById('target'),
handler: function(direction) {
if (direction === 'down') {
console.log('Только прокрутка вниз');
}
},
offset: '100%'
});
Использование условия внутри handler позволяет фильтровать ложные срабатывания и точно определять момент перехода.
Правильная работа с direction требует внимательного выбора:
Ошибки определения направления чаще всего связаны с некорректным
offset, смешением контекстов или забытым горизонтальным режимом. Точное
понимание этих механизмов позволяет полностью контролировать поведение
Waypoints и избежать неожиданных up или
down.