Waypoints — это мощная библиотека для отслеживания положения элементов на странице и реагирования на события прокрутки. Одной из ключевых особенностей являются встроенные адаптеры, которые обеспечивают гибкую интеграцию с различными объектами DOM и системами прокрутки. Адаптеры позволяют Waypoints корректно определять положение элементов и вызывать коллбэки в зависимости от контекста их использования.
В Waypoints адаптер — это слой абстракции между библиотекой и конкретными DOM-объектами. Он отвечает за:
Waypoints по умолчанию использует jQuery адаптер,
если jQuery подключен, или native адаптер, если
библиотека работает без внешних зависимостей. Это позволяет одинаково
работать как с jQuery-объектами ($(element)), так и с
нативными DOM-элементами (document.querySelector).
jQuery адаптер Использует методы jQuery для определения размеров, положения и события прокрутки. Основные функции адаптера:
adapter.offset() — возвращает верхнее смещение элемента
относительно документа.adapter.height() — возвращает высоту элемента.adapter.scrollTop() — текущая позиция прокрутки
контейнера.Пример использования:
var waypoint = new Waypoint({
element: $('#myElement')[0],
handler: function(direction) {
console.log('Waypoint triggered', direction);
}
});Native (без jQuery) Позволяет работать с чистыми
DOM-элементами. Использует getBoundingClientRect и
стандартные методы window.scrollY и
window.innerHeight. Пример:
var waypoint = new Waypoint({
element: document.getElementById('myElement'),
handler: function(direction) {
console.log('Waypoint triggered', direction);
}
});Sticky адаптер Используется для элементов с
CSS-свойством position: sticky. Он учитывает смещение
элемента относительно видимой области при прокрутке. Особенности:
top в CSS.Waypoints поддерживает создание собственных адаптеров, если требуется интеграция с нестандартными DOM-структурами или виртуальными списками.
Для создания адаптера необходимо определить объект с методами:
adapter.offset() — возвращает координаты элемента.adapter.height() — высота элемента.adapter.scrollTop() — текущая позиция прокрутки
контейнера.adapter.scrollHeight() — полная высота прокручиваемого
контейнера.adapter.bind() — привязка событий к контейнеру
(например, scroll).adapter.unbind() — удаление привязанных событий.Пример кастомного адаптера для виртуального скролла:
var VirtualScrollAdapter = {
offset: function(element) {
return element.virtualOffset;
},
height: function(element) {
return element.virtualHeight;
},
scrollTop: function() {
return virtualScrollContainer.scrollTop;
},
scrollHeight: function() {
return virtualScrollContainer.scrollHeight;
},
bind: function(fn) {
virtualScrollContainer.addEventListener('scroll', fn);
},
unbind: function(fn) {
virtualScrollContainer.removeEventListener('scroll', fn);
}
};
var waypoint = new Waypoint({
element: virtualElement,
handler: function(direction) {
console.log('Virtual waypoint triggered', direction);
},
context: virtualScrollContainer,
adapter: VirtualScrollAdapter
});
Каждый Waypoint может иметь собственный контекст прокрутки. Контекст — это контейнер, относительно которого вычисляется положение элемента.
window.Например, если контекстом является прокручиваемый блок
div, адаптер должен использовать его свойства для
вычисления scrollTop() и scrollHeight(), а не
глобальные window-свойства.
| Метод | Назначение |
|---|---|
offset() |
Возвращает верхнее смещение элемента относительно контекста |
height() |
Высота элемента |
scrollTop() |
Текущая позиция прокрутки контейнера |
scrollHeight() |
Общая высота контейнера |
bind(handler) |
Привязка обработчика события прокрутки |
unbind(handler) |
Удаление обработчика |
Эти методы являются основой для всех встроенных и кастомных адаптеров. Корректная их реализация обеспечивает точное срабатывание Waypoints и правильную реакцию интерфейса на прокрутку.
Встроенные адаптеры в Waypoints создают универсальный слой абстракции для работы с DOM, делая библиотеку гибкой и адаптируемой под любые структуры страницы и контейнеры прокрутки. Правильное использование адаптеров позволяет управлять сложными анимациями, lazy-loading элементов и интерактивными триггерами без лишних вычислений и багов.