Stickybits — это лёгкая библиотека JavaScript для управления «липким» позиционированием элементов на странице. Она упрощает задачу фиксации элементов при прокрутке, одновременно предоставляя возможность гибкой настройки через пользовательские обработчики событий. Работа с обработчиками позволяет контролировать поведение элементов не только на этапе инициализации, но и динамически во время взаимодействия пользователя с интерфейсом.
Для начала необходимо подключить Stickybits к элементу страницы. Это выполняется стандартным вызовом функции:
const sticky = stickybits('.element', {
stickyBitStickyOffset: 0,
useStickyClasses: true
});
Параметры инициализации:
stickyBitStickyOffset — смещение от верхнего края окна,
при котором элемент становится «липким».useStickyClasses — включение добавления CSS-классов
.is-sticky и .is-stuck, что позволяет
контролировать стили через CSS.Инициализация возвращает объект Stickybits, который можно использовать для управления элементом и подключения пользовательских обработчиков.
Stickybits предоставляет возможность подписки на три основных события:
sticky — срабатывает, когда элемент
становится «липким».stuck — срабатывает, когда элемент
достигает нижней границы контейнера и фиксируется внизу.unstick — срабатывает, когда элемент
перестаёт быть «липким».Пример подключения обработчика:
sticky.addStateChangeListener((state) => {
if (state.isSticky) {
console.log('Элемент теперь липкий');
}
if (state.isStuck) {
console.log('Элемент зафиксирован внизу контейнера');
}
if (!state.isSticky && !state.isStuck) {
console.log('Элемент вернулся к обычному позиционированию');
}
});
Объект state содержит:
isSticky — логическое значение, указывающее, что
элемент в состоянии «липкости».isStuck — логическое значение, указывающее, что элемент
зафиксирован внизу контейнера.stickyStart — координата начала липкости элемента.stickyStop — координата конца действия «липкости».Использование этих данных позволяет динамически изменять стили, запускать анимации или синхронизировать состояние с другими элементами интерфейса.
Для гибкого взаимодействия можно реализовать свои обработчики и
подключать их через стандартный метод on. Stickybits
поддерживает передачу функции с одним аргументом — объектом
состояния:
function customHandler(state) {
if (state.isSticky) {
document.querySelector('.indicator').classList.add('active');
} else {
document.querySelector('.indicator').classList.remove('active');
}
}
sticky.on('sticky', customHandler);
sticky.on('unstick', customHandler);
Особенности:
off.Для удаления пользовательского обработчика используется метод
off:
sticky.off('sticky', customHandler);
Удаление обеспечивает освобождение памяти и предотвращает выполнение ненужных функций при последующих изменениях прокрутки. Это особенно важно при динамическом добавлении и удалении элементов на странице.
Stickybits позволяет синхронизировать события с CSS-анимациями.
Использование обработчиков sticky и unstick
открывает возможность:
sticky.on('sticky', () => {
document.querySelector('.menu').classList.add('slide-down');
});
sticky.on('unstick', () => {
document.querySelector('.menu').classList.remove('slide-down');
});
В этом примере класс slide-down добавляется при
достижении состояния «липкости», а затем удаляется, когда элемент
возвращается в исходное положение.
Stickybits позволяет работать сразу с набором элементов:
const stickies = stickybits('.items', {
stickyBitStickyOffset: 10
});
stickies.forEach(item => {
item.addStateChangeListener((state) => {
console.log(`Элемент ${item.element.id} теперь ${state.isSticky ? 'липкий' : 'обычный'}`);
});
});
Каждый элемент имеет свой объект Stickybits и собственное состояние, что позволяет отслеживать и управлять поведением каждого элемента индивидуально.
Иногда необходимо пересчитывать положение элемента после изменения
DOM. Stickybits предоставляет метод update:
sticky.update();
Это полезно при изменении высоты контейнера или добавлении контента,
чтобы пользовательские обработчики продолжали работать корректно, и
состояние sticky/stuck оставалось
актуальным.
Пользовательские обработчики позволяют легко интегрировать Stickybits с другими библиотеками, например, для анимации или параллакса:
sticky.addStateChangeListener((state) => {
if (state.isSticky) {
gsap.to('.sidebar', { x: 100, duration: 0.5 });
} else {
gsap.to('.sidebar', { x: 0, duration: 0.5 });
}
});
Здесь использование gsap позволяет анимировать элемент в
зависимости от состояния Stickybits, создавая более живой и динамичный
интерфейс.
update для точного позиционирования.Эти практики обеспечивают плавное и корректное поведение «липких» элементов даже на страницах с большим количеством контента и динамически изменяемыми блоками.