Waypoints 4 существенно отличается от версии 3, прежде всего архитектурой и способами инициализации точек. В версии 4 отказались от jQuery-зависимости, что повлияло на синтаксис создания точек и работу с событиями. Основные изменения включают:
Waypoint создаётся напрямую через
new Waypoint({...}), вместо использования метода
$.waypoint():// Версия 3
$('#element').waypoint({
handler: function(direction) {
console.log(direction);
}
});
// Версия 4
var waypoint = new Waypoint({
element: document.getElementById('element'),
handler: function(direction) {
console.log(direction);
}
});
События теперь обрабатываются через опцию
handler, а не через jQuery-события типа
.on('waypoint').
Контейнер (context) задаётся явно через опцию
context. Если не указать, по умолчанию используется
window.
direction принимает значения
"down" или "up".offset: '50%' срабатывает в середине видимой области.window.Пример использования всех ключевых опций:
var waypoint = new Waypoint({
element: document.getElementById('section1'),
handler: function(direction) {
console.log('Появление section1, направление:', direction);
},
offset: '25%',
context: document.getElementById('scroll-container'),
enabled: true,
group: 'sections'
});
В версии 4 offset можно задавать как пиксели, проценты или функции:
// Пиксели
offset: 100
// Процент от высоты контейнера
offset: '50%'
// Функция
offset: function() {
return this.element.clientHeight / 2;
}
Важно: функция offset вызывается в
момент скролла и позволяет динамически менять позицию срабатывания
waypoint.
Waypoints 4 предоставляет методы для включения, отключения и уничтожения точек:
waypoint.disable(); // Отключить
waypoint.enable(); // Включить
waypoint.destroy(); // Уничтожить
Это особенно полезно при адаптивной верстке или при динамическом создании элементов на странице.
Группы позволяют управлять множественными waypoint одновременно.
Каждой точке можно задать group, а затем вызвать
срабатывание всех waypoint’ов группы:
var waypoint1 = new Waypoint({
element: document.getElementById('section1'),
handler: function() {},
group: 'sections'
});
var waypoint2 = new Waypoint({
element: document.getElementById('section2'),
handler: function() {},
group: 'sections'
});
// Все точки группы можно сбросить или вызвать обработку
Waypoint.Group.findOrCreate({name: 'sections'}).flush();
Метод flush() используется для немедленного срабатывания
всех waypoint’ов в группе в зависимости от текущей позиции скролла.
В версии 3 часто использовались jQuery-события:
$('#element').on('waypoint.reached', function(direction) {
console.log(direction);
});
В версии 4 это заменяется прямым вызовом handler при
инициализации:
var waypoint = new Waypoint({
element: document.getElementById('element'),
handler: function(direction) {
console.log(direction);
}
});
Если требуется делегирование или множественные обработчики, создаются
несколько waypoint’ов с разными handler или используется
группировка.
В версии 4 контекст задаётся явно. Это позволяет отслеживать скролл внутри блоков:
var container = document.getElementById('scrollable-container');
var waypoint = new Waypoint({
element: document.getElementById('target'),
handler: function(direction) { console.log(direction); },
context: container
});
Все координаты offset теперь рассчитываются относительно верхнего края контейнера, а не окна браузера.
В Waypoints 4 добавлен механизм пересчёта координат при изменении размеров окна:
window.addEventListener('resize', function() {
Waypoint.refreshAll();
});
Это важно для корректного срабатывания waypoint при динамическом изменении размеров элементов или окна браузера.
Реализация бесконечной прокрутки в версии 4 также изменилась. Вместо
jQuery-событий используется явная проверка и вызов handler
при добавлении новых элементов:
var infiniteWaypoint = new Waypoint.Infinite({
element: document.getElementById('container')
});
Теперь при добавлении нового контента достаточно вызвать
Waypoint.refreshAll(), чтобы новые точки начали
отслеживаться.
$.waypoint() на
new Waypoint({}).handler.context, если скролл отслеживается не по
window.offset и заменить функции/проценты при
необходимости.disable(), enable(),
destroy() вместо прямого управления через jQuery.group и
Waypoint.Group.flush().Waypoint.refreshAll() при динамическом
изменении DOM или ресайзе окна.Эти шаги обеспечивают корректную работу всех существующих точек и позволяют использовать новые возможности версии 4 без потери функционала.