A barra "nesta página" das páginas longas: o nome da página à esquerda, as seções no meio, um botão à direita. Ela rola junto com a página até encostar no topo e ali gruda, ganhando vidro. Conforme a leitura desce, a seção em que você está ganha um filete na cor de marca, que anda de um link para o outro. Clicar leva até a seção — descontada a altura da barra, para o título não nascer escondido atrás dela.
O problema que ela resolve: página de serviço de assessoria tem seis, oito dobras, e quem chega de um anúncio quer uma delas — os honorários, as perguntas. Sem índice, a pessoa rola procurando, e quem rola procurando desiste. O nav-fixa-vidro diz para onde se pode ir no site; este diz para onde se pode ir nesta página, e onde você está nela.
Quando usar
- Página de serviço, de produto ou de método com cinco dobras ou mais, em que as dobras têm nome.
- Logo depois do hero, como a primeira coisa que a pessoa encontra ao começar a rolar.
- Junto do
navegacao/nav-fixa-vidro, com a variação sob o menu fixo.
Quando não usar
- Home ou landing de campanha curta. Três dobras não pedem índice, e a barra vira ruído no topo da tela.
- Seções sem nome próprio. Se a dobra não tem um substantivo que a pessoa procuraria ("Visão geral", "Honorários"), não há o que pôr no link.
- Junto do
navegacao/progresso-leitura. Os dois indicam posição; um basta. Página de leitura corrida usa o filete, página de seções usa o índice. - Mais de sete seções. Acima disso o trilho não cabe nem no desktop, e índice que rola de lado no desktop é índice que ninguém lê.
Padrão editorial
| Slot | Regra |
|---|---|
| Título da página | 1 a 4 palavras, igual ao h1 ou mais curto. Some abaixo de 860px. Opcional |
| Seção | 1 a 3 palavras por link, substantivo, o nome que a dobra já tem na página. 3 a 7 links |
| Botão | 1 a 3 palavras, verbo mais objeto, o mesmo destino do CTA principal. Opcional |
O que mantém a peça: o link repete o nome da seção, não o parafraseia. Quem clica em "Honorários" tem de cair num título que diz "Honorários", e não em "Quanto custa ter a gente por perto".
Especificação dos assets
Nenhum.
Como usar
<link rel="stylesheet" href="componentes/navegacao/indice-ancoras/estilo.css">
<script src="componentes/navegacao/indice-ancoras/script.js"></script>
Cole a <nav> entre duas seções, como irmã delas — nunca dentro de uma. E dê a cada seção o id que o link aponta:
<section class="sec-dark sec-pad">…hero…</section>
<nav class="anc sec-deep" data-anc aria-label="Nesta página">…</nav>
<section class="sec-dark sec-pad" id="visao-geral">…</section>
<section class="sec-deep sec-pad" id="como-funciona">…</section>
Ganchos
| Gancho | Papel |
|---|---|
[data-anc] |
a raiz que o script procura. Pode repetir, cada uma com os próprios links |
.anc.is-preso |
escrito pelo script enquanto a barra está grudada. O CSS troca o fundo sólido por vidro |
.anc.is-ativo |
há uma seção marcada. Antes da primeira seção, nenhuma está, e a marca some |
.anc-link[aria-current="location"] |
o link da seção em leitura |
--anc-top |
onde a barra gruda. 0px por padrão |
--anc-z |
camada. 90: abaixo do menu fixo (100) |
Variações
- Sob o menu fixo —
--anc-top: var(--nav-h)na raiz. A barra encosta na borda de baixo donav-fixa-vidro. - Sem título e sem botão — apague
.anc-tituloe.anc-cta; o trilho ocupa a barra inteira. - Página clara (experimental) —
.sec-paperno lugar de.sec-deep. O vidro é o--bgdo escopo, então segue o tom.
Gotchas
-
Fora de qualquer
<section>, sempre.position:stickygruda dentro do bloco que o contém. Dentro de uma seção, a barra gruda enquanto aquela seção passa e solta no fim dela, levando o índice embora justamente quando a pessoa chegou às outras. É o erro mais provável de colagem, e não dá sinal nenhum na primeira dobra. -
O clique desconta a barra. O salto nativo de âncora para com o topo da seção no topo da janela — atrás da barra grudada, e do menu fixo se houver. O script calcula o destino com a altura da barra mais o
--anc-top, e escreve o hash comreplaceState, sem segundo salto. Sem JavaScript o salto nativo continua funcionando, só que com o título coberto: dêscroll-margin-topàs seções se a página precisar disso sem script. -
A marca anda por
transform, nunca porleft/width. Uma base de 1px escalada emscaleXe deslocada emtranslateX: o navegador move sem refazer o layout da barra — que está grudada e é repintada a cada quadro de rolagem. -
O link ativo vem para o meio pelo
scrollLeftdo trilho.scrollIntoViewno link parece a saída óbvia, e rola a página junto — a pessoa desce um pouco, a seção troca, e a página dá um solavanco para realinhar o link. Medido: oscrollTono próprio trilho não toca no scroll da página. -
"Atual" é a última seção cujo topo passou da linha de corte, e a linha fica um quarto de tela abaixo do pé da barra. Linha colada na barra marcaria a seção nova só depois de o título dela já ter saído da vista. No fim da página, a última seção vence mesmo sem chegar à linha — senão uma seção final curta nunca seria marcada.
-
Link sem alvo sai da conta, e continua lá. Se o
idnão existe, o script não o considera para a marca — marcar um link que não leva a lugar nenhum seria mentir. Mas o link morto continua na barra: confira oshrefao colar. -
Foco vai para a seção. Depois do clique, o alvo recebe
tabindex="-1"e o foco, sem rolar de novo. É o que o salto nativo faria por quem navega por teclado: o próximo Tab parte da seção, e não do topo da página.
Movimento reduzido / toque
Com prefers-reduced-motion: reduce o clique chega direto, sem atravessar a página rolando, e a marca troca de link sem deslizar. A barra continua grudando e marcando — posição é informação, não enfeite.
No toque o trilho rola de lado com o dedo, com as pontas dissolvidas em máscara para o link cortado ler como "tem mais", e o link ativo é trazido para o meio sozinho.
Histórico
| Origem | Quando | O quê |
|---|---|---|
| autoral | 2026-09-29 | Construído do zero. Padrão de domínio comum, sem referência única |
Origem. É a barra das páginas de produto da Apple, dos sumários de documentação e das landings longas de SaaS — um padrão tão difundido que não tem dono. Nada foi copiado. O registro consolidado vai em projetos/autorais.md.
Por que agora. A descrição da categoria navegacao promete "âncoras" desde o primeiro dia, e nenhum componente entregava. É o mesmo tipo de dívida que a leva de 2026-09-06 pagou: descrição que promete e não entrega é descoberta pelo consumidor no meio de um projeto.
Decisões da tradução para o contrato. Escopo de tom próprio, como o menu fixo, porque não é <section>. A marca por transform, o trilho alinhado por scrollLeft, o clique descontando a barra, e nenhum listener de scroll próprio — assina LIB.onScroll.