Você já se perguntou como rastrear quando elementos com positions: sticky
se tornam fixas? Eric Bidelman tem um post incrível sobre esse tópico, leia-o agora.
Eu encontrei algumas dificuldades ao usá-lo no meu projeto. Aqui estão elas:
- Quebra o encapsulamento.
sticky-change
evento sticky-change
refere-se ao elemento do cabeçalho, mas é necessário inserir sentinelas no pai do cabeçalho (e torná-lo na position: relative
). - Envolve muitos fatores que devem ser consistentes e sua conexão nem sempre é óbvia. Por exemplo, você não pode definir
--default-padding
maior que 40px
, que é a altura da sentinela superior. - Você não pode rastrear blocos no meio de um artigo.
Vamos tentar melhorá-lo!
Todos esses problemas refletem o mesmo problema: a solução de Eric é rastrear a posição dos pais de sticky, não o próprio bloco pegajoso. Vamos melhorar isso, mantendo a ideia original. Como Adicionaremos sentinelas ao próprio cabeçalho e observaremos sua interseção com o contêiner.

Aqui está como fazê-lo:
- Você precisa de um sentinela para cada lado adesivo que deseja observar.
- Defina a primeira propriedade
top
sentinela igual a top
cabeçalho, mas com sinal inverso menos 1. Por exemplo, se o cabeçalho tiver top: 10px
, defina o cabeçalho do sentinela como -11px
. Você pode usar algo como top: calc(-1px + -1 * var( -- header-sticky-top))
ou apenas definir -1px
se você tiver o cabeçalho top igual a zero. - Adicione outros sentinelas, se necessário.
- Observe a interseção das sentinelas com o contêiner.
- Você pode dizer que o cabeçalho
isIntersecting = true
se o registro de interseção sentinela tiver isIntersecting = true
, intersectionRatio = 0
e intersectionRect.top = rootBounds.top
- Mesmos outros lados, apenas assista embaixo, esquerda ou direita em vez de cima.
- Não se esqueça de adicionar
visibility: hidden
pointer-events: none
visibility: hidden
e pointer-events: none
para sentinelas.
Confira a demonstração e as fontes aqui