Headroom.js — это лёгкая библиотека для управления видимостью элементов при прокрутке страницы, чаще всего используется для фиксированных шапок. Помимо стандартного поведения при скролле, важно учитывать взаимодействие с клавиатурой, особенно для доступности и UX на устройствах без мыши.
Эффективная навигация с клавиатуры в Headroom.js строится на
обработке событий focus, blur и
keydown. Основная идея — синхронизировать видимость шапки с
действиями пользователя через клавиши:
const header = document.querySelector('header');
const headroom = new Headroom(header);
headroom.init();
// Обработка клавиатурной навигации
header.addEventListener('keydown', (e) => {
switch (e.key) {
case 'ArrowUp':
headroom.pin(); // закрепляем шапку при движении вверх
break;
case 'ArrowDown':
headroom.unpin(); // скрываем шапку при движении вниз
break;
}
});
Для пользователей клавиатуры критически важно, чтобы элементы шапки оставались доступными при фокусе. Headroom.js позволяет динамически фиксировать шапку при фокусе на интерактивном элементе, предотвращая её исчезновение при прокрутке:
const interactiveElements = header.querySelectorAll('a, button, input');
interactiveElements.forEach(el => {
el.addEventListener('focus', () => headroom.pin());
el.addEventListener('blur', () => headroom.unpin());
});
Ключевой момент: использование pin() при
focus гарантирует, что меню, кнопки и поля ввода остаются
видимыми для пользователя клавиатуры.
Headroom.js поддерживает опции tolerance и
offset, которые влияют на чувствительность к прокрутке. Для
клавиатурной навигации стоит учитывать, что быстрая прокрутка с
клавиатуры может привести к нежелательному скрытию шапки.
Рекомендуется:
const options = {
tolerance: {
up: 5,
down: 5
},
offset: 50,
onPin: () => console.log('header pinned'),
onUnpin: () => console.log('header unpinned')
};
const hr = new Headroom(header, options);
hr.init();
Значение tolerance в диапазоне 5–10 пикселей
минимизирует срабатывания при небольших изменениях прокрутки с
клавиатуры.
При открытии модальных окон или выпадающих меню важно блокировать автоматическое скрытие шапки:
const modal = document.querySelector('.modal');
modal.addEventListener('open', () => headroom.pin());
modal.addEventListener('close', () => headroom.unpin());
Также полезно временно отключать автоматическое скрытие при активном
focus внутри модального окна, чтобы клавиатурная навигация
не столкнулась с исчезающим интерфейсом.
Для полной доступности стоит учитывать:
scroll вместе с Headroom.js для плавного управления
шапкой.pin() и unpin() вызываются в зависимости от
положения прокрутки и активности клавиатуры).role="banner",
aria-hidden при скрытии и т.п.).window.addEventListener('scroll', () => {
const focusedElement = document.activeElement;
if (header.contains(focusedElement)) {
headroom.pin(); // предотвращение скрытия шапки при активном фокусе
}
});
tolerance и offset для более
плавного взаимодействия с клавиатурой.onPin и onUnpin для
кастомных эффектов при навигации клавиатурой.Хотите, я могу написать следующую главу с примерами доступного управления Headroom.js с помощью клавиш Tab и стрелок, где будет полный рабочий пример с меню и модальными окнами?