元素离开视口时的交点观察者

Posted

技术标签:

【中文标题】元素离开视口时的交点观察者【英文标题】:Intersection Observer when element leaves the viewport 【发布时间】:2019-04-17 18:52:25 【问题描述】:

有没有办法使用 Intersection Observers 检测元素是否离开视口?例如,我在屏幕上有一个元素,我想在元素顶部到达视口顶部时触发回调。来自 MDN:

Intersection Observer API 让代码注册一个回调函数,当他们希望监控的元素进入或退出另一个元素(或视口)时,或者当两者相交的数量时,该回调函数就会被执行按要求的金额更改。 -- (https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)

因此,如果我执行以下操作,我会认为当元素的顶部也碰到视口的顶部时会触发回调?

var options = 
    root: document.querySelector('#element'),
    rootMargin: '0px',
    threshold: 0


var observer = new IntersectionObserver(callback, options);

但它似乎只在元素顶部滚动并触及视口底部时才会触发,但不是两者兼而有之。想法?

【问题讨论】:

【参考方案1】:

如果我正确理解您要执行的操作,您可以将 rootMargin 设置为 '0px 0px -100%'。此外,threshold: 0 是默认值,因此您无需将其包含在您的选项对象中。

【讨论】:

这真的很有帮助,但我很难理解它为什么起作用。 This article 在讨论粘性元素的部分有很大帮助。【参考方案2】:

如果您浏览 API 文档 here,则可以将 threshold 选项作为数组传递,以定义应触发回调的交集级别。因此,每次元素至少可见 80% 以及元素不可见(退出视口)时,传递 [0, 0.8] 之类的内容都会触发回调。

执行此操作时可能会出现其他并发症。例如如果有多个元素,当一个元素可见时,另一个元素可能会退出视口,从而触发不必要的回调。在我的案例中,我使用了一些额外的if 条件来处理它。我还必须进行一些测试以确定thresholdintersectionRatio 的最合适的值。

【讨论】:

太棒了,您已经对if 进行了测试,以了解哪个div 在起作用或类似的东西?对我来说,精确的其他阈值继续只观察元素的底部看起来 是的,我必须检查视口内的哪个 div 实际上应该考虑使用 if 条件。为了做到这一点,我还必须考虑滚动的方向。 实际上我认为 0 阈值意味着“任何数量”的观察到的都会触发回调。我发现了这个问题,因为我有同样的问题。我需要做一些测试,但我认为我的问题是“当观察到的根区域退出时 interseationobserver 会触发” 当intersectionRatio 向前或向后超过阈值时将触发回调。因此,阈值为 0 时,回调将在比率大于 0 时触发,并且在比率为 0 时再次触发。所以回答您的问题,如果阈值为 0,当观察到的元素退出时,交叉点观察器将触发根区。如果阈值为 0.5,则当 50% 的元素进入视口和 50% 的元素离开视口时,交叉点观察器将触发。

以上是关于元素离开视口时的交点观察者的主要内容,如果未能解决你的问题,请参考以下文章

[图形学]Chapter 8.4 OpenGL 二维观察函数——视口

同一页面上多个视频的交叉点观察者

计算机图形学——窗口到视口的变换

Flutter Widgets 绑定观察者

一旦我离开视图并重新进入,可观察到的离子 4 角路线不起作用

html 断点观察器 - 当页面越过CSS断点时,调用回调,传递表示您已离开的断点的对象