В библиотеке Waypoints адаптеры выполняют ключевую функцию связывания точек с контекстом их отслеживания. Основная цель адаптера — абстрагировать обработку скролла и положения элементов, позволяя Waypoints работать одинаково с различными типами контейнеров и событий.
Адаптер представляет собой объект с набором методов, через которые Waypoints получает текущие координаты элементов и размеры контейнера. Любой адаптер должен реализовывать следующие методы:
Эти методы позволяют Waypoints корректно вычислять, когда элемент
достигает определённой точки отслеживания, независимо от того, является
ли контейнер window, document или любым другим
прокручиваемым блоком.
Waypoints предоставляет стандартный адаптер для window,
который покрывает большинство типичных случаев. Его поведение
определяется следующим образом:
window.pageYOffset или
document.documentElement.scrollTop.window.innerHeight.getBoundingClientRect() и добавление текущей позиции
скролла.window.scrollTo(0, value).Этот адаптер обеспечивает работу точек Waypoints на всей странице без дополнительных настроек.
Для нестандартных контейнеров, например, прокручиваемых
<div> или элементов с CSS-свойством
overflow: auto, требуется создавать собственные
адаптеры.
Пример адаптера для прокручиваемого контейнера:
var CustomAdapter = {
context: function() {
return document.getElementById('scroll-container');
},
scrollTop: function() {
return this.context().scrollTop;
},
contextHeight: function() {
return this.context().clientHeight;
},
offset: function(element) {
var rect = element.getBoundingClientRect();
var containerRect = this.context().getBoundingClientRect();
return rect.top - containerRect.top + this.scrollTop();
},
scrollTo: function(value) {
this.context().scrollTop = value;
}
};
После определения такого адаптера его можно передать Waypoints при создании точки:
new Waypoint({
element: document.getElementById('target'),
handler: function(direction) {
console.log('Waypoint reached', direction);
},
context: CustomAdapter.context(),
adapter: CustomAdapter
});
Waypoints позволяет иметь несколько адаптеров одновременно, применяемых к разным контекстам. Каждый адаптер привязан к конкретному контейнеру и обеспечивает корректную работу точек независимо от вложенности элементов.
Waypoints использует адаптер для двух основных задач:
offset() адаптера возвращает координаты относительно
контейнера, что позволяет точкам определить момент срабатывания.scrollTop()
и scrollTo() позволяют библиотеке корректно реагировать на
прокрутку и программно изменять позицию контейнера.Таким образом, адаптеры обеспечивают прозрачное разделение между логикой библиотеки и конкретной реализацией прокрутки, делая Waypoints универсальным инструментом для любых интерфейсных решений с отслеживанием позиций элементов.
window.offset() в контейнерах с
внутренними отступами или трансформациями, чтобы избежать некорректного
срабатывания точек.Адаптеры являются фундаментальной частью архитектуры Waypoints, обеспечивая корректное функционирование скролл-триггеров в любых условиях, повышая гибкость и масштабируемость проектов.