讲师中心 微信公众号
AI工具推荐 视频效率加速

如何用javascript实现懒加载_javascript怎样优化页面加载

老墨君_8378

老墨君_8378

发布时间:2026-01-07 15:35:28

|

735人浏览过

|

来源于php中文网

原创

IntersectionObserver 是懒加载唯一推荐方案,它原生支持、不阻塞主线程、自动处理边界情况;SPA中需对新节点重新 observe,且必须在真正需要时才设置 img.src 以避免重复请求。

如何用javascript实现懒加载_javascript怎样优化页面加载

懒加载的核心判断依据是 IntersectionObserver

不用监听 scroll 事件手动计算元素位置,现代浏览器原生支持的 IntersectionObserver 是唯一推荐方案。它在元素进入视口时触发回调,不阻塞主线程,且能自动处理滚动、缩放、iframe 内嵌等边界情况。

常见错误是 fallback 到 getBoundingClientRect() + scroll 监听 —— 这会导致频繁重排重绘,尤其在低端安卓机上卡顿明显。只有需要兼容 IE 或极老 Android(

  • rootMargin 设为 "100px" 可提前 100px 加载,避免用户快速滚动时出现空白
  • 不要给 threshold 设过小的值(如 0.01),会增加触发频率;一般 [0, 0.1, 0.5] 足够覆盖多数场景
  • 观察器实例应复用,避免每个图片都新建一个 IntersectionObserver

图片懒加载必须配合 loading="lazy" 和占位策略

loading="lazy" 是 HTML 原生懒加载属性,对 <img> 和 <iframe> 有效,但仅适用于常规图片请求(不支持背景图、CSS 雪碧图等)。它和 JS 懒加载不是互斥关系,而是互补:原生属性由浏览器控制,JS 方案负责兜底和精细控制。

没设置占位符直接留空 src,会导致布局抖动(layout shift)。正确做法是:

Mapbox Android Patterns
Mapbox Android Patterns

Mapbox Maps SDK 在 Android 上的官方集成模式,涵盖安装、添加标记、用户定位、自定义数据、样式、相机控制等功能

下载

立即学习“Java免费学习笔记(深入)”;

  • 用 data-src 存真实地址,src 设为 1×1 透明 base64 占位图:"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
  • 加载完成前加 opacity: 0,成功后用 CSS 过渡淡入,避免突兀出现
  • 失败时显示 fallback 图并记录错误:img.addEventListener("error", () => img.src = "/fallback.jpg")

IntersectionObserver 在单页应用(SPA)中要重新 observe 新渲染的节点

Vue/React 等框架动态插入 DOM 后,IntersectionObserver 不会自动跟踪新节点。常见错误是只在页面初始化时调用一次 observer.observe(),后续路由切换或列表刷新后新图片完全不触发加载。

解决方式取决于框架机制:

  • React 中,在 useEffect 里对每次渲染的新 ref 调用 observer.observe(el),卸载时调用 observer.unobserve(el)
  • Vue 3 的 onMounted + onBeforeUnmount 同理;若用 v-for 渲染列表,确保每个 <img> 都有独立 ref 或使用 querySelectorAll 批量 observe
  • 纯 JS SPA:监听 MutationObserver 捕获新增的 img[data-src] 节点,再交给 IntersectionObserver 管理
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      img.classList.remove("lazy");
      observer.unobserve(img); // 加载完立即解绑,避免重复触发
    }
  });
}, {
  rootMargin: "100px",
  threshold: [0, 0.1]
});

document.querySelectorAll("img[data-src]").forEach(img => observer.observe(img));
真正容易被忽略的是资源加载顺序与缓存协同:懒加载图片的 src 设置时机,会影响浏览器是否复用已缓存的资源。如果先设 src 再加 class 控制样式,可能触发两次请求;必须确保只在需要时才写入 src 属性。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

3716

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

306

2025.12.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4018

2023.08.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4196

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1315

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1678

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

9743

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

940

2023.09.01

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

80

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.1万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn