您是否曾经想过如何跟踪具有固定positions: sticky
元素何时固定? 埃里克·比德尔曼(Eric Bidelman)对此主题有精彩的帖子 ,现在就去阅读。
在项目中使用它时,我发现了一些困难。 它们是:
- 它破坏了封装。
sticky-change
事件与标头元素有关,但是您必须在标头的父级中插入标记(并将其position: relative
)。 - 它涉及许多应该保持一致的因素,并且它们之间的联系并不总是很明显。 例如,您不能将
--default-padding
设置--default-padding
大于40px
,即前哨的高度。 - 您不能在文章的中间跟踪阻止。
让我们尝试改善它!
所有这些问题都反映了一个相同的问题:Eric的解决方案是跟踪粘性的父位置,而不是粘性块本身。 让我们在保留原始思想的同时进行改进。 怎么了 我们将标记添加到标题本身,并观察它们与容器的交集。

这是操作方法:
- 您要观察的每一面都需要一个哨兵。
- 将第一个sentinel
top
属性设置为等于header top
但带有反向符号减1。例如,如果您的标题具有top: 10px
,则将sentinel标头设置为-11px
。 您可以使用类似top: calc(-1px + -1 * var( -- header-sticky-top))
或者如果header top -1px
则只需设置-1px
。 - 如果需要,添加其他标记。
- 观察标记与容器的交点。
- 您可以说,如果前哨路口记录具有
isIntersecting = true
, intersectionRatio = 0
以及intersectionRect.top = rootBounds.top
,则标头卡住 - 与其他相同,请注意底部,左侧或右侧,而不是顶部。
- 不要忘记添加
visibility: hidden
和pointer-events: none
标记。
在此处查看演示和资源