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-changeeventosticky-changerefere-se ao elemento do cabeçalho, mas é necessário inserir sentinelas no pai do cabeçalho (e torná-lo naposition: relative).
- Envolve muitos fatores que devem ser consistentes e sua conexão nem sempre é óbvia. Por exemplo, você não pode definir --default-paddingmaior que40px, 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 topsentinela igual atopcabeçalho, mas com sinal inverso menos 1. Por exemplo, se o cabeçalho tivertop: 10px, defina o cabeçalho do sentinela como-11px. Você pode usar algo comotop: calc(-1px + -1 * var( -- header-sticky-top))ou apenas definir-1pxse 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 = truese o registro de interseção sentinela tiverisIntersecting = true,intersectionRatio = 0eintersectionRect.top = rootBounds.top
- Mesmos outros lados, apenas assista embaixo, esquerda ou direita em vez de cima.
- Não se esqueça de adicionar visibility: hiddenpointer-events: nonevisibility: hiddenepointer-events: nonepara sentinelas.
Confira a demonstração e as fontes aqui