Waypoints — это библиотека на JavaScript, которая позволяет отслеживать положение элементов на странице относительно области просмотра (viewport) и выполнять определённые действия, когда элементы пересекают заданные точки. Одним из наиболее мощных применений Waypoints является создание каскадных эффектов, когда несколько элементов анимируются последовательно при скролле.
Каскадные эффекты реализуются с помощью комбинации Waypoints, CSS-анимаций и таймеров/отложенного выполнения. Идея заключается в том, чтобы каждый следующий элемент анимировался с задержкой относительно предыдущего, создавая эффект последовательного появления.
Подключение Waypoints выполняется стандартным образом:
<script src="https://cdnjs.cloudflare.com/ajax/libs/waypoints/4.0.1/noframework.waypoints.min.js"></script>
Для каждого элемента, который должен участвовать в каскаде, создается Waypoint:
const elements = document.querySelectorAll('.cascade-item');
elements.forEach((element, index) => {
new Waypoint({
element: element,
handler: function() {
setTimeout(() => {
element.classList.add('animate');
}, index * 150); // задержка каскада
},
offset: '75%' // точка срабатывания Waypoint
});
});
Ключевые моменты:
index * 150 — задаёт задержку между элементами в
миллисекундах.offset — определяет, в какой точке viewport будет
срабатывать анимация (например, 75% означает, что событие
произойдёт, когда верх элемента достигнет 75% высоты окна).Для эффекта последовательного появления удобно использовать CSS с
transition или keyframes:
.cascade-item {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}
.cascade-item.animate {
opacity: 1;
transform: translateY(0);
}
При добавлении класса .animate элемент плавно
появляется, а использование задержки в JavaScript обеспечивает
последовательность.
Каскадные эффекты могут быть не только вертикальными. Для горизонтальных или диагональных анимаций достаточно изменить CSS:
.cascade-item.horizontal {
transform: translateX(-30px);
}
.cascade-item.horizontal.animate {
transform: translateX(0);
}
Waypoints остаются неизменными, а направление движения контролируется через стили.
При множественных каскадных элементах важно учитывать нагрузку на рендеринг:
top, left — GPU ускоряет их
обработку.handler: function(direction) {
element.classList.add('animate');
this.destroy(); // удаляет Waypoint после выполнения
}
Чтобы анимация срабатывала каждый раз при входе элемента в viewport, можно использовать классический подход без удаления Waypoint:
new Waypoint({
element: element,
handler: function(direction) {
if(direction === 'down') {
element.classList.add('animate');
} else {
element.classList.remove('animate');
}
},
offset: '80%'
});
Такой способ позволяет создавать интерактивные скролл-анимации, когда элементы реагируют на движение пользователя в обе стороны.
Waypoints можно комбинировать с параллакс-эффектами для создания глубины страницы. Например, последовательное появление блоков может сопровождаться сдвигом фона или слоёв:
elements.forEach((element, index) => {
new Waypoint({
element: element,
handler: function() {
element.style.transform = `translateY(${index * 10}px)`;
element.classList.add('animate');
},
offset: '70%'
});
});
Комбинация CSS-переходов и небольшого смещения создаёт иллюзию движения слоёв в пространстве.
Если элементы добавляются динамически (например, при загрузке контента с сервера), создаётся функция для инициализации Waypoints:
function initCascade(containerSelector) {
const container = document.querySelector(containerSelector);
const items = container.querySelectorAll('.cascade-item');
items.forEach((item, i) => {
new Waypoint({
element: item,
handler: function() {
setTimeout(() => item.classList.add('animate'), i * 120);
},
offset: '75%'
});
});
}
Вызов initCascade('#dynamic-list') обеспечит каскадную
анимацию даже для элементов, появившихся после первичной загрузки
страницы.
Эта техника позволяет создавать сложные последовательные эффекты, управлять их направлением, скоростью и повторением, превращая статические страницы в динамичные, интерактивные интерфейсы с минимальными усилиями на JavaScript и CSS.