¿Alguna vez te has preguntado cómo rastrear cuando los elementos con positions: sticky fijos se vuelven fijos? Eric Bidelman tiene una publicación increíble sobre este tema, ve y léelo ahora.
He encontrado algunas dificultades al usarlo en mi proyecto. Aquí están:
- Rompe la encapsulación.
sticky-change evento de sticky-change fijo se relaciona con el elemento de encabezado, pero debe insertar centinelas en el elemento primario del encabezado (y colocarlo en position: relative ). - Involucra muchos factores que deberían ser consistentes y su conexión no siempre es obvia. Por ejemplo, no puede establecer
--default-padding mayor que 40px , que es la altura del centinela superior. - No puedes rastrear el bloque en medio de un artículo.
¡Intentemos mejorarlo!
Todos esos problemas reflejan el mismo problema: la solución de Eric se trata de rastrear la posición de los padres, no el bloque en sí. Mejoremos esto manteniendo la idea original. Como? Agregaremos centinelas al encabezado y observaremos su intersección con el contenedor.

Aquí está cómo hacerlo:
- Necesita un centinela para cada lado adhesivo que desea observar.
- Establecer la primera propiedad
top centinela es igual a la top encabezado pero con signo inverso menos 1. Por ejemplo, si su encabezado tiene la top: 10px , establezca el encabezado centinela en -11px . Puede usar algo como top: calc(-1px + -1 * var( -- header-sticky-top)) o simplemente establecer -1px si la cabecera superior es igual a cero. - Agregue otros centinelas si es necesario.
- Observe la intersección de los centinelas con el contenedor.
- Puede decir que el encabezado se atascó si el registro de intersección centinela tiene
isIntersecting = true , intersectionRatio = 0 e intersectionRect.top = rootBounds.top - Los mismos otros lados, solo mire abajo, izquierda o derecha en lugar de arriba.
- No olvide agregar
visibility: hidden pointer-events: none visibility: hidden y de pointer-events: none a los centinelas.
Mira la demostración y las fuentes aquí