Headroom.js предоставляет простой и мощный способ управления
поведением верхнего навигационного блока при прокрутке страницы. Помимо
стандартных событий (pin, unpin,
top, notTop, bottom,
notBottom), библиотека поддерживает создание
кастомных событий, что позволяет расширять
функциональность и интегрировать Headroom в сложные интерфейсы.
В Headroom.js каждое событие связано с определённым состоянием шапки:
закреплена (pinned) или скрыта (unpinned).
Библиотека использует события DOM для передачи этих
состояний. Для добавления кастомного события можно воспользоваться
стандартными методами addEventListener и
dispatchEvent в сочетании с CustomEvent.
Пример создания кастомного события:
const header = document.querySelector('header');
const customEvent = new CustomEvent('headerPinned', {
detail: {
time: new Date(),
message: 'Шапка закреплена'
}
});
header.dispatchEvent(customEvent);
CustomEvent принимает два параметра: имя события
(headerPinned) и объект с данными (detail),
которые будут доступны обработчику.dispatchEvent инициирует событие на выбранном элементе,
позволяя любому подписчику на это событие реагировать.Для связки с логикой Headroom можно использовать встроенные коллбеки,
такие как onPin, onUnpin, onTop,
onNotTop и др. В этих коллбеках можно вызывать кастомные
события, что позволяет расширять стандартное поведение
без модификации библиотеки.
Пример интеграции:
const header = document.querySelector('header');
const headroom = new Headroom(header, {
tolerance: 5,
offset: 100,
onPin: function() {
const event = new CustomEvent('headerPinned', {
detail: { time: new Date() }
});
header.dispatchEvent(event);
},
onUnpin: function() {
const event = new CustomEvent('headerUnpinned', {
detail: { time: new Date() }
});
header.dispatchEvent(event);
}
});
headroom.init();
Теперь на header можно подписаться и обрабатывать эти
события отдельно:
header.addEventListener('headerPinned', (e) => {
console.log('Событие headerPinned сработало в', e.detail.time);
});
header.addEventListener('headerUnpinned', (e) => {
console.log('Событие headerUnpinned сработало в', e.detail.time);
});
Объект detail в CustomEvent позволяет
передавать любую информацию: параметры анимации, идентификаторы
элементов, состояние страницы и т.д. Это особенно полезно для
динамических интерфейсов:
const event = new CustomEvent('headerAnimationStart', {
detail: {
animationType: 'slide-up',
duration: 300
}
});
header.dispatchEvent(event);
header.addEventListener('headerAnimationStart', (e) => {
const { animationType, duration } = e.detail;
console.log(`Началась анимация ${animationType}, длительность: ${duration}ms`);
});
Иногда необходимо отслеживать состояние шапки на уровне всего
документа, а не только элемента header. Для этого кастомное событие
можно диспатчить на document:
const event = new CustomEvent('globalHeaderPinned', {
detail: { headerId: 'main-header' }
});
document.dispatchEvent(event);
document.addEventListener('globalHeaderPinned', (e) => {
console.log('Главная шапка закреплена', e.detail.headerId);
});
Такой подход позволяет связывать Headroom с другими модулями интерфейса: меню, боковыми панелями, уведомлениями.
Уникальные имена событий Используйте осмысленные и уникальные названия, чтобы не возникало конфликтов с другими библиотеками или нативными событиями DOM.
Передача полезных данных Через
detail передавайте только необходимые данные. Это облегчает
обработку и снижает нагрузку на память.
Очистка обработчиков Если элементы удаляются из
DOM, удаляйте соответствующие слушатели событий с помощью
removeEventListener, чтобы избежать утечек памяти.
Комбинирование с анимациями Кастомные события идеально подходят для запуска анимаций CSS или JavaScript в момент закрепления или скрытия шапки.
Использование кастомных событий расширяет возможности Headroom.js, превращая библиотеку в гибкий инструмент для сложных интерфейсов, где шапка сайта реагирует не только на прокрутку, но и на внешние условия и логику приложения.