"Intersection"是使用Intersection Observer API监听当 DOM/组件在可视窗口中出现或者消失(由页面滚动导致)时触发一个函数的 Quasar 指令。
WARNING
并不是所有的浏览器都支持 Intersection Observer API,虽然大部分现代浏览器都支持,但是如果您需要兼容老的浏览器,那么您需要安装并引入(通过一个 boot 文件)W3C 官方的polyfill。
用法
建议先阅读 Intersection Observer API 的文档,这有助于您理解此指令的工作原理。
Intersection 指令接受一个函数或者一个配置对象作为参数。配置对象的格式如下:
{
handler: /* Function */,
cfg: {
// "Intersection observer options" 中的任意选项
// 详见 https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
root: null, // DOM Element
rootMargin: '0px',
threshold: 0
}
}使用配置对象时,只有 handler 是必须的。
handler 函数接受一个 IntersectionObserverEntry 类型的参数。
TIP
在下面的示例中,向下滚动直到被观察的元素出现在视口中,然后再将它滚出视口。
基础
仅触发一次
可以使用 once 修饰符(例如:v-intersection.once)。一旦被观察的元素进入视口,handler 函数就会被调用,然后停止观察。这可以减少不必要的性能开销——如果您只需要在元素首次可见时收到通知的话。
使用配置对象
通过传入一个对象(而不是函数)作为指令的值,您可以控制 Intersection Observer 的所有选项(如 threshold)。
进阶
下面是一个更高级的示例。代码利用了 HTML 的 data 属性——通过在循环中设置 data-id 为元素的索引,就可以在 handler 中通过 entry.target.dataset.id 获取它。如果您不熟悉 data 属性,可以阅读这篇文档。
在下面的示例中,我们展示了多张卡片,但只有可见的卡片会被渲染。秘诀在于外层容器——它绑定了 v-intersection 指令并设置了固定的宽高(作为内部内容未渲染时的占位,防止滚动时发生跳动)。
下面的示例也可以使用 QIntersection 组件来实现,会更加简洁。
TIP
上面的示例中我们使用了 Quasar 的过渡动画。完整的过渡动画列表请查看过渡动画页面。