Waypoints — это мощная библиотека для отслеживания положения элементов на странице и выполнения определённых действий при достижении пользователем конкретных точек прокрутки. Одной из наиболее продвинутых возможностей является работа с множественными направлениями (multi-directional waypoints), позволяющая реагировать как на прокрутку вниз, так и вверх, а также на другие сценарии движения пользователя.
По умолчанию Waypoints поддерживает событие down (при
прокрутке вниз) и up (при прокрутке вверх). При создании
waypoint можно указать опцию handler, которая получает
аргумент direction, позволяющий определить, в каком
направлении происходит движение:
var waypoint = new Waypoint({
element: document.getElementById('section1'),
handler: function(direction) {
if (direction === 'down') {
console.log('Прокрутка вниз достигла секции 1');
} else if (direction === 'up') {
console.log('Прокрутка вверх достигла секции 1');
}
}
});
Ключевой момент: direction всегда
указывает направление движения относительно viewport, а не исходное
направление страницы.
Offset — это расстояние от верхней границы viewport до элемента, при котором срабатывает waypoint. Можно задавать разные значения offset для направления вниз и вверх:
var waypoint = new Waypoint({
element: document.getElementById('section2'),
handler: function(direction) {
console.log('Достигнут waypoint для', direction);
},
offset: function() {
return this.element.clientHeight / 2;
}
});
Использование функции для offset позволяет динамически рассчитывать положение waypoint в зависимости от размера элемента или размера окна браузера, что особенно полезно для адаптивного дизайна.
Для одного элемента можно создавать несколько waypoint с различными параметрами и обработчиками, чтобы реагировать на разные направления и позиции прокрутки:
var section = document.getElementById('section3');
new Waypoint({
element: section,
handler: function(direction) {
if (direction === 'down') {
console.log('Секция 3: вниз');
}
},
offset: '25%'
});
new Waypoint({
element: section,
handler: function(direction) {
if (direction === 'up') {
console.log('Секция 3: вверх');
}
},
offset: '75%'
});
Такой подход позволяет создать сложную интерактивность: например, запуск анимаций при прокрутке вниз и их обратное проигрывание при прокрутке вверх.
Waypoints поддерживает объединение waypoint в группы. Это удобно для синхронизации событий и управления множественными элементами:
var group = Waypoint.Group.findOrCreate({ name: 'sections' });
new Waypoint({
element: document.getElementById('section4'),
handler: function(direction) {
console.log('Section 4', direction);
},
group: group,
offset: '50%'
});
new Waypoint({
element: document.getElementById('section5'),
handler: function(direction) {
console.log('Section 5', direction);
},
group: group,
offset: '50%'
});
Группы обеспечивают возможность управления порядком срабатывания waypoint: можно устанавливать приоритет, отменять обработчики и запускать события по очереди, что критично при сложной анимации и навигации.
Waypoints предоставляет методы disable(),
enable() и destroy(), которые позволяют
контролировать срабатывание waypoint в зависимости от направления
прокрутки:
var waypoint = new Waypoint({
element: document.getElementById('section6'),
handler: function(direction) {
console.log(direction);
if (direction === 'up') {
this.disable();
}
}
});
Такой подход используется для однократных активаций при движении вверх или вниз, предотвращая повторное срабатывание до необходимости.
Помимо основного handler, можно использовать события
waypoint.reached и waypoint.exit, чтобы
получить более точный контроль над множественными направлениями:
var waypoint = new Waypoint({
element: document.getElementById('section7'),
handler: function(direction) {}
});
waypoint.on('reached', function(direction) {
console.log('Waypoint достигнут', direction);
});
waypoint.on('exit', function(direction) {
console.log('Waypoint покинут', direction);
});
Событие exit особенно полезно для сложных анимаций,
когда нужно запускать обратное действие после покидания элемента.
continuous: false, если
нужны только первые срабатывания при достижении waypoint в любом
направлении.element.getBoundingClientRect(), для динамических
интерфейсов, где размер элементов меняется после загрузки контента.Множественные направления в Waypoints позволяют создавать сложные и отзывчивые интерфейсы, где один элемент может инициировать разные действия при прокрутке вниз и вверх, а группы waypoint обеспечивают согласованное управление множественными событиями одновременно.