Для работы с Waypoints в Vue.js необходимо сначала установить библиотеку. В современных проектах на основе npm это делается командой:
npm install waypoints
После установки библиотеку можно импортировать в компонент:
import Waypoint from 'waypoints/lib/noframework.waypoints';
Использование версии noframework предпочтительно для
Vue.js, так как она не зависит от jQuery и легко интегрируется с
реактивной системой Vue.
Waypoints создаются для отслеживания положения элемента на странице
относительно видимой области окна браузера. В Vue.js инициализация
обычно выполняется в хуке mounted, чтобы гарантировать, что
элемент уже присутствует в DOM.
Пример инициализации:
export default {
mounted() {
new Waypoint({
element: this.$refs.section,
handler: (direction) => {
console.log(`Элемент прокручен ${direction}`);
},
offset: '50%'
});
}
}
Пояснения:
element — ссылка на DOM-элемент. В Vue.js удобно
использовать ref.handler — функция, которая вызывается при пересечении
точки с элементом.offset — смещение относительно верхней границы окна
(может быть в процентах, пикселях или функцией).ref для привязки элементовВ шаблоне компонента элемент, за которым нужно следить:
<div ref="section" class="section">
Контент блока
</div>
В JavaScript-коде через this.$refs.section можно
получить доступ к элементу, что позволяет корректно передать его в
Waypoint.
Параметр direction в обработчике может принимать
значения:
'down' — элемент пересечён при прокрутке вниз.'up' — элемент пересечён при прокрутке вверх.Offset позволяет сдвигать момент срабатывания Waypoint. Примеры использования:
offset: '75%' // событие сработает, когда верх элемента будет на 75% высоты окна
offset: 200 // событие сработает, когда верх элемента будет на 200 пикселей от верха окна
Также можно использовать функцию:
offset: () => window.innerHeight / 2
В компонентах с большим количеством блоков часто требуется создавать несколько Waypoints. Это делается через массив и итерацию:
export default {
mounted() {
this.sections = this.$refs.sections; // массив элементов через ref
this.sections.forEach((el) => {
new Waypoint({
element: el,
handler: (dir) => console.log(`Элемент ${el.dataset.id} прокручен ${dir}`),
offset: '50%'
});
});
}
}
Шаблон с несколькими элементами:
<div v-for="block in blocks" :key="block.id" :ref="el => sections.push(el)" :data-id="block.id">
{{ block.content }}
</div>
Важно: В Vue 3 для массивного ref
необходимо использовать функцию колбэк
el => refs.push(el) вместо простого
ref="sections", чтобы корректно собрать все
DOM-элементы.
В проектах с динамическим контентом важно управлять жизненным циклом
Waypoints. Для удаления используется метод .destroy():
let waypoint = new Waypoint({
element: this.$refs.section,
handler: () => {},
});
waypoint.destroy(); // удаление waypoint при необходимости
При динамическом обновлении DOM старые Waypoints следует удалять, чтобы избежать утечек памяти и двойного срабатывания.
Waypoints удобно использовать для анимаций и отслеживания прокрутки в рамках разных страниц:
watch: {
'$route'(to, from) {
// при смене маршрута можно заново инициализировать Waypoints
this.initWaypoints();
}
}
Waypoints работает с DOM напрямую, поэтому для интеграции с реактивными данными Vue полезно использовать методы компонента и реактивные свойства для управления состоянием:
export default {
data() {
return {
activeSection: null
}
},
mounted() {
new Waypoint({
element: this.$refs.section,
handler: (dir) => {
this.activeSection = dir === 'down' ? 'section-1' : null;
},
offset: '50%'
});
}
}
Такой подход позволяет изменять классы, запускать анимации или отображать меню навигации в зависимости от прокрутки.
Waypoints часто используют для запуска CSS-анимаций при появлении элемента в области видимости:
new Waypoint({
element: this.$refs.section,
handler: () => {
this.$refs.section.classList.add('animate-fade-in');
},
offset: '80%'
});
Использование комбинации Waypoints и Vue позволяет управлять состоянием анимаций и реактивно обновлять интерфейс.
mounted для инициализации.ref.offset.direction..destroy().