HTML5IntersectionObserver懒加载实现教程
学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《HTML5 IntersectionObserver实现懒加载教程》,以下内容主要包含等知识点,如果你正在学习或准备学习文章,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!
IntersectionObserver通过异步监听元素与视口的交叉状态,实现高效的懒加载。首先,定义回调函数handleIntersection,处理元素进入或离开视口的逻辑,如将data-src赋值给src并停止观察;其次,创建IntersectionObserver实例,配置root、rootMargin和threshold等选项;最后,选取目标元素并调用observer.observe()开始观察。其优势在于性能优异,由浏览器底层优化计算,避免主线程卡顿;使用简单,无需手动计算位置;精度可控,可通过threshold设置触发时机;减少资源浪费,仅在需要时加载内容。常见应用场景包括图片懒加载、无限滚动、广告统计和动画触发等。注意事项有:IE不支持需引入polyfill;root和rootMargin需根据容器调整;threshold应按需设定;动态内容需重新观察;不适合精确像素追踪。
HTML5的IntersectionObserver,说白了,就是一种能让你知道一个元素什么时候进入或离开了另一个元素(通常是视口)的“视野”的API。它最直接、最常见的应用场景,就是实现图片或内容的懒加载,大幅提升页面加载性能和用户体验。

解决方案
使用IntersectionObserver其实并不复杂,核心就是创建一个观察器实例,然后告诉它你要观察哪些元素。
首先,你需要一个回调函数,当被观察元素与根元素(默认是浏览器视口)的交叉状态发生变化时,这个函数就会被调用。这个回调函数会接收一个 entries
数组,数组里的每个 entry
对象都包含了被观察元素当前交叉状态的信息。

