javascript如何实现懒加载_能优化性能吗
发布时间 - 2026-01-07 00:00:00 点击率:次IntersectionObserver 是现代浏览器中实现懒加载最轻量可靠的方式,不依赖 scroll 事件,通过 rootMargin 提前加载防闪动,需复用实例、及时 unobserve,并注意兼容性与 DOM 状态。
什么是 IntersectionObserver 懒加载
现代浏览器中,IntersectionObserver 是实现图片/组件懒加载最轻量、最可靠的方式。它不依赖 scroll 事件监听,避免频繁重排重绘和性能抖动,比手动计算 getBoundingClientRect() + scroll 更稳定。
典型适用场景:长列表中的图片、折叠面板里的富媒体内容、无限滚动的卡片流。
- 兼容性需注意:
IE完全不支持,Edge 15+、Chrome 51+、Safari 12.1+均可用;如需兼容旧版 IE,必须降级为scroll + throttle方案 - 初始化时传入的
rootMargin很关键——比如设为"200px"表示元素进入视口前 200px 就触发加载,可避免用户滚动过快时出现“白屏闪动” - 观察器实例应复用,不要为每个图片都新建一个
IntersectionObserver
如何用 IntersectionObserver 加载图片
核心逻辑是:先给 的 src 留空或设为占位图,把真实地址存在 data-src;等进入视口后,再把 data-src 赋给 src,并停止观察该元素。
const lazyImageObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
const src = img.dataset.src;
if (src) {
img.src = src;
img.removeAttribute('data-src');
lazyImageObserver.unobserve(img); // 关键:及时停止观察
}
}
});
}, {
rootMargin: '200px' // 提前加载,防滚动卡顿
});
document.querySelectorAll('img[data-src]').forEach(img => {
lazyImageObserver.observe(img);
});
-
img.removeAttribute('data-src')不仅是清理,也防止重复触发加载(某些情况下isIntersecting可能短暂为false后又变true) - 如果图片加载失败,建议加
onerror回退逻辑,例如显示默认占位图或记录错误 - 服务端开启
HTTP/2或使用srcset+sizes配合懒加载,能进一步减少首屏带宽消耗
懒加载真能优化性能?看这三点
能,但效果取决于使用方式和页面结构。不是所
有场景都值得加懒加载,盲目使用反而引入额外 JS 开销和复杂度。
- 首屏时间(FCP/LCP)明显下降:尤其当页面含大量高清图但用户只看前几屏时,跳过后续图片解析和解码,LCP 可提升 30%+
-
内存占用降低:未加载的
不会触发解码和纹理上传,对低端设备或 WebView 场景很关键 -
但要注意副作用:如果懒加载逻辑本身没做节流或 observer 创建过多,JS 执行时间可能反超收益;另外,SEO 友好性依赖是否在服务端渲染时已输出真实
src(否则爬虫看不到图片)
常见错误:为什么图片反复加载或根本不触发
这类问题基本都出在观察器配置或 DOM 状态上,不是代码逻辑 bug。
-
root默认是浏览器视口,但如果父容器设置了overflow: hidden且有滚动,而你又没显式传{ root: container },那永远触发不了回调 -
img元素初始height为0(比如没设宽高、父容器未渲染完成),会导致IntersectionObserver认为它“不可见”,即使位置正确也不触发 - 动态插入的图片(如 AJAX 渲染后追加),必须在插入 DOM 后再调用
observe();直接批量querySelectorAll会漏掉后来的节点 - 某些 CSS 动画或
transform会让元素脱离文档流,影响isIntersecting判断,可临时加will-change: transform或改用opacity动画规避
# css
# javascript
# java
# js
# ajax
# seo
# 浏览器
# edge
# 懒加载
# safari
# ai
# 爬虫
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用wdcp快速搭建高效网站?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
linux写shell需要注意的问题(必看)
如何续费美橙建站之星域名及服务?
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
如何基于云服务器快速搭建网站及云盘系统?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Laravel如何配置任务调度?(Cron Job示例)
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
详解Android中Activity的四大启动模式实验简述
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
零基础网站服务器架设实战:轻量应用与域名解析配置指南
网站建设整体流程解析,建站其实很容易!
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
如何快速重置建站主机并恢复默认配置?
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
如何在阿里云香港服务器快速搭建网站?
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
实例解析angularjs的filter过滤器
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Swift中swift中的switch 语句
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
移动端脚本框架Hammer.js
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
如何在橙子建站中快速调整背景颜色?
Laravel distinct去重查询_Laravel Eloquent去重方法
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何在Windows 2008云服务器安全搭建网站?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
利用vue写todolist单页应用
新三国志曹操传主线渭水交兵攻略
Laravel怎么判断请求类型_Laravel Request isMethod用法
Angular 表单中正确绑定输入值以确保提交与验证正常工作
JS去除重复并统计数量的实现方法
使用C语言编写圣诞表白程序
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
海南网站制作公司有哪些,海口网是哪家的?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
做企业网站制作流程,企业网站制作基本流程有哪些?

