Stickybits — это лёгкая библиотека для управления «липким» поведением элементов на странице. Когда на странице присутствует несколько элементов, которые должны вести себя независимо друг от друга, важно корректно организовать создание и управление несколькими экземплярами Stickybits.
Каждый экземпляр Stickybits создаётся через функцию
stickybits(target, options), где:
target — CSS-селектор или DOM-элемент;
options — объект с настройками, включая:
useStickyClasses (boolean) — добавление CSS-классов при
активации липкого поведения;stickyBitStickyOffset (number) — смещение от верхнего
края окна;stickyBitScrollContainer (DOM) — контейнер для
скролла.Создание нескольких экземпляров не конфликтует между собой, если каждому передан собственный target. Например:
const stickyHeader = stickybits('.header', { useStickyClasses: true });
const stickySidebar = stickybits('.sidebar', { useStickyClasses: true, stickyBitStickyOffset: 20 });
В этом примере .header и .sidebar будут
вести себя независимо, применяя свои настройки.
Stickybits позволяет создавать множественные экземпляры сразу, если target содержит несколько элементов:
const stickyItems = stickybits('.sticky-item', { useStickyClasses: true });
stickyItems будет массивом объектов, каждый из
которых управляет своим DOM-элементом.
Каждый объект включает методы:
.cleanup() — отключение sticky для конкретного
элемента;.update() — обновление позиции и состояния
липкости.Важно помнить, что вызов cleanup на одном
объекте не затрагивает остальные элементы, даже если они были
созданы одной командой.
Если несколько липких элементов находятся на одной странице и потенциально могут пересекаться, рекомендуется контролировать их offset и порядок отрисовки:
stickyBitStickyOffset для каждого элемента, чтобы
элементы не перекрывали друг друга при скролле..update() для соответствующих экземпляров:stickyItems.forEach(item => item.update());
Это особенно важно для страниц с ленивой загрузкой контента или изменением размеров элементов.
Если на странице элементы добавляются или удаляются динамически, необходимо корректно очищать старые экземпляры, чтобы избежать накопления обработчиков событий и конфликтов:
stickyItems.forEach(item => item.cleanup());
stickyItems = stickybits('.sticky-item', { useStickyClasses: true });
.cleanup() удаляет все внутренние слушатели
событий и CSS-классы, связанные с конкретным экземпляром..update())
необходимо при изменении DOM или размеров окна.Использование этих принципов позволяет строить страницы с несколькими независимыми липкими блоками, управлять их поведением централизованно и избегать неожиданных пересечений.
// Инициализация разных элементов
const stickyHeader = stickybits('.header', { stickyBitStickyOffset: 0 });
const stickySidebar = stickybits('.sidebar', { stickyBitStickyOffset: 50 });
const stickyAds = stickybits('.ad-banner', { stickyBitStickyOffset: 100 });
// Обновление всех элементов при изменении размеров
window.addEventListener('resize', () => {
[stickyHeader, stickySidebar, stickyAds].forEach(instance => instance.update());
});
// Очистка при удалении элементов
document.querySelectorAll('.ad-banner').forEach(ad => {
ad.remove();
});
stickyAds.forEach(instance => instance.cleanup());
В этом примере каждый блок управляется независимо, с корректными offset, обновлениями и очисткой, что обеспечивает стабильное и предсказуемое поведение всей страницы.