《元素视口可见性检测 》Vue自定义指令 封装

结合 Vue 自定义指令和 Intersection Observer API 实现元素视口可见性检测

1. 实现元素可见性检测

知识铺垫

Intersection Observer API 简介

  • 什么是 Intersection Observer API?
    • 它的主要用途:检测元素是否进入视口或与某个父元素相交。
  • 区别于以往的判断元素距离顶部距离和滚动距离,使用Intersection Observer性能更好

Vue 自定义指令基础

  • Vue 自定义指令的基本语法。
  • 生命周期钩子:mounted、updated、unmounted 等。
  • 如何通过 binding 传递参数和值。
  • 代码解析:
    • 在 mounted 钩子中创建 IntersectionObserver 实例。
    • 使用 threshold 控制触发条件。
    • 通过 binding.value 传递回调函数。
    • 在 unmounted 钩子中清理观察器。

2. 开袋即食·代码:

以下封装好的代码可以直接复制,粘贴到项目的任意js文件中

比如我放在 src/utils/diy_directive_visible.js

javascript 复制代码
export default {
  mounted(el, binding) {
    const observer = new IntersectionObserver(
      (entries) => {
        entries.forEach((entry) => {
          binding.value(entry.isIntersecting);
        });
      },
      {
        threshold: 0.5, // 50%可见时触发
        rootMargin: "0px",
      },
    );
    observer.observe(el);
    el._observer = observer;
  },
  unmounted(el) {
    el._observer?.disconnect();
  },
};

在你的main.js中,进行导入和全局注册

javascript 复制代码
import visible from "./utils/diy_directive_visible.js"  // 导入自己配置的指令
....省略部分内容
const app = createApp(App)
app.directive("visible", visible) //  注册自己配置的指令
....省略部分内容
app.mount("#app")

组件中的使用示例

html 复制代码
<template>
  <div v-visible="handleVisibility">滚动到这里看看!</div>
</template>

<script>
export default {
  methods: {
    handleVisibility(isVisible) {
      if (isVisible) {
        console.log('元素可见!');
      } else {
        console.log('元素不可见!');
      }
    },
  },
};
</script>

3. 补充说明

可用使用的场景

  • 懒加载图片或组件。
  • 无限滚动列表。
  • 动画触发条件。
  • 数据埋点(如曝光统计)。

优化与扩展

  • 动态调整 threshold 和 rootMargin。
  • 处理多个元素的可见性检测。
  • 结合 Vue 的响应式系统实现更复杂的功能。

注意事项

  • 兼容性问题:IntersectionObserver 的浏览器支持情况。
  • 性能优化:避免过度使用观察器。
  • 清理资源:确保在组件销毁时断开观察器。
相关推荐
小poop4 小时前
CSS 基础与实战:从入门到精通网页美化
前端
Csvn5 小时前
运行时性能
前端
Never_every996 小时前
位图转矢量工具哪个好?实测抠抠图AI位图转矢量工具
大数据·前端
paopaokaka_luck6 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
空中湖7 小时前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
欣欣之王来了8 小时前
原始HTML插值:v-html指令的使用与安全风险
前端·学习·架构·项目·vue3教程
IT_陈寒8 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端
计算机魔术师9 小时前
砍半价格、参数再涨,国产旗舰追到 Opus 鼻尖了
前端
paopaokaka_luck9 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
特立独行的猫A9 小时前
10 MB 的桌面 AI 客户端:用仓颉 + 系统 WebView 替代 Electron
前端·harmonyos