Stickybits — это легковесная библиотека для создания «липких» элементов на веб-странице. Когда требуется работать с несколькими элементами одновременно, важно учитывать порядок их расположения, поведение при скролле и взаимодействие с другими блоками страницы. Stickybits позволяет легко создавать несколько независимых липких элементов, при этом каждый элемент управляется своей собственной инстанцией.
Для создания нескольких липких элементов необходимо выбрать все нужные DOM-элементы с помощью селектора и вызвать Stickybits для каждого из них. Например:
const elements = document.querySelectorAll('.sticky');
elements.forEach(el => {
stickybits(el, {
stickyBitStickyOffset: 20,
useStickyClasses: true
});
});
Ключевые моменты:
stickyBitStickyOffset задаёт отступ сверху при
закреплении элемента.useStickyClasses позволяет добавлять CSS-классы
.is-sticky и .is-unsticky, что удобно для
кастомизации стилей.При множественных липких элементах важно учитывать
z-index и визуальный порядок блоков. Stickybits не
изменяет порядок наложения, поэтому при перекрытии элементов необходимо
вручную задавать z-index через CSS:
.sticky:nth-child(1) {
z-index: 10;
}
.sticky:nth-child(2) {
z-index: 20;
}
Кроме того, можно использовать разные stickyBitStickyOffset для каждого элемента, чтобы избежать их наложения при скролле:
stickybits(document.querySelector('#sticky1'), { stickyBitStickyOffset: 10 });
stickybits(document.querySelector('#sticky2'), { stickyBitStickyOffset: 50 });
Иногда удобно группировать элементы по родительскому контейнеру.
Stickybits поддерживает привязку к родителю через параметр
parentClass. Это позволяет ограничить зону скролла, внутри
которой элемент остаётся «липким»:
stickybits('.sticky-group', {
parentClass: 'sticky-container',
useStickyClasses: true
});
parentClass определяет контейнер, в пределах которого
элемент не выходит за границы.Если на странице появляются новые элементы после загрузки или размеры
блоков меняются, необходимо использовать метод update() для
обновления позиции и размеров каждого липкого элемента:
const stickyInstance = stickybits('.sticky');
window.addEventListener('resize', () => {
stickyInstance.forEach(item => item.update());
});
update() пересчитывает размеры и смещения.Для множества элементов необходимо учитывать производительность при скролле:
.is-sticky вместо прямого
изменения стилей через JavaScript.Пример с debounce:
function debounce(fn, delay) {
let timer;
return function () {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, arguments), delay);
};
}
window.addEventListener('scroll', debounce(() => {
stickyInstance.forEach(item => item.update());
}, 50));
Stickybits может работать совместно с библиотеками для анимаций и скролл-триггеров, такими как GSAP или ScrollMagic. Для множественных элементов это позволяет:
stickyInstance.forEach(item => {
item.el.addEventListener('stickybit:stick', () => {
gsap.to(item.el, { opacity: 1, duration: 0.3 });
});
});
Боковые панели в блогах Несколько панелей могут закрепляться при скролле, не перекрывая основное содержание.
Карточки продуктов на странице каталога Липкие
карточки остаются видимыми в пределах своей секции, благодаря
parentClass.
Список фильтров Несколько фильтров могут закрепляться независимо друг от друга с разными смещениями сверху.
position: sticky в сочетании с Stickybits для
современных браузеров, чтобы повысить совместимость.bottom и top через
stickyBitStickyOffset для предотвращения наложений.Множественные липкие элементы требуют аккуратного управления порядком, смещениями и обновлением при изменении DOM. Stickybits предоставляет минимальный, но гибкий API, который позволяет эффективно организовать их поведение на сложных страницах с большим количеством блоков.