Skip to page content

Intersection Directive

"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 函数就会被调用,然后停止观察。这可以减少不必要的性能开销——如果您只需要在元素首次可见时收到通知的话。如果该修饰符在后续渲染中被移除(例如在 HMR 时编辑了模板),元素会重新被观察。

使用配置对象

通过传入一个对象(而不是函数)作为指令的值,您可以控制 Intersection Observer 的所有选项(如 threshold)。使用相同选项的元素在底层共享同一个 Intersection Observer(QIntersection 组件和 useIntersection composable 也共享它),这正是让长列表滚动保持轻量的原因。

禁用

传入布尔值 false(或 undefined)(而非一个函数或对象)会禁用该指令:在再次提供处理函数之前,该元素会停止被观察。这一过程中 DOM 元素不受影响,因此它所包裹的内容会保留自身的状态。

禁用



进阶

下面是一个更高级的示例。代码利用了 HTML 的 data 属性——通过在循环中设置 data-id 为元素的索引,就可以在 handler 中通过 entry.target.dataset.id 获取它。如果您不熟悉 data 属性,可以阅读这篇文档。

进阶



在下面的示例中,我们展示了多张卡片,但只有可见的卡片会被渲染。秘诀在于外层容器——它绑定了 v-intersection 指令并设置了固定的宽高(作为内部内容未渲染时的占位,防止滚动时发生跳动)。

下面的示例也可以使用 QIntersection 组件来实现,会更加简洁。

TIP

上面的示例中我们使用了 Quasar 的过渡动画。完整的过渡动画列表请查看过渡动画页面。