Scrollspy Componentes
Um sumário que acompanha a leitura: conforme a pessoa rola, o link da parte que está na tela acende, com um marcador que desliza. <nav sw-scrollspy>.
O que é
Em página comprida — um texto de blog, uma página de serviços, um manual — é comum ter um "índice" do lado ou no topo. O scrollspy faz esse índice mostrar onde a pessoa está: enquanto ela rola, o link da seção visível fica destacado e uma barrinha desliza até ele. Clicar num link leva até a seção, rolando suave. Você só coloca sw-scrollspy numa <nav> com links href="#id-da-seção".
O JavaScript do núcleo procura, para cada link, a seção com aquele id. A cada rolagem ele vê qual seção já passou do topo (com uma folga de 80 px, ajustável) e coloca a classe is-act no link dela. O marcador que desliza é criado sozinho. Chegando ao fim da página, o último link acende. Por padrão ele acompanha a rolagem da página; com sw-scrollspy-tgt ele acompanha uma caixa com rolagem própria (como nos quadros abaixo — role dentro deles).
Quando usar
- Página de serviços ou landing longa: índice fixo ao lado com Serviços / Preços / Depoimentos / Contato.
- Artigo de blog, manual, termos de uso: sumário que mostra em que parte do texto a pessoa está.
- Menu do topo de um site de uma página só (one page): os links acendem conforme a seção.
- Ficha de produto com abas "Descrição / Medidas / Avaliações" em uma página só: use o horizontal.
Comece aqui
-
1
Coloque o SWCore na página: CSS no
<head>e JS no fim do<body>. O scrollspy precisa dos dois.<link rel="stylesheet" href="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.css"> <!-- fim do <body> --> <script src="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.js"></script> -
2
Faça a
<nav sw-scrollspy>com um link para cada seção. Ohrefdo link é#+ oidda seção. Pronto: ao rolar a página, o link certo acende.<nav sw-scrollspy> <a href="#servicos">Serviços</a> <a href="#precos">Preços</a> <a href="#contato">Contato</a> </nav> <section id="servicos">…</section> <section id="precos">…</section> <section id="contato">…</section>
Todas as variações
Cada quadro abaixo é o componente de verdade, rodando. O código embaixo é exatamente o que está no quadro: copie e cole.
1. Formatos
Três jeitos de mostrar o índice. Role dentro da caixa de cada quadro e veja o link acompanhar.
Serviços
Corte, barba, sobrancelha e pigmentação. Atendimento com hora marcada.
Preços
Corte R$ 45 · Barba R$ 35 · Combo corte + barba R$ 70.
Equipe
Zé, Carlos e Duda — mais de 10 anos de tesoura.
Endereço
Rua das Flores, 120 — Centro. Aberto de terça a sábado.
<nav sw-scrollspy sw-scrollspy-tgt="#conteudo">
<a href="#servicos">Serviços</a>
<a href="#precos">Preços</a>
<a href="#equipe">Equipe</a>
<a href="#endereco">Endereço</a>
</nav>
<div id="conteudo"> <!-- caixa com rolagem própria -->
<section id="servicos">…</section>
<section id="precos">…</section>
<section id="equipe">…</section>
<section id="endereco">…</section>
</div>
Serviços
Corte, barba, sobrancelha e pigmentação. Atendimento com hora marcada.
Preços
Corte R$ 45 · Barba R$ 35 · Combo corte + barba R$ 70.
Equipe
Zé, Carlos e Duda — mais de 10 anos de tesoura.
Endereço
Rua das Flores, 120 — Centro. Aberto de terça a sábado.
<nav sw-scrollspy sw-scrollspy-dir="h" sw-scrollspy-tgt="#conteudo">
<a href="#servicos">Serviços</a>
<a href="#precos">Preços</a>
<a href="#equipe">Equipe</a>
<a href="#endereco">Endereço</a>
</nav>
Serviços
Corte, barba, sobrancelha e pigmentação. Atendimento com hora marcada.
Preços
Corte R$ 45 · Barba R$ 35 · Combo corte + barba R$ 70.
Equipe
Zé, Carlos e Duda — mais de 10 anos de tesoura.
Endereço
Rua das Flores, 120 — Centro. Aberto de terça a sábado.
<nav sw-scrollspy sw-scrollspy-plain sw-scrollspy-tgt="#conteudo">
<a href="#servicos">Serviços</a>
<a href="#precos">Preços</a>
<a href="#equipe">Equipe</a>
<a href="#endereco">Endereço</a>
</nav>
2. Quando a seção "conta" — sw-scrollspy-offset
A seção vira a atual quando o topo dela chega a 80 px do topo (da página ou da caixa). Com uma barra de menu fixa no topo, aumente esse número para a altura da barra. Com número pequeno, o link só troca quando a seção encosta bem no alto. Compare os dois quadros rolando devagar.
Serviços
Corte, barba, sobrancelha e pigmentação. Atendimento com hora marcada.
Preços
Corte R$ 45 · Barba R$ 35 · Combo corte + barba R$ 70.
Equipe
Zé, Carlos e Duda — mais de 10 anos de tesoura.
Endereço
Rua das Flores, 120 — Centro. Aberto de terça a sábado.
<nav sw-scrollspy sw-scrollspy-offset="10" sw-scrollspy-tgt="#conteudo">…</nav>
Serviços
Corte, barba, sobrancelha e pigmentação. Atendimento com hora marcada.
Preços
Corte R$ 45 · Barba R$ 35 · Combo corte + barba R$ 70.
Equipe
Zé, Carlos e Duda — mais de 10 anos de tesoura.
Endereço
Rua das Flores, 120 — Centro. Aberto de terça a sábado.
<nav sw-scrollspy sw-scrollspy-offset="150" sw-scrollspy-tgt="#conteudo">…</nav>
Tabela de opções
| Palavra | O que faz | Exemplo |
|---|---|---|
| Ligar | ||
sw-scrollspy | Na <nav> com os links. Só contam os links com href começando por #. | <nav sw-scrollspy> |
| Formato | ||
(nenhum) | Vertical: trilho à esquerda e marcador que desliza. | |
sw-scrollspy-dir="h" | Horizontal, tipo abas: trilho embaixo; se não couber, rola para o lado. | sw-scrollspy-dir="h" |
sw-scrollspy-plain | Sem trilho e sem marcador: só a cor do link muda. Não leva valor. | <nav sw-scrollspy sw-scrollspy-plain> |
| Onde olhar | ||
(nenhum) | Acompanha a rolagem da página. | |
sw-scrollspy-tgt | Seletor de uma caixa com rolagem própria (overflow:auto) onde estão as seções. | sw-scrollspy-tgt="#conteudo" |
sw-scrollspy-offset | Folga, em px, a partir do topo para a seção contar como atual. Também é a folga ao rolar pelo clique. Padrão 80. | sw-scrollspy-offset="100" |
| O que ele escreve nos links | ||
is-act | Classe no link da seção atual (use no seu CSS se quiser outro visual). | a.is-act |
aria-current | true no link atual e false nos outros — ajuda quem usa leitor de tela. | |
Receitas prontas — usos reais
Situações que aparecem em quase todo site. Copie a que servir.
<div class="l l-4">
<aside>
<!-- .stk-nav gruda o índice logo abaixo da navbar enquanto a página rola -->
<div class="stk-nav">
<nav sw-scrollspy sw-scrollspy-offset="120">
<a href="#corte">Corte</a>
<a href="#barba">Barba</a>
<a href="#precos">Preços</a>
<a href="#contato">Contato</a>
</nav>
</div>
</aside>
<main class="co3-m">
<section id="corte">…</section>
<section id="barba">…</section>
<section id="precos">…</section>
<section id="contato">…</section>
</main>
</div>
Descrição
Sofá retrátil de 3 lugares, tecido suede, pés de madeira.
Medidas
Largura 2,10 m · Profundidade 0,95 m (aberto 1,50 m) · Altura 0,98 m.
Avaliações
★★★★★ "Muito confortável, chegou antes do prazo." — Márcia
<nav sw-scrollspy sw-scrollspy-dir="h" sw-scrollspy-offset="40" sw-scrollspy-tgt="#ficha">
<a href="#descricao">Descrição</a>
<a href="#medidas">Medidas</a>
<a href="#avaliacoes">Avaliações</a>
</nav>
<div id="ficha" class="ov-au"> <!-- dê uma altura a esta caixa no seu CSS -->
<section id="descricao">…</section>
<section id="medidas">…</section>
<section id="avaliacoes">…</section>
</div>
<!-- a div .stk gruda a faixa no topo ao rolar; o link da seção visível acende -->
<div class="stk bg-sur">
<nav sw-scrollspy sw-scrollspy-dir="h" sw-scrollspy-offset="90">
<a href="#sobre">Sobre</a>
<a href="#portfolio">Portfólio</a>
<a href="#depoimentos">Depoimentos</a>
<a href="#contato">Contato</a>
</nav>
</div>
<section id="sobre">…</section>
<section id="portfolio">…</section>
<section id="depoimentos">…</section>
<section id="contato">…</section>
const indice = document.querySelector('[sw-scrollspy]');
indice.addEventListener('sw:scrollspy:change', (e) => {
// e.detail.id → id da seção atual, ex.: "precos"
// e.detail.link → o <a> que acendeu
document.title = 'Barbearia do Zé — ' + e.detail.link.textContent;
});
Eventos
sw:scrollspy:change<nav> com a seção atual: e.detail.id (id da seção) e e.detail.link (o link aceso). Dispara só quando a seção atual muda (não a cada movimento de rolagem).API (JavaScript)
SW.Scrollspy.initAll(raiz)[sw-scrollspy] dentro de raiz que ainda não foram ligados. O núcleo já faz sozinho.Precisa de quê
swcore.min.css+swcore.min.js.- Cada link com
href="#id"e uma seção na página com aqueleid.
Cuidados — erros comuns
- Link com
hrefdiferente doidda seção (#Precos×id="precos"): aquele link nunca acende. Maiúscula e minúscula contam. - Colocar à mão um
<span sw-scrollspy-mark>: não precisa, o marcador é criado sozinho (e um feito à mão fica parado, sobrando). - Usar
sw-scrollspy-tgtnuma caixa que não tem rolagem própria (sem altura fixa eoverflow:auto): nada acende. Se quem rola é a página, não use o atributo. - Esquecer a folga quando há navbar fixa: o link troca antes/depois da hora. Coloque em
sw-scrollspy-offseta altura da navbar (em px) mais um pouco. - Seções muito curtas no fim da página podem nunca chegar ao topo; por isso, no fim da rolagem, o último link acende sozinho.
O que ele não faz
- Não cria o índice sozinho a partir dos títulos da página: você escreve os links.
- Só um nível de links (não destaca subtítulos dentro de subtítulos).