function handleIntersection(entries, observer) { entries.forEach(entry => { if (entry.isIntersecting) { // 元素进入了视口,可以开始加载资源了 console.log('元素进入视口:', entry.target); // 假设是图片懒加载,这里可以把data-src赋值给src if (entry.target.dataset.src) { entry.target.src = entry.target.dataset.src; entry.target.removeAttribute('data-src'); // 移除data-src,避免重复加载 } // 一旦加载完成,就可以停止观察这个元素了 observer.unobserve(entry.target); } else { // 元素离开了视口 // console.log('元素离开视口:', entry.target); } }); }
接着,你需要创建IntersectionObserver
实例。构造函数可以接受两个参数:你的回调函数和可选的options
对象。options
对象可以配置root
(观察器基于哪个元素来判断交叉,默认为浏览器视口)、rootMargin
(根元素的边距,类似于CSS的margin,可以扩展或缩小根元素的判定区域)和threshold
(一个或多个数值,表示目标元素可见性达到多少百分比时触发回调)。
const options = { root: null, // 默认为浏览器视口 rootMargin: '0px', // 默认为0,可以设置如'100px 0px'来提前触发 threshold: 0.1 // 当目标元素10%可见时触发回调 }; const observer = new IntersectionObserver(handleIntersection, options);
最后,选择你要观察的元素,然后调用observer.observe()
方法开始观察。

// 假设所有需要懒加载的图片都有一个特定的类名 'lazy-image' const lazyImages = document.querySelectorAll('.lazy-image'); lazyImages.forEach(image => { observer.observe(image); });
这样,当lazy-image
元素进入或离开你设定的交叉区域时,handleIntersection
函数就会被执行。
IntersectionObserver如何实现高效的懒加载?
实现高效的懒加载,IntersectionObserver简直是量身定做的工具。传统的懒加载方案,通常依赖于监听scroll
事件,然后在回调函数里计算每个元素与视口的位置关系,判断是否进入了可视区域。这种方式在页面元素多、滚动频繁时,会触发大量的计算,导致主线程卡顿,用户体验直线下降。
IntersectionObserver则完全不同。它不监听滚动事件,而是由浏览器底层异步执行,当被观察元素与根元素发生交叉时,才会通知你。这意味着:
- 性能极佳: 它不会在主线程上执行繁重的计算,所有交叉状态的判断都由浏览器自身优化处理,而且是异步的。这大大减少了CPU的占用,避免了布局抖动(layout thrashing),让页面滚动起来异常流畅。
- 简单易用: 你不需要手动计算元素位置,也不需要考虑各种复杂的边界条件,API设计直观明了。
- 精度可控: 通过
threshold
选项,你可以精确控制在元素可见多少百分比时触发回调,比如,你可以让图片在进入视口一半时就开始加载,而不是等到完全可见。 - 减少不必要的加载: 当元素离开视口时,你可以选择停止观察,避免重复触发回调或在元素滑出后继续浪费资源。
以图片懒加载为例,通常我们会给
标签一个data-src
属性而不是src
,src
可以先放一个占位图。当IntersectionObserver
检测到图片进入视口时,才把data-src
的值赋给src
。
<img class="lazy-image" data-src="path/to/your/image.jpg" alt="描述文字">
配合前面的JavaScript代码,当lazy-image
进入视口,handleIntersection
就会把data-src
赋给src
,图片开始加载,同时unobserve
掉这个图片,避免后续不必要的观察。这套流程下来,页面初始化加载的资源量大幅减少,只有用户真正需要看到的内容才会被加载,性能提升立竿见影。
IntersectionObserver的常见应用场景与注意事项
除了懒加载,IntersectionObserver还有不少实用场景。比如,无限滚动(当滚动到底部时加载更多内容)、广告可见性统计(判断广告是否进入用户视野并停留足够时间)、动画触发(当元素进入视口时播放动画)、或者根据元素可见性来调整UI状态等。可以说,任何需要基于元素可见性来执行操作的场景,它都能派上用场。
在使用IntersectionObserver时,有几个点需要注意:
- 浏览器兼容性: 虽然现代浏览器支持良好,但IE浏览器是完全不支持的。对于需要兼容IE或更老旧浏览器的项目,可能需要引入Polyfill(例如
intersection-observer
npm包),或者提供一个降级方案。不过,在很多场景下,如果只是提升体验,不兼容IE也无伤大雅。 root
与rootMargin
的理解: 默认的root: null
表示以浏览器视口为根。如果你想在某个特定容器内实现懒加载(比如一个可滚动的div
),那么root
就应该指向那个div
元素。rootMargin
则允许你扩大或缩小根元素的判定区域。比如,设置rootMargin: '200px'
可以让你在元素进入视口上方或下方200px时就触发加载,这对于预加载内容非常有用,避免用户看到加载中的空白区域。threshold
的策略:threshold
可以是一个单一数值(如0.5
表示50%可见),也可以是一个数组(如[0, 0.25, 0.5, 0.75, 1]
表示在0%、25%、50%、75%、100%可见时都触发)。选择合适的threshold
取决于你的需求。对于懒加载,通常0
或一个很小的值就足够了,表示只要元素刚进入视口就加载。- 动态内容的观察: 如果你的页面内容是动态添加的(比如通过AJAX加载更多列表项),你需要确保新添加的元素也被
observer.observe()
。一个常见的做法是,在每次内容加载完成后,遍历新元素并将其加入观察。 - 不适用于精确像素追踪: IntersectionObserver是异步的,并且设计目标是判断元素的大致可见性,而不是精确到像素的实时位置。如果你需要非常精确的、实时的元素位置或滚动距离,传统的
scroll
事件结合getBoundingClientRect()
可能仍然是必要的,但要非常小心性能问题。 isIntersecting
和intersectionRatio
:entry.isIntersecting
是一个布尔值,表示元素是否与根元素交叉。entry.intersectionRatio
则表示交叉的比例(0到1之间)。在懒加载中,通常isIntersecting
就够用了。
总之,IntersectionObserver提供了一种现代且高性能的方式来处理元素可见性问题,它让前端开发者能够更优雅地实现懒加载、无限滚动等功能,极大地提升了用户体验和应用的性能表现。学会用它,绝对是值得的。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《HTML5IntersectionObserver懒加载实现教程》文章吧,也可关注golang学习网公众号了解相关技术文章。

- 上一篇
- Win11如何打开所有应用设置

- 下一篇
- Golang反射在RPC中的关键应用解析
-
- 文章 · 前端 | 3小时前 |
- CSS悬停效果让按钮更吸睛
- 277浏览 收藏
-
- 文章 · 前端 | 3小时前 |
- HTML5FileReaderAPI使用教程及示例代码
- 364浏览 收藏
-
- 文章 · 前端 | 3小时前 |
- HTML引入外部CSS的三种方法及示例
- 177浏览 收藏
-
- 文章 · 前端 | 3小时前 |
- JS实现页面平滑滚动的几种方法
- 387浏览 收藏
-
- 文章 · 前端 | 3小时前 |
- P5.js文字重复问题解决技巧
- 330浏览 收藏
-
- 文章 · 前端 | 3小时前 | CSS dom 空白页 window.print() 打印功能
- DOM打印功能实现方法详解
- 457浏览 收藏
-
- 文章 · 前端 | 3小时前 | CSS JavaScript 数据 环形图 conic-gradient
- 用CSS环形图:conic-gradient全面解析
- 373浏览 收藏
-
- 文章 · 前端 | 3小时前 |
- P标签与H标签区别详解
- 453浏览 收藏
-
- 文章 · 前端 | 3小时前 |
- HTML中display属性及8种显示方式详解
- 420浏览 收藏
-
- 文章 · 前端 | 4小时前 |
- CSS外边距和内边距区别详解
- 436浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 509次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 边界AI平台
- 探索AI边界平台,领先的智能AI对话、写作与画图生成工具。高效便捷,满足多样化需求。立即体验!
- 367次使用
-
- 免费AI认证证书
- 科大讯飞AI大学堂推出免费大模型工程师认证,助力您掌握AI技能,提升职场竞争力。体系化学习,实战项目,权威认证,助您成为企业级大模型应用人才。
- 381次使用
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 523次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 626次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 533次使用
-
- 优化用户界面体验的秘密武器:CSS开发项目经验大揭秘
- 2023-11-03 501浏览
-
- 使用微信小程序实现图片轮播特效
- 2023-11-21 501浏览
-
- 解析sessionStorage的存储能力与限制
- 2024-01-11 501浏览
-
- 探索冒泡活动对于团队合作的推动力
- 2024-01-13 501浏览
-
- UI设计中为何选择绝对定位的智慧之道
- 2024-02-03 501浏览