Waypoints — это библиотека JavaScript, позволяющая отслеживать
появление элементов на странице при прокрутке. При работе с вложенными
контекстами прокрутки возникает необходимость отслеживать элементы не
только в глобальной области window, но и внутри контейнеров
с собственными скроллбаром или ограниченной областью видимости.
Любой блок с CSS-свойством overflow: auto или
overflow: scroll становится отдельным контекстом прокрутки.
Если элемент находится внутри такого контейнера, его положение
относительно окна браузера может не соответствовать реальной позиции
относительно родительского контейнера. Для Waypoints это критично:
стандартная инициализация отслеживает элементы относительно
window:
var waypoint = new Waypoint({
element: document.getElementById('my-element'),
handler: function(direction) {
console.log('Элемент достигнут в направлении: ' + direction);
}
});
В данном случае Waypoints отслеживает элемент относительно всей страницы. Если же элемент находится внутри скроллируемого блока, этот способ не работает корректно.
contextWaypoints позволяет задать контекст прокрутки с
помощью свойства context. Оно принимает DOM-элемент или
jQuery-объект, который будет использоваться вместо window
для вычисления положения элемента:
var scrollContainer = document.getElementById('scrollable-container');
var waypoint = new Waypoint({
element: document.getElementById('inner-element'),
handler: function(direction) {
console.log('Элемент в контейнере прокручен: ' + direction);
},
context: scrollContainer
});
В этом примере inner-element отслеживается относительно
scrollable-container. Waypoints корректно определяет момент
пересечения верхней границы контейнера с элементом.
Свойство offset определяет точку срабатывания Waypoint
относительно верхней границы контекста. При вложенных контейнерах важно
учитывать, что offset:
Пример с динамическим offset:
var waypoint = new Waypoint({
element: document.getElementById('inner-element'),
handler: function(direction) {
console.log('Waypoint сработал при прокрутке: ' + direction);
},
context: scrollContainer,
offset: function() {
return scrollContainer.clientHeight / 2; // середина видимой области контейнера
}
});
Waypoints поддерживает несколько уровней вложенности. Это актуально, когда контейнеры прокрутки расположены друг внутри друга:
<div id="outer-container" style="overflow:auto; height:400px;">
<div id="inner-container" style="overflow:auto; height:200px;">
<div id="target-element">Контент</div>
</div>
</div>
Инициализация Waypoint для target-element относительно
inner-container:
var innerContainer = document.getElementById('inner-container');
var waypoint = new Waypoint({
element: document.getElementById('target-element'),
handler: function(direction) {
console.log('Элемент достигнут внутри inner-container');
},
context: innerContainer
});
Если требуется отслеживать элемент относительно внешнего контейнера
(outer-container), context меняется
соответствующим образом. При этом Waypoints корректно учитывает
вложенность: положение элемента вычисляется относительно указанного
контекста, а не глобального окна.
Waypoints поддерживает горизонтальные скроллы через свойство
horizontal: true. Для вложенных контейнеров с
горизонтальной прокруткой нужно явно задать context и
horizontal:
var waypoint = new Waypoint({
element: document.getElementById('horizontal-element'),
handler: function(direction) {
console.log('Элемент достигнут по горизонтали: ' + direction);
},
context: document.getElementById('horizontal-container'),
horizontal: true
});
В этом случае offset измеряется по горизонтальной оси, а направление
left/right возвращается в callback.
При работе с вложенными контейнерами часто элементы добавляются
динамически через JavaScript или AJAX. Для корректного отслеживания
необходимо инициализировать Waypoints после вставки элемента в
DOM. Если элемент добавляется в контейнер, у которого уже есть
прокрутка, важно использовать актуальный context:
function addElement() {
var newElement = document.createElement('div');
newElement.id = 'new-target';
document.getElementById('inner-container').appendChild(newElement);
new Waypoint({
element: newElement,
handler: function(direction) {
console.log('Новый элемент достигнут в контейнере');
},
context: document.getElementById('inner-container')
});
}
Waypoint.refreshAll() после изменений для пересчета
позиций.Вложенные контексты прокрутки широко применяются для:
sticky с ограничением по контейнеру).Использование вложенных контекстов прокрутки делает Waypoints гибким инструментом для сложных макетов и компонентов, обеспечивая точное отслеживание элементов внутри любых скроллируемых контейнеров.