Waypoints — это библиотека JavaScript, позволяющая отслеживать прокрутку страницы и выполнять действия при достижении определённого элемента. Для начала работы необходимо подключить саму библиотеку. Существует несколько способов:
<script src="https://cdnjs.cloudflare.com/ajax/libs/waypoints/4.0.1/noframework.waypoints.min.js"></script>
npm install waypoints
После установки можно подключить библиотеку в проект через модульную систему:
import Waypoint from 'waypoints/lib/noframework.waypoints';
Важно убедиться, что скрипт подключен после элементов DOM, к которым будут привязываться Waypoints.
Чтобы создать первый Waypoint, необходимо выбрать элемент DOM, за которым будет вестись наблюдение, и определить функцию, которая будет вызвана при достижении этого элемента. Простейший пример:
<div id="section1" style="margin-top:1000px;">Секция 1</div>
<script>
var waypoint = new Waypoint({
element: document.getElementById('section1'),
handler: function(direction) {
console.log('Waypoint достигнут! Направление:', direction);
}
});
</script>
element — обязательный параметр, указывающий на
DOM-элемент, за которым нужно следить.
handler — функция обратного вызова, выполняемая при
пересечении элемента с границей viewport. Она принимает один
аргумент:
direction — строка "down" или
"up", указывающая направление прокрутки, при котором
waypoint активировался.По умолчанию Waypoint срабатывает, когда верх элемента достигает
верхней границы окна браузера. Параметр offset позволяет
изменить это поведение.
var waypoint = new Waypoint({
element: document.getElementById('section1'),
handler: function(direction) {
console.log('Waypoint достигнут с offset!');
},
offset: '50%' // срабатывание, когда элемент проходит середину экрана
});
Особенности использования offset:
'50%') привязывается к высоте
viewport.100) — waypoint сработает,
когда верх элемента окажется на 100px от верхней границы окна.Waypoints различает два направления:
Пример с проверкой направления:
var waypoint = new Waypoint({
element: document.getElementById('section1'),
handler: function(direction) {
if (direction === 'down') {
console.log('Прокрутка вниз достигла секции');
} else if (direction === 'up') {
console.log('Прокрутка вверх достигла секции');
}
},
offset: '25%'
});
Waypoints предоставляет методы для управления уже созданными waypoint-ами:
waypoint.destroy() — удаляет waypoint и прекращает его
отслеживание.waypoint.disable() — временно отключает waypoint без
удаления.waypoint.enable() — повторно активирует отключённый
waypoint.waypoint.trigger(direction) — вручную инициирует
срабатывание waypoint, можно указать направление ("down"
или "up").Пример:
var waypoint = new Waypoint({
element: document.getElementById('section1'),
handler: function() { console.log('Сработало!'); }
});
// Отключение на время
waypoint.disable();
// Включение обратно
waypoint.enable();
// Принудительное срабатывание
waypoint.trigger('down');
// Полное удаление waypoint
waypoint.destroy();
Если элементы добавляются динамически через JavaScript или AJAX, нужно создавать waypoint после добавления элемента в DOM. Для динамических списков можно использовать цикл или делегирование создания waypoint-ов:
var sections = document.querySelectorAll('.dynamic-section');
sections.forEach(function(section) {
new Waypoint({
element: section,
handler: function() {
section.classList.add('visible');
},
offset: '75%'
});
});
Waypoint часто применяется для запуска анимаций при прокрутке. В примере ниже элемент плавно появляется при достижении его зоны:
.dynamic-section {
opacity: 0;
transform: translateY(50px);
transition: all 0.6s ease-out;
}
.dynamic-section.visible {
opacity: 1;
transform: translateY(0);
}
var waypoint = new Waypoint({
element: document.querySelector('.dynamic-section'),
handler: function() {
this.element.classList.add('visible');
},
offset: '80%'
});
Waypoints позволяют объединять несколько waypoint-ов в группы, чтобы управлять их срабатыванием синхронно. Это удобно для длинных страниц с несколькими секциями.
Waypoint.Group.add({
name: 'sectionGroup',
waypoints: [
new Waypoint({ element: document.getElementById('section1'), handler: fn }),
new Waypoint({ element: document.getElementById('section2'), handler: fn }),
]
});
Методы групп позволяют активировать или отключать сразу все waypoint-ы группы, что упрощает управление большим количеством событий на странице.