怎样使用Intersection Observer实现懒加载_它有什么优势

发布时间 - 2025-12-29 00:00:00    点击率:
Intersection Observer 是浏览器原生 API,用于高效监听元素与视口的交叉状态,实现懒加载;它无需手动计算位置、不阻塞主线程、支持异步回调及局部容器,性能优于 scroll 事件。

Intersection Observer 是浏览器原生提供的 API,专门用于监听目标元素与视口(或指定容器)的交叉状态变化。实现图片、组件或内容的懒加载时,它比传统的 scroll 事件监听更高效、更轻量。

懒加载的核心逻辑:只在元素即将进入可视区域时才加载资源

传统方案常依赖监听 scrollresize 事件,频繁触发重排重绘,还容易因节流/防抖设置不当导致加载延迟或卡顿。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 更稳定
  • 兼容性扎实:Chrome 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地址?