Waypoints — это лёгкая библиотека для отслеживания положения
элементов на странице относительно области видимости. В чистом
JavaScript подключение осуществляется через
<script>:
<script src="https://cdnjs.cloudflare.com/ajax/libs/waypoints/4.0.1/noframework.waypoints.min.js"></script>
После подключения создаётся новый waypoint для элемента с помощью
конструктора Waypoint:
var waypoint = new Waypoint({
element: document.getElementById('my-element'),
handler: function(direction) {
console.log('Элемент достигнут! Направление:', direction);
},
offset: '50%' // триггер срабатывает при достижении середины окна
});
Ключевые параметры конструктора Waypoint:
element — DOM-элемент, за которым нужно следить.handler — функция обратного вызова, вызываемая при
пересечении элемента с заданной позицией. Получает аргумент
direction ("down" или "up").offset — смещение от верхней границы окна для
срабатывания (может быть в пикселях 100px или в процентах
50%).direction)Аргумент direction позволяет различать движение
страницы:
var waypoint = new Waypoint({
element: document.getElementById('section-1'),
handler: function(direction) {
if (direction === 'down') {
console.log('Прокрутка вниз достигла section-1');
} else {
console.log('Прокрутка вверх достигла section-1');
}
}
});
Это полезно для активации анимаций при входе и выходе элемента из области видимости, либо для изменения состояния навигации.
offset) и динамическая настройкаoffset может принимать не только фиксированные значения,
но и функцию для динамического расчёта:
var waypoint = new Waypoint({
element: document.getElementById('dynamic-offset'),
handler: function(direction) {
console.log('Waypoint с динамическим offset сработал');
},
offset: function() {
return window.innerHeight * 0.75; // срабатывает на 75% высоты окна
}
});
Динамическое смещение позволяет подстраивать триггер под размеры экрана или контент, что особенно важно для адаптивного дизайна.
Библиотека идеально подходит для подгрузки контента при достижении низа страницы:
var loadMoreWaypoint = new Waypoint({
element: document.getElementById('load-more-trigger'),
handler: function(direction) {
if (direction === 'down') {
fetch('/api/loadMore')
.then(response => response.json())
.then(data => {
var container = document.getElementById('content');
data.items.forEach(item => {
var div = document.createElement('div');
div.textContent = item.name;
container.appendChild(div);
});
});
}
},
offset: '100%'
});
Срабатывание на 100% означает момент, когда элемент
достигает низа окна, что удобно для реализации подгрузки контента
“infinite scroll”.
Waypoints поддерживают объединение нескольких точек в
Waypoint.Group, что позволяет управлять их поведением и
оптимизировать производительность:
var group = new Waypoint.Group({name: 'example-group'});
var wp1 = new Waypoint({
element: document.getElementById('section-a'),
handler: function() { console.log('section-a'); },
group: group
});
var wp2 = new Waypoint({
element: document.getElementById('section-b'),
handler: function() { console.log('section-b'); },
group: group
});
Методы для управления Waypoints:
waypoint.destroy() — удаляет waypoint, освобождая
ресурсы.Waypoint.refreshAll() — пересчитывает позиции всех
waypoint на странице (важно при динамическом изменении DOM).Waypoints часто комбинируют с CSS-анимациями. Пример активации анимации:
var animateWaypoint = new Waypoint({
element: document.getElementById('animate-me'),
handler: function(direction) {
this.element.classList.add('animated', 'fadeInUp');
this.destroy(); // чтобы анимация не повторялась
},
offset: '80%'
});
Здесь this.element указывает на элемент waypoint, а
вызов destroy() предотвращает повторное срабатывание.
Для одинаковой логики на нескольких элементах удобно использовать цикл:
document.querySelectorAll('.section').forEach(function(section) {
new Waypoint({
element: section,
handler: function(direction) {
section.classList.add('visible');
},
offset: '75%'
});
});
Такой подход позволяет применить единую анимацию или поведение ко всем выбранным элементам без дублирования кода.
Waypoints минимально нагружают браузер, но при большом количестве элементов важно:
Waypoint.refreshAll() только при
необходимости.destroy().Waypoint.Group для снижения
количества внутренних обработчиков.Эти меры предотвращают лишние перерасчёты при скролле и повышают плавность анимаций.
Waypoints в чистом JavaScript предоставляют мощный инструмент для:
Основные концепции включают инициализацию через конструктор
Waypoint, использование параметров handler,
offset, управление группами и методами
destroy() и refreshAll().
Сочетание этих приёмов позволяет создавать интерактивные страницы без необходимости подключения больших фреймворков.