CSS位置的另一个事件:粘性

您是否曾经想过如何跟踪具有固定positions: sticky元素何时固定? 埃里克·比德尔曼(Eric Bidelman)对此主题有精彩的帖子 ,现在就去阅读。


在项目中使用它时,我发现了一些困难。 它们是:


  1. 它破坏了封装。 sticky-change事件与标头元素有关,但是您必须在标头的父级中插入标记(并将其position: relative )。
  2. 它涉及许多应该保持一致的因素,并且它们之间的联系并不总是很明显。 例如,您不能将--default-padding设置--default-padding大于40px ,即前哨的高度。
  3. 您不能在文章的中间跟踪阻止。

让我们尝试改善它!


所有这些问题都反映了一个相同的问题:Eric的解决方案是跟踪粘性的父位置,而不是粘性块本身。 让我们在保留原始思想的同时进行改进。 怎么了 我们将标记添加到标题本身,并观察它们与容器的交集。


例子


这是操作方法:


  1. 您要观察的每一面都需要一个哨兵。
  2. 将第一个sentinel top属性设置为等于header top但带有反向符号减1。例如,如果您的标题具有top: 10px ,则将sentinel标头设置为-11px 。 您可以使用类似top: calc(-1px + -1 * var( -- header-sticky-top))或者如果header top -1px则只需设置-1px
  3. 如果需要,添加其他标记。
  4. 观察标记与容器的交点。
  5. 您可以说,如果前哨路口记录具有isIntersecting = trueintersectionRatio = 0以及intersectionRect.top = rootBounds.top ,则标头卡住
  6. 与其他相同,请注意底部,左侧或右侧,而不是顶部。
  7. 不要忘记添加visibility: hiddenpointer-events: none标记。

在此处查看演示资源

Source: https://habr.com/ru/post/zh-CN436182/


All Articles