# exposure-vue **Repository Path**: wyzhgx/exposure-vue ## Basic Information - **Project Name**: exposure-vue - **Description**: 插件基于Intersection Observer API实现,适用于SPA应用、广告统计及懒加载场景。提供元素曝光检测、滚动监听、比例计算功能,支持多阈值触发、根元素限定、边距调节等配置,具备自动实例管理和内存回收机制。支持Vue2/Vue3项目指令式集成,适用于电商大屏、长列表渲染等需要精准监测元素可见性的业务场景,有效降低性能消耗,确保高精度曝光事件追踪。 - **Primary Language**: TypeScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-16 - **Last Updated**: 2025-06-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # exposure-vue ## 介绍 插件基于 Intersection Observer API 实现,适用于 SPA 应用中广告统计及懒加载场景。提供元素曝光检测,支持多阈值触发、根元素限定、边距调节、展示时长限制等配置,具备自动实例管理和内存回收机制。支持 Vue2/Vue3 项目指令式集成,适用于电商大屏、长列表渲染等需要精准监测元素可见性的业务场景,有效降低性能消耗,确保高精度曝光事件追踪。 ## 安装教程 ```javascript npm install exposure-vue ``` ## 使用说明 ### 属性说明 1. 原生属性(root、rootMargin、threshold) - root:用作视口的元素,用于检查目标的可见性。必须是观察目标的祖先。如果未指定或为 null,则默认为浏览器视口。 - rootMargin:根周围的边距。其值可以类似于 CSS margin 属性,例如 "10px 20px 30px 40px"(上、右、下、左)。这些值可以是百分比。在计算交叉点之前,这组值用于增大或缩小根元素边框的每一侧。默认值为全零。 - threshold:一个数字或一个数字数组,表示观察目标可见度达到多少百分比时,观察器的回调就应该执行。 2. 自定义属性(once、exposureThreshold、callback) - once:是否只触发一次,默认值为 false;当观察目标可见度第一次达到阈值时会触发回调,然后直接取消对该观察目标的监听 - exposureThreshold:曝光时长阈值,单位为毫秒,用来指定观察目标可见度达到触发阈值标准,且持续时间需满足该字段配置的时长,默认值为 0,即观察目标可见度达到触发阈值就触发回调函数 - callback:回调函数,用来指定观察目标可见度达到触发阈值时触发的回调函数,默认值为 null,即不触发回调函数 1. callback 接收两个参数:visible(一个布尔值,用于确定观察目标与指定视口区域是否交叉)、entry(一个描述观察目标与指定视口区域的交叉状态的对象) ### 使用须知 1. Intersection Observer API 原有可配置属性 threshold 支持配置阈值列表,callback 将在目标可见度达到不同阈值时触发;这种场景下 exposureThreshold 配置可能导致触发时机与预期不一致 2. 插件会自动实例化 Intersection Observer API;对每个观察目标的监听,实例都会在其销毁时取消;必要时可以调用 this.$Exposure.disconnect() 取消当前所有观察目标的监听 ### 使用示例 ```javascript import { createApp } from "vue"; import App from "./App.vue"; import exposureVue from "exposure-vue"; const app = createApp(App); // 无自定义配置 // app.use(exposureVue) // 有自定义配置 // Intersection Observer API app.use(exposureVue, { root: document.body, rootMargin: "0px", threshold: 0.5, once: true, exposureThreshold: 300, }); app.mount("#app"); ``` ```javascript ```