怎样使用Intersection Observer实现懒加载_它有什么优势
发布时间 - 2025-12-29 00:00:00 点击率:次Intersection Observer 是浏览器原生 API,用于高效监听元素与视口的交叉状态,实现懒加载;它无需手动计算位置、不阻塞主线程、支持异步回调及局部容器,性能优于 scroll 事件。
Intersection Observer 是浏览器原生提供的 API,专门用于监听目标元素与视口(或指定容器)的交叉状态变化。实现图片、组件或内容的懒加载时,它比传统的 scroll 事件监听更高效、更轻量。
懒加载的核心逻辑:只在元素即将进入可视区域时才加载资源
传统方案常依赖监听 scroll 或 resize 事件,频繁触发重排重绘,还容易因节流/防抖设置不当导致加载延迟或卡顿。Intersection Observer 把这个过程交给浏览器底层调度,回调函数只在元素真正进入或离开阈值范围时执行,不阻塞主线程。
- 无需手动计算元素位置、滚动偏移量或视口尺寸
- 自动处理滚动、缩放、页面可见性切换等场景
- 支持异步回调,天然适配 Promise 和现代加载逻辑(如动态 import)
基础用法:三步完成图片懒加载
假设页面中图片使用 data-src 存放真实地址,src 先为空或占位图:
-
创建观察器:传入回调函数和配置项(如
threshold: 0.1表示元素 10% 进入视口就触发) -
定义回调:在回调中判断
isIntersecting,为真则加载图片并停止观察该元素 -
开始观察:对每个带
data-src的调用observer.observe(img)
代码片段示意:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img); // 加载后停止观察,避免重复触发
}
});
}, { threshold: 0.1 });
document.querySelectorAll('img[data-src]').forEach(img => observer.observe(img));
相比 scroll + getBoundingClientRect 的明显优势
Intersection Observer 不是“更好写的 scroll”,而是架构层面的升级:
- 性能友好:浏览器在空闲时段批量处理交叉计算,不打断渲染帧,FPS 更稳定
-
兼容性扎实:Chrom
e 51+、Firefox 55+、Safari 12.1+、Edge 79+ 均已支持,配合简单降级(如 onload fallback)可覆盖绝大多数用户 - 语义清晰:关注“是否可见”,而非“坐标多少”,逻辑更贴近业务意图,维护成本低
- 支持根容器:可指定任意元素作为“视口”,轻松实现局部滚动容器内的懒加载(如弹窗列表、卡片流)
实用技巧与注意事项
真正落地时,几个细节会影响体验和健壮性:
- 给图片设置固定宽高或 aspect-ratio,防止加载时布局跳动
- 配合
loading="lazy"属性做双重保障(现代浏览器会自动处理原生懒加载) - 对关键首屏图片,仍建议直接写
src,避免白屏风险 - 服务端开启 HTTP/2 或 CDN 缓存,让懒加载后的请求更快响应
- 若需兼容老版本 iOS Safari,可用 polyfill(如 w3c 官方 polyfill),但注意 polyfill 仍基于 scroll 模拟,性能略打折扣
# 浏览器
# edge
# 回调函数
# 懒加载
# safari
# ios
# cdn
# 重绘
# 架构
# firefox
# chrome
# 线程
# 主线程
# 事件
# promise
# 异步
# http
# 加载
# 回调
# 只在
# 几个
# 更快
# 而非
# 时才
# 三步
# 服务端
# 均已
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
Swift中switch语句区间和元组模式匹配
动图在线制作网站有哪些,滑动动图图集怎么做?
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Laravel如何使用Gate和Policy进行授权?(权限控制)
微信小程序 配置文件详细介绍
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
jquery插件bootstrapValidator表单验证详解
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
网站制作软件有哪些,制图软件有哪些?
Laravel如何使用查询构建器?(Query Builder高级用法)
如何在宝塔面板中创建新站点?
如何在云主机上快速搭建网站?
如何用PHP快速搭建高效网站?分步指南
如何为不同团队 ID 动态生成多个非值班状态按钮
如何用低价快速搭建高质量网站?
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
Mybatis 中的insertOrUpdate操作
如何快速搭建个人网站并优化SEO?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
如何在阿里云部署织梦网站?
iOS UIView常见属性方法小结
如何正确选择百度移动适配建站域名?
Laravel如何使用Blade组件和插槽?(Component代码示例)
Internet Explorer官网直接进入 IE浏览器在线体验版网址
如何正确下载安装西数主机建站助手?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
音乐网站服务器如何优化API响应速度?
如何用wdcp快速搭建高效网站?
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
php485函数参数是什么意思_php485各参数详细说明【介绍】
在Oracle关闭情况下如何修改spfile的参数
微信小程序 input输入框控件详解及实例(多种示例)
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
利用JavaScript实现拖拽改变元素大小
PythonWeb开发入门教程_Flask快速构建Web应用
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何在VPS电脑上快速搭建网站?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何快速配置高效服务器建站软件?
如何登录建站主机?访问步骤全解析
中山网站推广排名,中山信息港登录入口?
Python文件异常处理策略_健壮性说明【指导】
如何在IIS中新建站点并配置端口与IP地址?


e 51+、Firefox 55+、Safari 12.1+、Edge 79+ 均已支持,配合简单降级(如 onload fallback)可覆盖绝大多数用户