Библиотека Stickybits предоставляет лёгкий способ
создания «липких» элементов на веб-странице, обеспечивая поддержку
современных браузеров и упрощая работу с CSS-свойством
position: sticky. Одной из продвинутых возможностей
является контроль количества элементов, которые могут
одновременно вести себя как липкие, что важно для сложных интерфейсов с
множественными фиксированными блоками.
По умолчанию Stickybits применяет липкость ко всем выбранным
элементам. В случае использования нескольких блоков на одной странице
возникает проблема перекрытия или избыточной фиксации,
когда несколько элементов одновременно занимают фиксированное положение,
создавая визуальный хаос. Чтобы управлять этим, используется параметр
stickyBitStickyClass совместно с логикой ограничения.
Принцип работы:
stickybit при
инициализации.useStickyClassesStickybits позволяет задать кастомные классы, которые облегчают управление состоянием элементов:
const stickyInstance = stickybits('.sticky', {
stickyBitStickyClass: 'is-sticky',
useStickyClasses: true
});
stickyBitStickyClass — класс, который добавляется к
элементу при активации липкости.useStickyClasses — флаг, разрешающий использование
CSS-классов для управления состоянием.Используя эти классы, можно написать логику ограничения количества одновременно активных элементов.
Для контроля количества «липких» элементов создаётся вспомогательная функция, отслеживающая состояние всех элементов на странице:
const stickyElements = document.querySelectorAll('.sticky');
const maxSticky = 2; // Максимальное количество элементов в состоянии sticky
stickyElements.forEach(el => {
el.addEventListener('stickybit:stick', () => {
const activeSticky = document.querySelectorAll('.is-sticky');
if (activeSticky.length > maxSticky) {
el.classList.remove('is-sticky');
stickyInstance.cleanup(el); // Сбрасываем поведение sticky
}
});
el.addEventListener('stickybit:unstick', () => {
// Дополнительно можно отслеживать освобождение слотов
});
});
Ключевые моменты:
stickybit:stick и
stickybit:unstick позволяет реагировать на изменение
состояния элементов.cleanup снимает липкость с элемента, позволяя
другим элементам занять «свободный слот».maxSticky легко
настраивается в зависимости от требований интерфейса.В интерфейсах с длинными списками и несколькими липкими панелями часто возникает ситуация, когда элементы накладываются друг на друга. Для предотвращения этого можно использовать динамическое смещение:
stickyElements.forEach((el, index) => {
el.addEventListener('stickybit:stick', () => {
const activeSticky = document.querySelectorAll('.is-sticky');
let offset = 0;
activeSticky.forEach(activeEl => {
if (activeEl !== el) {
offset += activeEl.offsetHeight;
}
});
el.style.top = offset + 'px';
});
el.addEventListener('stickybit:unstick', () => {
el.style.top = '';
});
});
top гарантирует, что каждый новый
«липкий» элемент располагается под предыдущим, не
перекрывая его.Хотя Stickybits управляет липкостью через JavaScript, использование CSS позволяет упростить визуальное оформление и повысить производительность:
.sticky {
position: relative; /* По умолчанию */
}
.is-sticky {
position: fixed;
top: 0;
z-index: 100;
width: 100%;
}
Рекомендации:
transition) для плавной анимации
изменения положения.Предположим, на странице три боковые панели, но одновременно должны быть активны только две:
const maxSticky = 2;
stickyElements.forEach(el => {
el.addEventListener('stickybit:stick', () => {
const active = document.querySelectorAll('.is-sticky');
if (active.length > maxSticky) {
const lastActive = active[active.length - 1];
lastActive.classList.remove('is-sticky');
stickyInstance.cleanup(lastActive);
}
});
});
useStickyClasses.stickybit:stick и
stickybit:unstick.top для
предотвращения перекрытий.Эта комбинация обеспечивает гибкое и управляемое поведение липких элементов, даже в сложных интерфейсах с множественными панелями или контентными блоками.