Waypoints — это библиотека для отслеживания положения элементов на странице относительно области просмотра (viewport). В стандартной версии Waypoints использует jQuery для работы с DOM, однако с помощью Zepto адаптера можно подключить библиотеку к проектам, где jQuery отсутствует. Zepto — облегчённая библиотека с API, совместимым с jQuery, что позволяет использовать Waypoints без дополнительного веса jQuery.
Zepto адаптер предоставляет следующие ключевые возможности:
.offset(), .height(),
.outerHeight() и .scrollTop()..on() и
.off() для назначения обработчиков..each(), .data() и
.trigger().Для подключения Zepto адаптера необходимо убедиться, что Zepto
загружен до Waypoints и что подключён соответствующий файл адаптера
jquery.waypoints.js или отдельный Zepto-адаптер
zepto.waypoints.js.
Пример подключения:
<script src="zepto.min.js"></script>
<script src="waypoints.min.js"></script>
<script src="zepto.waypoints.js"></script>
После подключения библиотек создаётся объект Waypoint:
var waypoint = new Waypoint({
element: document.getElementById('section1'),
handler: function(direction) {
console.log('Элемент достигнут, направление:', direction);
},
offset: '50%'
});
Пояснения к параметрам:
element — DOM-элемент, к которому привязан
waypoint.handler — функция обратного вызова, вызываемая при
пересечении точки с элементом.offset — смещение от верхнего края viewport, где
срабатывает waypoint. Может быть в пикселях или процентах.Waypoints с Zepto корректно отслеживает вертикальную и горизонтальную
прокрутку. Для вертикальных срабатываний важно, чтобы Zepto корректно
возвращал значение .scrollTop() у window и
контейнеров с прокруткой.
Пример наблюдения за прокруткой внутри блока:
var scrollContainer = $('#scrollable');
var waypoint = new Waypoint({
element: $('#target')[0],
handler: function(direction) {
console.log('Waypoint сработал внутри контейнера:', direction);
},
context: scrollContainer,
offset: '25%'
});
context — контейнер с прокруткой, по умолчанию
window.1. Множественные точки для одного элемента: Можно создавать несколько waypoint для одного элемента с разными смещениями:
new Waypoint({
element: $('#section1')[0],
handler: function(direction) { console.log('Верх'); },
offset: '0%'
});
new Waypoint({
element: $('#section1')[0],
handler: function(direction) { console.log('Середина'); },
offset: '50%'
});
2. Группировка waypoint: Waypoints можно объединять в группы для синхронного управления обработкой событий:
Waypoint.Group.add({
name: 'mainGroup',
handlers: []
});
Группы позволяют:
3. Вертикальные и горизонтальные waypoint: Waypoints
поддерживает направление vertical (по умолчанию) и
horizontal:
var horizontalWaypoint = new Waypoint({
element: $('#horizontalElement')[0],
handler: function(direction) { console.log('Горизонтальная точка'); },
horizontal: true,
offset: '30%'
});
Waypoints полагается на методы Zepto, которые должны возвращать значения, совместимые с jQuery:
.offset() — возвращает объект
{ top: Number, left: Number }..height() и .outerHeight() — высота
элемента без/с отступами..scrollTop() — возвращает текущую позицию
прокрутки..on(event, handler) — назначение обработчика
события..off(event, handler) — удаление обработчика..trigger(event) — программная генерация события.Если какой-либо метод Zepto отличается от jQuery по поведению, адаптер автоматически корректирует вызовы для совместимости с Waypoints.
Waypoints активно отслеживает события скролла и ресайза. Для проектов с Zepto важно:
continuous: false для waypoint, которые не
должны срабатывать при каждом пикселе прокрутки.throttle или debounce при
сложной логике в handler.var waypoint = new Waypoint({
element: $('#section1')[0],
handler: function(direction) {
console.log('Waypoint с throttling');
},
offset: '75%',
continuous: false
});
$('#sections .section').each(function(index, el) {
new Waypoint({
element: el,
handler: function(direction) {
$(el).toggleClass('active', direction === 'down');
console.log('Section', index, 'активирован');
},
offset: '50%'
});
});
var containerWaypoint = new Waypoint({
element: $('#stickyHeader')[0],
handler: function(direction) {
$('#stickyHeader').toggleClass('fixed', direction === 'down');
},
offset: 0
});
.toggleClass() — добавляет или удаляет класс в
зависимости от направления прокрутки.each() в Zepto корректно обходят все выбранные
элементы.