Waypoints — это мощная библиотека для отслеживания прокрутки и
триггеров на странице. По умолчанию Waypoints использует объект
window в качестве контейнера для отслеживания позиции
элементов. Однако в реальных проектах часто возникает необходимость
работать с кастомными контейнерами, например, с прокручиваемыми блоками
внутри страницы, где стандартный window не подходит. Работа
с такими контейнерами требует понимания нескольких ключевых
моментов.
Для создания Waypoint с кастомным контейнером необходимо передать
опцию context, которая указывает на DOM-элемент,
выступающий в роли контейнера:
var container = document.querySelector('.scrollable-container');
var waypoint = new Waypoint({
element: document.querySelector('.target-element'),
handler: function(direction) {
console.log('Waypoint triggered: ' + direction);
},
context: container
});
Ключевые моменты:
element — элемент, за которым отслеживается позиция
внутри контейнера.handler — функция, вызываемая при пересечении
позиции.context — кастомный контейнер, вместо стандартного окна
(window).Waypoints рассчитывает позицию элемента относительно верхней границы
контейнера. Если контейнер имеет CSS-свойство
overflow: auto или overflow: scroll, Waypoints
корректно отслеживает появление или скрытие элемента при прокрутке этого
контейнера.
Важно помнить:
Пример с несколькими контейнерами:
var container1 = document.querySelector('.scrollable1');
var container2 = document.querySelector('.scrollable2');
new Waypoint({
element: container1.querySelector('.target'),
handler: function() { console.log('Triggered in container 1'); },
context: container1
});
new Waypoint({
element: container2.querySelector('.target'),
handler: function() { console.log('Triggered in container 2'); },
context: container2
});
Waypoints позволяет задавать смещение (offset) для
кастомных контейнеров, чтобы триггер происходил не в момент появления
элемента у верхней границы, а с заданным сдвигом:
var waypoint = new Waypoint({
element: document.querySelector('.target-element'),
handler: function(direction) {
console.log('Offset waypoint triggered');
},
context: document.querySelector('.scrollable-container'),
offset: '50%' // Триггер срабатывает когда элемент проходит середину контейнера
});
Смещение может быть указано в пикселях (200) или в
процентах ('50%'). Процент вычисляется относительно высоты
контейнера.
Waypoints предоставляет методы для динамического обновления и удаления Waypoint при работе с кастомными контейнерами:
waypoint.destroy() — удаляет Waypoint
и очищает все слушатели для контейнера.Waypoint.refreshAll() — пересчитывает
позиции всех Waypoint, полезно, когда содержимое контейнера меняет
размер динамически.Waypoint.disable() и
Waypoint.enable() — временно отключают или
включают триггеры.Пример динамического обновления:
var waypoint = new Waypoint({
element: document.querySelector('.target-element'),
handler: function() { console.log('Triggered'); },
context: document.querySelector('.scrollable-container')
});
// После изменения содержимого контейнера
Waypoint.refreshAll();
overflow контейнера: Для корректной
работы кастомного контейнера необходимо, чтобы CSS-свойство
overflow было auto или
scroll.position: fixed), иначе вычисления могут быть
некорректными.Waypoint.refreshAll() для пересчета.Waypoints автоматически передает в функцию handler
направление прокрутки относительно контейнера:
down — элемент появляется в зоне видимости при
прокрутке вниз контейнера.up — элемент появляется при прокрутке вверх
контейнера.var waypoint = new Waypoint({
element: document.querySelector('.target-element'),
handler: function(direction) {
if (direction === 'down') {
console.log('Элемент вошел при прокрутке вниз');
} else {
console.log('Элемент вошел при прокрутке вверх');
}
},
context: document.querySelector('.scrollable-container')
});
offset для кастомных контейнеров, если
нужен визуальный эффект триггера не у верхней границы.Waypoint.refreshAll() после
динамических изменений в контейнере.Если требуется, можно комбинировать кастомные контейнеры с Sticky-элементами и анимациями, чтобы создавать интерактивные секции, которые реагируют на прокрутку внутри конкретного блока, а не всей страницы. Это открывает возможности для сложных интерфейсов и улучшенного UX.