Waypoints — это легковесная JavaScript-библиотека, предназначенная для отслеживания позиции элементов на странице относительно области видимости браузера. Одним из её наиболее распространённых применений является фиксация элементов при прокрутке, что позволяет создавать “липкие” панели, меню, заголовки и другие элементы интерфейса, остающиеся видимыми пользователю.
Для фиксации элемента необходимо подключить библиотеку Waypoints и выбрать элемент, который должен становиться фиксированным. Базовый синтаксис выглядит так:
var waypoint = new Waypoint({
element: document.getElementById('myElement'),
handler: function(direction) {
if (direction === 'down') {
this.element.classList.add('sticky');
} else {
this.element.classList.remove('sticky');
}
},
offset: '0' // расстояние от верхней границы окна
});
Ключевые моменты:
element — DOM-элемент, который отслеживается.handler — функция, вызываемая при пересечении указанной
позиции.direction — направление прокрутки (down
или up).offset — позиция относительно верха окна, при
достижении которой срабатывает waypoint. Можно задавать в пикселях
(100) или в процентах ('50%').Для корректного поведения элемента при фиксации используется CSS-класс, который добавляется через Waypoints. Пример:
.sticky {
position: fixed;
top: 0;
width: 100%;
z-index: 999;
background-color: white;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
Особое внимание стоит уделить ширине элемента при фиксации, чтобы избежать смещения содержимого. Если элемент находится внутри контейнера с ограниченной шириной, лучше использовать JavaScript для динамического задания ширины при фиксации:
this.element.style.width = this.element.parentNode.offsetWidth + 'px';
offset позволяет контролировать момент фиксации.
Например, можно сделать так, чтобы элемент становился фиксированным
только после того, как верх страницы прокручен на определённое
расстояние:
var waypoint = new Waypoint({
element: document.getElementById('header'),
handler: function(direction) {
this.element.classList.toggle('sticky', direction === 'down');
},
offset: 150 // пикселей от верха
});
Использование процентного значения offset: '25%'
позволяет элементу фиксироваться тогда, когда верх элемента достиг 25%
высоты окна браузера, что удобно для адаптивного дизайна.
Waypoints поддерживают группы, что упрощает
управление несколькими точками фиксации на одной странице. Для этого
можно задать параметр group:
var waypoint1 = new Waypoint({
element: document.getElementById('section1'),
handler: function(direction) {
console.log('Section 1 reached ' + direction);
},
group: 'sticky-group'
});
var waypoint2 = new Waypoint({
element: document.getElementById('section2'),
handler: function(direction) {
console.log('Section 2 reached ' + direction);
},
group: 'sticky-group'
});
Использование групп позволяет, например, отменять фиксацию предыдущего элемента при фиксации нового, создавая эффект “замещения” фиксированного блока.
Waypoints имеет расширение Inview, которое отслеживает появление элемента в области видимости. Это полезно для плавного изменения состояния:
var inview = new Waypoint.Inview({
element: document.getElementById('myElement'),
enter: function(direction) {
this.element.classList.add('sticky');
},
exit: function(direction) {
this.element.classList.remove('sticky');
}
});
Преимущества Inview:
Для корректной работы на разных разрешениях экрана рекомендуется пересчитывать Waypoints при изменении размеров окна:
window.addEventListener('resize', function() {
Waypoint.refreshAll();
});
Waypoint.refreshAll() пересчитывает позиции всех
waypoint’ов и предотвращает ошибки фиксации при изменении ширины
контейнера.
Иногда необходимо фиксировать элемент только внутри родительского контейнера. Для этого можно использовать вычисление позиции относительно контейнера:
var container = document.getElementById('container');
var element = document.getElementById('sidebar');
var waypoint = new Waypoint({
element: container,
handler: function(direction) {
if (direction === 'down') {
element.classList.add('sticky');
element.style.top = '0';
} else {
element.classList.remove('sticky');
}
},
offset: function() {
return container.getBoundingClientRect().top;
}
});
Такой подход предотвращает выход фиксированного элемента за пределы родительского блока.
Для более выразительного UX фиксированные элементы можно анимировать с помощью CSS-переходов:
.sticky {
position: fixed;
top: 0;
transition: top 0.3s ease-in-out;
}
Waypoints будет добавлять и удалять класс .sticky, а
CSS-переход создаст эффект “появления” или “сдвига” элемента.
offset в процентах для
адаптивных страниц.resize для корректной
фиксации.Waypoints обеспечивает гибкий и точный контроль над фиксацией элементов при прокрутке, сочетая простоту использования с возможностью тонкой настройки поведения для сложных интерфейсов.