Headroom.js — это легковесная JavaScript-библиотека для управления видимостью верхней панели при скролле страницы. Часто возникает необходимость включать или отключать поведение библиотеки в зависимости от размера экрана. Такая условная активация особенно полезна при адаптивной верстке, когда на мобильных устройствах интерфейс должен оставаться минималистичным, а на десктопе — интерактивным.
Для реализации условной активации сначала необходимо определить
текущую ширину окна браузера. Самым распространённым способом является
использование свойства window.innerWidth:
const screenWidth = window.innerWidth;
Для динамического отслеживания изменений ширины удобно подключить
обработчик события resize:
window.addEventListener('resize', () => {
const updatedWidth = window.innerWidth;
// логика условной активации
});
Библиотека Headroom.js инициализируется через объект
Headroom, которому передаётся DOM-элемент шапки сайта и
опции:
const header = document.querySelector('header');
const headroomOptions = {
tolerance: {
up: 10,
down: 20
},
offset: 50,
classes: {
initial: "headroom",
pinned: "headroom--pinned",
unpinned: "headroom--unpinned"
}
};
Чтобы активировать Headroom.js только на экранах шире определённого значения, применяют условную проверку:
let headroomInstance;
function initHeadroom() {
const minWidth = 1024; // минимальная ширина для активации
const currentWidth = window.innerWidth;
if (currentWidth >= minWidth && !headroomInstance) {
headroomInstance = new Headroom(header, headroomOptions);
headroomInstance.init();
} else if (currentWidth < minWidth && headroomInstance) {
headroomInstance.destroy();
headroomInstance = null;
}
}
initHeadroom();
window.addEventListener('resize', initHeadroom);
Ключевые моменты:
headroomInstance хранит текущее состояние
Headroom для возможности последующего уничтожения.!headroomInstance предотвращает повторную
инициализацию при каждом событии resize.destroy() корректно снимает все привязки событий
и возвращает элемент в исходное состояние.Помимо прямой проверки ширины окна, можно применять медиазапросы:
const mediaQuery = window.matchMedia('(min-width: 1024px)');
function handleMediaChange(e) {
if (e.matches) {
headroomInstance = new Headroom(header, headroomOptions);
headroomInstance.init();
} else if (headroomInstance) {
headroomInstance.destroy();
headroomInstance = null;
}
}
mediaQuery.addListener(handleMediaChange);
handleMediaChange(mediaQuery);
Этот подход позволяет реагировать не только на изменение размеров окна, но и на начальную загрузку страницы с любым разрешением.
Иногда требуется, чтобы на мобильных устройствах шапка не исчезала
или скрывалась медленнее. Для этого параметры tolerance и
offset можно определять в зависимости от ширины:
function getHeadroomOptions(width) {
if (width >= 1024) {
return {
tolerance: { up: 10, down: 20 },
offset: 50,
classes: {
initial: "headroom",
pinned: "headroom--pinned",
unpinned: "headroom--unpinned"
}
};
} else {
return {
tolerance: { up: 5, down: 5 },
offset: 0,
classes: {
initial: "headroom",
pinned: "headroom--pinned",
unpinned: "headroom--unpinned"
}
};
}
}
function initHeadroomDynamic() {
const width = window.innerWidth;
if (!headroomInstance) {
headroomInstance = new Headroom(header, getHeadroomOptions(width));
headroomInstance.init();
} else {
headroomInstance.destroy();
headroomInstance = new Headroom(header, getHeadroomOptions(width));
headroomInstance.init();
}
}
window.addEventListener('resize', initHeadroomDynamic);
initHeadroomDynamic();
При условной активации важно минимизировать нагрузку при событии
resize, так как оно срабатывает очень часто. Для этого
применяют дебаунсинг:
let resizeTimeout;
window.addEventListener('resize', () => {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(initHeadroomDynamic, 150);
});
Данный приём предотвращает многократную инициализацию Headroom в течение короткого времени и повышает отзывчивость страницы.
window.innerWidth.window.matchMedia.destroy().tolerance и offset
под разные разрешения для улучшения UX.resize, чтобы
избежать лишних вычислений.Этот подход позволяет интегрировать Headroom.js в адаптивный интерфейс без лишней нагрузки и с контролем поведения шапки для любых разрешений экрана.