Stickybits — это лёгкая JavaScript-библиотека для управления «липким»
позиционированием элементов на веб-странице. Её ключевая задача —
заменить стандартное поведение position: sticky в CSS,
предоставляя возможность программного управления и совместимости с
устаревшими браузерами. Основная концепция построена вокруг отслеживания
позиции элемента относительно окна браузера и изменения его состояния
через JavaScript.
Библиотека предоставляет три основных состояния элемента:
Эти состояния управляются внутренними классами и событиями, что позволяет программно реагировать на изменение позиции.
Создание объекта Stickybits осуществляется вызовом функции
stickybits с указанием целевого селектора:
const sticky = stickybits('.header');
Параметры функции:
selector — строка CSS-селектора для элементов, которые
должны стать «липкими».options — объект настроек, позволяющий изменить
поведение Stickybits.Пример расширенной инициализации:
const sticky = stickybits('.header', {
stickyBitStickyOffset: 10, // отступ от верхней границы окна при фиксации
useStickyClasses: true, // добавление CSS-классов в зависимости от состояния
verticalPosition: 'top', // позиция фиксирования: 'top' или 'bottom'
});
Ключевой параметр stickyBitStickyOffset позволяет
задавать смещение для фиксированного элемента, что полезно, если на
странице есть фиксированные панели или шапки.
Stickybits предоставляет несколько методов для программного управления элементами:
update() — пересчитывает позиции и
состояния всех элементов. Используется при динамическом изменении
содержимого страницы или размеров контейнеров:sticky.update();
cleanup() — удаляет все классы,
обработчики событий и сбрасывает элемент в обычное состояние:sticky.cleanup();
addInstance(el) — позволяет добавить
отдельный элемент для управления, если он появился динамически после
инициализации:sticky.addInstance(document.querySelector('.new-header'));
removeInstance(el) — удаляет элемент
из управления Stickybits, при этом элемент возвращается к обычному
позиционированию:sticky.removeInstance(document.querySelector('.old-header'));
Эти методы позволяют полностью контролировать состояние «липких» элементов, особенно при работе с динамическим контентом и адаптивными макетами.
Если включена опция useStickyClasses, Stickybits
автоматически добавляет к элементам три класса:
.js-is-sticky — элемент зафиксирован в верхней части
окна..js-is-stuck — элемент достиг нижней границы
контейнера..js-is-default — элемент находится в обычном
состоянии.Программно можно реагировать на эти классы, изменяя стили через JavaScript или CSS:
const header = document.querySelector('.header');
header.addEventListener('stickybit:stateChange', (event) => {
const state = event.detail;
if(state === 'sticky') {
console.log('Элемент зафиксирован');
} else if(state === 'stuck') {
console.log('Элемент достиг конца контейнера');
} else {
console.log('Элемент в обычном состоянии');
}
});
Событие stickybit:stateChange передаёт текущее состояние
элемента, что позволяет программно управлять анимациями, стилями и
поведением других компонентов страницы.
Stickybits поддерживает точное программное управление смещением:
stickyBitStickyOffset — задаёт
вертикальный отступ при фиксации.verticalPosition — управляет позицией
элемента относительно окна (top или
bottom).Пример использования для фиксирования элемента с отступом в 50px:
stickybits('.sidebar', {
stickyBitStickyOffset: 50,
verticalPosition: 'top'
});
Это особенно полезно при создании интерфейсов с фиксированными навигационными панелями, где требуется избежать наложения элементов друг на друга.
Stickybits позволяет управлять элементами, которые появляются или
исчезают в DOM. Для этого используется комбинация методов
addInstance и removeInstance:
// Динамически добавленный элемент
const newElement = document.createElement('div');
newElement.classList.add('dynamic-header');
document.body.appendChild(newElement);
// Добавление в Stickybits
sticky.addInstance(newElement);
// Позже, при удалении элемента
sticky.removeInstance(newElement);
Методы обеспечивают автоматическую обработку событий скролла и обновление состояний без необходимости заново инициализировать библиотеку.
Stickybits легко интегрируется с анимационными библиотеками и фреймворками, поскольку изменение состояния элемента отражается через классы и события. Можно, например, запускать анимацию появления при фиксации элемента:
document.querySelector('.header').addEventListener('stickybit:stateChange', (e) => {
if(e.detail === 'sticky') {
gsap.to('.header', { opacity: 1, duration: 0.5 });
}
});
Такой подход позволяет создавать сложные интерфейсы с плавным взаимодействием, сохраняя контроль над состояниями через программный API Stickybits.
Для снижения нагрузки при большом количестве «липких» элементов рекомендуется:
useStickyClasses вместо постоянного
изменения стилей через JS.update() делать только при реальной
необходимости (например, после изменения DOM).requestAnimationFrame внутри библиотек анимации или
кастомного кода.Stickybits автоматически оптимизирует обработку скролла, но при
сложных интерфейсах программное управление методами update
и cleanup даёт точный контроль над производительностью.