O scrollspy acompanha a rolagem de um container, atualiza o fragmento ativo e sincroniza menus simples ou hierárquicos.
Menu sincronizado
Os itens usam liScrollSpyItem e herdam o estado ativo do menu.
Container observado
A diretiva abaixo observa a rolagem local do painel e emite activeChange.
Basic service
O serviço pode observar fragments por id, iniciar quando o container estiver pronto e publicar o fragmento ativo para qualquer menu ou painel auxiliar.
Essa versão usa um algoritmo configurável e leve, adequado para containers locais em dashboards, sidebars de documentação e áreas de preview.
Imperative API
scrollTo() permite navegar programaticamente para um fragmento, enquanto observe() e unobserve() controlam quais seções participam do cálculo.
Isso cobre o caso de páginas com conteúdo montado dinamicamente ou quando você quer integrar o scrollspy com botões externos ao menu.
Directive sugar
liScrollSpy instancia o serviço no container, registra fragments filhos e faz o cleanup automaticamente quando a view some.
O fragmento ativo também pode ser refletido via active, active$ e (activeChange).
Highlighting active items
Itens ligados por liScrollSpyItem recebem .active automaticamente e podem disparar a navegação do próprio fragmento ao clique.
Menus simples e aninhados usam a mesma base, então a API fica consistente para pills, listas laterais e índices de documentação.
Customization
Você pode trocar o algoritmo com processChanges, ajustar rootMargin e definir o comportamento padrão de rolagem via LiScrollSpyConfig.
Isso é útil quando o topo visual da área observada não coincide com o topo físico do container ou quando a página tem header fixo.
A API pública segue a mesma ideia do ng-bootstrap: container, fragments, items, menu hierárquico e um serviço compartilhado.
liScrollSpyinstancia e exporta o controller do container.liScrollSpyFragmentdefine seções observadas com id único.liScrollSpyItemsincroniza navegação e classeactive.liScrollSpyMenupropaga o ativo para a branch inteira em menus aninhados.LiScrollSpyConfigfornece defaults para algoritmo e comportamento de rolagem.
<nav [liScrollSpyMenu]="spy" class="nav nav-pills flex-column">
<button class="nav-link" type="button" liScrollSpyItem="overview">Overview</button>
<button class="nav-link" type="button" [liScrollSpyItem]="[spy, 'items', 'directive']">Items</button>
</nav>
<div liScrollSpy #spy="liScrollSpy" (activeChange)="onActiveChange($event)">
<section liScrollSpyFragment="overview">...</section>
<section liScrollSpyFragment="service">...</section>
<section liScrollSpyFragment="directive">...</section>
</div>