Waypoints — это легковесная библиотека на JavaScript, предназначенная для отслеживания положения элементов на странице относительно окна просмотра (viewport). Она позволяет запускать функции при достижении определённой точки прокрутки, что делает её особенно полезной для ленивой загрузки контента, анимаций при скролле и создания динамических интерфейсов.
Чтобы создать waypoint, необходимо определить элемент и функцию-обработчик. Базовый синтаксис выглядит следующим образом:
var waypoint = new Waypoint({
element: document.getElementById('target-element'),
handler: function(direction) {
console.log('Waypoint достигнут, направление: ' + direction);
},
offset: '50%' // можно использовать пиксели или проценты
});
Параметры:
'25%'), указывающим точку срабатывания.Функция-обработчик получает параметр direction, который
показывает направление прокрутки:
'down' — пользователь скроллит вниз.'up' — пользователь скроллит вверх.Пример с условием:
handler: function(direction) {
if(direction === 'down') {
console.log('Элемент вошёл в зону видимости при прокрутке вниз');
} else {
console.log('Элемент покинул зону видимости при прокрутке вверх');
}
}
При динамическом изменении контента на странице, например, при добавлении новых блоков или изменении размеров элементов, позиции waypoint могут смещаться. Для корректной работы необходимо обновлять Waypoints.
Waypoint.refreshAll()Метод refreshAll() пересчитывает позиции всех
существующих waypoint на странице. Используется после изменения DOM или
стиля элементов:
// Добавили новый контент
document.getElementById('content').innerHTML += '<div class="new-block"></div>';
// Обновляем позиции всех waypoint
Waypoint.refreshAll();
Этот метод особенно полезен при добавлении большого количества элементов через JavaScript или при изменении размеров блоков после загрузки изображений.
Каждый waypoint имеет метод context.refresh(), который
обновляет позиции всех waypoint внутри конкретного контекста (обычно это
скроллирующийся контейнер).
var context = waypoint.context;
context.refresh();
Также можно удалить waypoint с помощью метода destroy(),
чтобы перестать отслеживать элемент:
waypoint.destroy();
Waypoints позволяют работать с несколькими контекстами скролла.
Контекст — это область, в которой отслеживается прокрутка, по умолчанию
это window. При использовании кастомных контейнеров:
var waypoint = new Waypoint({
element: document.getElementById('target-element'),
handler: function(direction) { console.log(direction); },
context: document.getElementById('scrollable-container')
});
Если размеры контейнера или его содержимого изменяются, необходимо
вызывать context.refresh() для корректного
отслеживания.
Параметр offset позволяет гибко управлять моментом
срабатывания waypoint:
'50%',
'75%').100,
200).var waypoint = new Waypoint({
element: document.getElementById('target-element'),
handler: function(direction) { console.log('Достигнуто!'); },
offset: function() {
return this.element.clientHeight / 2; // срабатывание на половине высоты элемента
}
});
Waypoints поддерживают объединение в группы для массового управления и обновления. Пример:
var group = Waypoint.Group.findOrCreate({ name: 'example-group' });
group.add(waypoint1);
group.add(waypoint2);
// Обновление всех waypoint в группе
group.refresh();
Группы удобны для сложных интерфейсов с большим количеством анимаций или блоков, где требуется синхронизированное обновление.
Waypoint.refreshAll() или
context.refresh() после добавления или изменения
контента.offset для адаптивных
интерфейсов, чтобы waypoint срабатывал в одинаковых визуальных точках на
разных экранах.destroy(), чтобы
освобождать ресурсы и предотвращать накопление ненужных
обработчиков.Waypoints часто применяются для запуска CSS-анимаций при скролле:
new Waypoint({
element: document.getElementById('animate-block'),
handler: function() {
this.element.classList.add('fade-in');
},
offset: '75%'
});
Использование offset позволяет анимации начинаться до
того, как элемент полностью появится в области видимости.
Хотите, я подготовлю продолжение с расширенными примерами обновления и удалением waypoint в реальных проектах?