Для интеграции Stickybits в проект на Angular необходимо сначала установить пакет через npm:
npm install stickybits --save
После установки библиотеку можно импортировать в компонент или сервис:
import stickybits from 'stickybits';
Рекомендуется инициализировать Stickybits внутри жизненного цикла
компонента ngAfterViewInit, чтобы гарантировать наличие
DOM-элементов, к которым будет применяться «липкое» поведение.
import { Component, AfterViewInit } from '@angular/core';
import stickybits from 'stickybits';
@Component({
selector: 'app-sticky-demo',
templateUrl: './sticky-demo.component.html',
styleUrls: ['./sticky-demo.component.scss']
})
export class StickyDemoComponent implements AfterViewInit {
ngAfterViewInit(): void {
stickybits('.sticky-element', {
stickyBitStickyOffset: 0,
useStickyClasses: true,
verticalPosition: 'top'
});
}
}
true
Stickybits добавляет CSS-классы (.is-sticky,
.is-stuck), что упрощает стилизацию через SCSS или
CSS.'top' или 'bottom').Пример с использованием кастомного смещения и ограничением родителем:
stickybits('.sticky-element', {
stickyBitStickyOffset: 60,
useStickyClasses: true,
verticalPosition: 'top',
parentClass: 'sticky-container'
});
В Angular часто используется динамическая подгрузка контента через
*ngIf или *ngFor. В таких случаях
Stickybits необходимо инициализировать после того, как
элемент появился в DOM. Для этого удобно использовать
ViewChild или AfterViewInit.
import { ViewChild, ElementRef } from '@angular/core';
@ViewChild('dynamicSticky') dynamicSticky!: ElementRef;
ngAfterViewInit(): void {
if (this.dynamicSticky) {
stickybits(this.dynamicSticky.nativeElement, {
stickyBitStickyOffset: 50
});
}
}
Если элементы могут появляться и исчезать динамически, рекомендуется
использовать MutationObserver или Angular
ngAfterViewChecked, чтобы повторно инициализировать
Stickybits при изменении DOM.
Stickybits добавляет следующие CSS-классы к элементу:
.js-is-sticky — элемент в состоянии «липкости».js-is-stuck — элемент достиг границы родителя.js-is-bottom — элемент закреплён у нижней границы
родителя (для verticalPosition 'bottom')Пример SCSS для визуального эффекта:
.sticky-element {
transition: all 0.3s ease;
&.js-is-sticky {
background-color: rgba(255, 255, 255, 0.95);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
&.js-is-stuck {
background-color: rgba(240, 240, 240, 0.95);
}
}
Для корректного управления памятью и предотвращения конфликтов при переходе между компонентами рекомендуется очищать Stickybits перед уничтожением компонента:
import { OnDestroy } from '@angular/core';
export class StickyDemoComponent implements AfterViewInit, OnDestroy {
private stickyInstance: any;
ngAfterViewInit(): void {
this.stickyInstance = stickybits('.sticky-element', { useStickyClasses: true });
}
ngOnDestroy(): void {
if (this.stickyInstance) {
this.stickyInstance.cleanup();
}
}
}
При использовании Angular Material и Flex Layout важно учитывать, что Stickybits применяет фиксированное позиционирование. Для корректной работы:
position: relative)mat-toolbar или фиксированные шапки,
задавать stickyBitStickyOffset равным их высотеfxLayout проверять, что элементы не
скрываются или не смещаются динамически без уведомления StickybitsStickybits корректно работает с responsive-дизайном, но при изменении
ширины экрана может понадобиться пересчитать позиции. Для этого удобно
подписаться на событие window.resize и вызывать повторную
инициализацию:
window.addEventListener('resize', () => {
if (this.stickyInstance) {
this.stickyInstance.cleanup();
this.stickyInstance.update();
}
});
Stickybits можно комбинировать с Angular анимациями для плавного
появления «липкого» элемента. При этом CSS-классы
.js-is-sticky удобно использовать как триггеры:
animations: [
trigger('stickyFade', [
state('inactive', style({ opacity: 0 })),
state('active', style({ opacity: 1 })),
transition('inactive => active', animate('300ms ease-in')),
transition('active => inactive', animate('200ms ease-out'))
])
]
<div [@stickyFade]="isSticky ? 'active' : 'inactive'" class="sticky-element">
Контент
</div>
Stickybits использует минимальное количество слушателей событий и оптимизирован для быстрого рендера. Тем не менее при большом количестве «липких» элементов рекомендуется:
useStickyClasses: true для стилизации
через классы вместо ручного JS-манипулирования стилямиЭти подходы гарантируют стабильную работу и минимальную нагрузку на DOM, сохраняя плавность скроллинга даже на мобильных устройствах.