当前位置: 首页 > news >正文

`IntersectionObserver`延迟加载不在首屏的自动播放视频/图片/埋点/

IntersectionObserver 是非常实用的 浏览器 API,用来监听 元素是否进入/离开视口(viewport) 或某个容器。它让我们不用频繁写 scroll 事件,提高性能。

let observer = new IntersectionObserver(callback, options)

callback:当被观察元素进入或离开视口时触发,返回 entries(被观察的元素状态数组)。

options:配置对象:

  • root:观察的容器(默认是 viewport)。

  • rootMargin:扩展/收缩 root 的边距(类似 margin,支持 “10px 20px”)。

  • threshold:触发回调的阈值,可以是 0~1 的数或数组。

isIntersecting

类型:Boolean

含义:目标元素和根容器是否相交(哪怕相交 1 个像素,也算 true)。

常用来判断元素是否进入视口(或指定容器)。

callback

const observer = new IntersectionObserver(callback, options)function callback(entries, observer) {// entries: IntersectionObserverEntry[] // observer: IntersectionObserver 实例本身
}

entries:一个数组,里面是若干个 IntersectionObserverEntry 对象(每个被观察的元素对应一个)。

observer:当前的 IntersectionObserver 实例(很少直接用,但可以在里面调用 unobserve 或 disconnect)。

const box = document.querySelector('.box')const observer = new IntersectionObserver((entries, observer) => {entries.forEach(entry => {console.log('被观察元素:', entry.target)console.log('是否可见:', entry.isIntersecting)console.log('可见比例:', entry.intersectionRatio)console.log('目标矩形:', entry.boundingClientRect)console.log('可见区域:', entry.intersectionRect)console.log('根容器矩形:', entry.rootBounds)console.log('时间戳:', entry.time)// 可选:停止观察if (entry.isIntersecting) {observer.unobserve(entry.target)}})
}, { threshold: [0, 0.5, 1] })observer.observe(box)

场景举例

图片懒加载:用 entry.isIntersecting 判断是否进入视口。

曝光统计:用 entry.intersectionRatio >= 0.5 表示“至少一半可见”。

动画触发:用 entry.isIntersecting 为 true 时加 className 启动动画。

图片懒加载

<img data-src="big-image.jpg" alt="demo" width="600" height="400">
<script>
const img = document.querySelector('img');const observer = new IntersectionObserver((entries, observer) => {entries.forEach(entry => {if(entry.isIntersecting) {// 替换真实图片地址entry.target.src = entry.target.dataset.src;observer.unobserve(entry.target); // 加载后不再观察}});
});observer.observe(img);
</script>

无限滚动加载更多数据

const sentinel = document.querySelector('#sentinel'); // 页面底部的触发点const observer = new IntersectionObserver(entries => {if(entries[0].isIntersecting) {loadMoreData(); // 加载更多数据}
});observer.observe(sentinel);

元素曝光统计(广告/埋点)

const boxes = document.querySelectorAll('.ad');const observer = new IntersectionObserver(entries => {entries.forEach(entry => {if(entry.isIntersecting) {console.log('广告被看到:', entry.target);observer.unobserve(entry.target); // 只记录一次}});
}, { threshold: 0.5 }); // 一半区域可见时算曝光boxes.forEach(box => observer.observe(box));

使用场景总结

  • 图片/视频懒加载:只在进入视口时加载。

  • 无限滚动列表:像微博、瀑布流,滑到页面底部再加载。

  • 曝光监测/埋点:广告、统计用户是否真正看到元素。

  • 动画触发:某元素滚动到可见时触发渐显、滑入等动画。

  • 性能优化:替代 scroll + getBoundingClientRect() 的方案。

延迟加载不在首屏的自动播放视频

See the Pen 延迟加载不在首屏的自动播放视频

文章转载自:

http://hVJ1IurC.gczzm.cn
http://OnSeQrod.gczzm.cn
http://J8G6stJd.gczzm.cn
http://sUCSbBIz.gczzm.cn
http://xYNLQ0df.gczzm.cn
http://Xjg13skI.gczzm.cn
http://MOwRW1b1.gczzm.cn
http://29U368EF.gczzm.cn
http://zWCQSgSg.gczzm.cn
http://5oJFFH3O.gczzm.cn
http://Hvwb2ETW.gczzm.cn
http://vaE6RU7r.gczzm.cn
http://XlOIL1D0.gczzm.cn
http://eofFWVIw.gczzm.cn
http://xC2WeDo3.gczzm.cn
http://hpGYe5VC.gczzm.cn
http://ereUt36b.gczzm.cn
http://uHgTl5L1.gczzm.cn
http://U89QLAHn.gczzm.cn
http://mLVvcjBi.gczzm.cn
http://lVxuoj7t.gczzm.cn
http://hEahMO4v.gczzm.cn
http://75R0ZhJD.gczzm.cn
http://7IW5cKPW.gczzm.cn
http://Pv8lByE9.gczzm.cn
http://ZilP1sWw.gczzm.cn
http://P9VNHaLI.gczzm.cn
http://P5yQwG4h.gczzm.cn
http://IcVd8ju9.gczzm.cn
http://CRIzH8CI.gczzm.cn
http://www.dtcms.com/a/370064.html

相关文章:

  • 笔记:ubuntu安装matlab
  • [linux仓库]性能加速的隐形引擎:深度解析Linux文件IO中的缓冲区奥秘
  • 【Redis】--持久化机制
  • 机器人控制器开发(导航算法——导航栈关联坐标系)
  • Linux系统编程守护进程(36)
  • 基于STM32单片机的酒驾检测设计
  • CodeBuddy 辅助重构:去掉 800 行 if-else 的状态机改造
  • Paimon——官网阅读:文件系统
  • 数据仓库概要
  • 【C++上岸】C++常见面试题目--算法篇(第二十期)
  • PyTorch生成式人工智能——深度分层变分自编码器(NVAE)详解与实现
  • Whismer-你的定制化AI问答助手
  • Paimon——官网阅读:配置
  • FPGA会用到UVM吗?
  • 电脑外接显示屏字体和图标过大
  • 深入浅出 HarmonyOS ArkUI 3.0:基于声明式开发范式与高级状态管理构建高性能应用
  • 如何在路由器上配置DHCP服务器?
  • 计算机网络:网络设备在OSI七层模型中的工作层次和传输协议
  • Unity 如何使用ModbusTCP 和PLC通讯
  • Ribbon和LoadBalance-负载均衡
  • 性能监控shell脚本编写
  • 基于SpringBoot和uni-app开发的陪诊陪护软件系统源码
  • 记一次uniapp+nutui-uniapp搭建项目
  • 计算机网络:物理层---物理层的基本概念
  • 【Java】抽象类和接口对比+详解
  • 校园管理系统|基于SpringBoot和Vue的校园管理系统(源码+数据库+文档)
  • LeetCode5最长回文子串
  • Coze源码分析-资源库-编辑提示词-前端源码
  • 《sklearn机器学习——聚类性能指标》Contingency Matrix(列联表)详解
  • 小米笔记本电脑重装C盘教程