Отслеживание видимости элементов — ключевая задача при создании динамических интерфейсов. Она позволяет реагировать на появление элементов в области просмотра (viewport), реализовывать ленивую загрузку, анимации при скролле и различные триггеры пользовательского взаимодействия.
Библиотека Waypoints решает эту задачу, предоставляя механизм отслеживания положения элемента относительно окна браузера или контейнера прокрутки.
В основе лежит понятие контрольной точки (waypoint) — объекта, который срабатывает при достижении определённой позиции на странице.
Контрольная точка связывается с DOM-элементом и реагирует на прокрутку:
var waypoint = new Waypoint({
element: document.getElementById('target'),
handler: function(direction) {
console.log('Элемент достигнут! Направление:', direction);
}
});
Ключевые свойства:
element — отслеживаемый DOM-элементhandler — функция-обработчикdirection — направление прокрутки (down
или up)По умолчанию waypoint срабатывает, когда верхняя граница элемента пересекает верхнюю границу viewport.
Это означает:
Смещение позволяет управлять моментом срабатывания.
new Waypoint({
element: document.getElementById('target'),
handler: function() {
console.log('Сработало со смещением');
},
offset: '50%'
});
Возможные значения offset:
Процент от высоты viewport
offset: '50%'
Срабатывание происходит, когда элемент достигает середины экрана.
Пиксели
offset: 200
Срабатывание происходит на расстоянии 200px от верхней границы.
Функция
offset: function() {
return this.element.clientHeight;
}
Позволяет вычислять динамическое смещение.
Waypoints фиксирует не только появление элемента, но и его выход из области видимости.
new Waypoint({
element: document.getElementById('box'),
handler: function(direction) {
if (direction === 'down') {
console.log('Элемент вошёл в область');
} else {
console.log('Элемент покинул область');
}
},
offset: '100%'
});
Значение '100%' означает нижнюю границу viewport.
Для отслеживания группы элементов используется цикл:
var items = document.querySelectorAll('.item');
items.forEach(function(item) {
new Waypoint({
element: item,
handler: function() {
item.classList.add('visible');
},
offset: '75%'
});
});
Такой подход часто применяется для:
По умолчанию отслеживание происходит по вертикали. Для
горизонтального скролла используется параметр
horizontal:
new Waypoint({
element: document.getElementById('slide'),
handler: function(direction) {
console.log('Горизонтальное событие:', direction);
},
horizontal: true
});
Waypoints может отслеживать элементы не только относительно окна браузера, но и внутри прокручиваемого контейнера.
var container = document.getElementById('scroll-container');
new Waypoint({
element: document.getElementById('item'),
handler: function() {
console.log('Видимость внутри контейнера');
},
context: container
});
Это важно для:
Чтобы waypoint срабатывал только один раз:
new Waypoint({
element: document.getElementById('once'),
handler: function() {
console.log('Сработало один раз');
this.destroy();
}
});
Метод destroy() удаляет waypoint после выполнения.
var waypoint = new Waypoint({
element: document.getElementById('toggle'),
handler: function() {
console.log('Активный waypoint');
}
});
// отключение
waypoint.disable();
// включение
waypoint.enable();
Waypoints автоматически объединяются в группы для оптимизации производительности.
new Waypoint({
element: document.getElementById('group-item'),
handler: function() {
console.log('Групповая обработка');
},
group: 'customGroup'
});
Группы позволяют:
new Waypoint({
element: document.getElementById('animate'),
handler: function() {
this.element.classList.add('fade-in');
},
offset: '80%'
});
new Waypoint({
element: document.getElementById('image'),
handler: function() {
var img = this.element;
img.src = img.dataset.src;
this.destroy();
},
offset: '90%'
});
var sections = document.querySelectorAll('section');
sections.forEach(function(section) {
new Waypoint({
element: section,
handler: function(direction) {
if (direction === 'down') {
document.querySelector('.active').classList.remove('active');
section.classList.add('active');
}
},
offset: '25%'
});
});
При большом количестве waypoint-объектов важно учитывать:
Waypoints использует внутреннюю оптимизацию событий прокрутки, снижая
нагрузку по сравнению с ручной обработкой scroll.
Несмотря на удобство, Waypoints имеет ограничения:
Современной альтернативой является Intersection Observer API, который:
Тем не менее, Waypoints остаётся актуальным для проектов, где требуется простота и кроссбраузерная поддержка.