js怎么实现懒加载图片 js图片懒加载的4种优化技巧介绍

图片懒加载的核心实现方法有三种:1. 使用 data-src 属性 + 滚动监听;2. 使用 intersection observer api;3. 结合 requestanimationframe 优化滚动监听。此外,还可通过设置 offset 或 rootmargin 实现预加载,选择合适的占位图优化体验,并通过 onerror 处理加载失败问题,测试时可通过开发者工具的 network 面板观察图片是否按需加载。

js怎么实现懒加载图片 js图片懒加载的4种优化技巧介绍

图片懒加载,简单来说,就是让页面上的图片不是一次性全部加载,而是等到它们进入用户视口(或者即将进入)时才加载。这样可以显著提高页面初始加载速度,优化用户体验,特别是对于图片较多的页面。

js怎么实现懒加载图片 js图片懒加载的4种优化技巧介绍

解决方案

js怎么实现懒加载图片 js图片懒加载的4种优化技巧介绍

实现懒加载的核心在于:监听图片的 src 属性,当图片进入视口时,才将真实的图片地址赋给 src

基础实现:data-src 属性 + 滚动监听

js怎么实现懒加载图片 js图片懒加载的4种优化技巧介绍

这是最常见的做法。首先,将图片的真实地址放到 data-src 属性中,src 属性留空或者放一张占位图。

@@##@@@@##@@@@##@@

然后,通过 JavaScript 监听滚动事件,判断图片是否进入视口。

const images = document.querySelectorAll('img[data-src]');function loadImage(img) {  img.src = img.dataset.src;  img.removeAttribute('data-src'); // Optional: Remove data-src after loading}function isElementInViewport(el) {  const rect = el.getBoundingClientRect();  return (    rect.top >= 0 &&    rect.left >= 0 &&    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&    rect.right  {    if (isElementInViewport(img)) {      loadImage(img);    }  });}document.addEventListener('scroll', checkImages);window.addEventListener('resize', checkImages); // Also check on resizecheckImages(); // Initial check

这种方法简单直接,但缺点是需要频繁监听滚动事件,可能会影响性能。

使用 Intersection Observer API

Intersection Observer API 是一种更高效的方式来监听元素是否进入视口,它基于浏览器的优化,避免了频繁的滚动监听。

const images = document.querySelectorAll('img[data-src]');const observer = new IntersectionObserver((entries, observer) => {  entries.forEach(entry => {    if (entry.isIntersecting) {      const img = entry.target;      loadImage(img);      observer.unobserve(img); // Stop observing after loading    }  });});images.forEach(img => {  observer.observe(img);});function loadImage(img) {  img.src = img.dataset.src;  img.removeAttribute('data-src');}

Intersection Observer API 性能更好,推荐使用。

结合 requestAnimationFrame 优化滚动监听

如果选择使用滚动监听,可以结合 requestAnimationFrame 来降低滚动事件的处理频率,提高性能。

let ticking = false;document.addEventListener('scroll', function(e) {  if (!ticking) {    window.requestAnimationFrame(function() {      checkImages();      ticking = false;    });    ticking = true;  }});

requestAnimationFrame 保证了回调函数在浏览器重绘之前执行,避免了不必要的计算。

预加载机制

有时候,我们希望图片在进入视口 之前 就开始加载,这样可以避免用户看到图片加载过程。 可以在 isElementInViewport 函数中增加一个 offset 值。

function isElementInViewport(el, offset = 100) {  const rect = el.getBoundingClientRect();  return (    rect.top >= -offset &&    rect.left >= 0 &&    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) + offset &&    rect.right <= (window.innerWidth || document.documentElement.clientWidth)  );}

或者,使用 Intersection Observer APIrootMargin 选项。

const observer = new IntersectionObserver((entries, observer) => { ... }, {  rootMargin: '100px 0px' // Top and bottom margins});

rootMargin 可以控制触发 Intersection Observer 的边界。

如何选择合适的占位图?

选择占位图需要考虑以下几个因素:

大小: 占位图应该尽可能小,避免增加初始加载时间。可以使用纯色背景或者矢量图。尺寸: 占位图的尺寸应该和真实图片的尺寸接近,避免页面布局跳动。风格: 占位图的风格应该和页面整体风格一致,避免突兀感。颜色: 可以使用图片的平均颜色作为占位图的颜色,或者使用模糊处理后的图片作为占位图。

一些常用的占位图方案包括:

纯色背景: 使用和图片主题颜色相近的纯色背景。矢量图: 使用简单的矢量图形作为占位图。LQIP (Low Quality Image Placeholder): 使用极低质量的图片作为占位图。SQIP (SVG-Based Image Placeholder): 使用 SVG 版本的图片作为占位图。

懒加载图片加载失败了怎么办?

图片懒加载过程中,可能会因为网络问题或者其他原因导致图片加载失败。为了提高用户体验,需要处理图片加载失败的情况。

显示默认图片: 当图片加载失败时,显示一张默认图片。可以使用 onerror 事件来监听图片加载失败。

@@##@@

重试加载: 可以尝试重新加载图片。可以使用 setTimeout 函数来延迟一段时间后重新加载。

img.onerror = function() {  setTimeout(() => {    img.src = img.dataset.src;  }, 3000); // Retry after 3 seconds};

错误提示: 可以显示错误提示信息,告诉用户图片加载失败。

如何测试懒加载是否生效?

测试懒加载是否生效,可以按照以下步骤进行:

打开开发者工具: 打开浏览器的开发者工具(通常按 F12 键)。切换到 Network 面板: 在开发者工具中,切换到 Network 面板。禁用缓存: 勾选 “Disable cache” 选项,确保每次加载都是从服务器获取资源。清空记录: 点击 “Clear” 按钮,清空之前的网络请求记录。滚动页面: 滚动页面,观察 Network 面板中的图片请求。

如果懒加载生效,应该只看到当前视口内的图片请求,而不是一次性加载所有图片。可以尝试快速滚动页面,观察图片是否按需加载。另外,可以观察图片的加载时间,如果加载时间过长,需要优化图片大小或者网络连接。还可以使用 Lighthouse 等工具来评估页面性能,并根据评估结果进行优化。

Image 1Image 2Image 3Image

以上就是js怎么实现懒加载图片 js图片懒加载的4种优化技巧介绍的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1507671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 04:36:40
下一篇 2025年12月20日 04:36:54

相关推荐

  • JavaScript中的模块联邦与微前端架构

    模块联邦是Webpack 5实现微前端的核心技术,允许运行时动态共享模块。通过ModuleFederationPlugin配置exposes、remotes和shared,实现子应用间代码复用与独立部署,提升开发协作效率。 模块联邦(Module Federation)是 Webpack 5 引入的…

    2025年12月21日
    000
  • JS注解怎么写_ JS注解的标准书写格式与语法说明

    JS注解包括单行注释(//)、多行注释(/ /)和文档注释(/* /),用于提升代码可读性与维护性,其中文档注释支持JSDoc标签如@param、@returns,便于生成文档和IDE提示,合理使用可增强协作效率。 JS注解(也称JavaScript注释)是用来在代码中添加说明性文字,帮助开发者理解…

    2025年12月21日
    000
  • 理解JavaScript事件节流:setTimeout的正确应用与常见误区

    本文深入探讨了javascript中利用`settimeout`实现事件节流(throttling)的原理与实践。通过分析mdn文档中一个常见的误解示例,我们澄清了`settimeout`在没有额外逻辑控制下无法实现节流的本质。随后,文章提供并详细解释了使用状态标志结合`settimeout`来有效…

    2025年12月21日
    000
  • React中API数据处理与.map渲染:类型定义与状态管理实践

    本文深入探讨了在react应用中使用`.map`方法渲染api数据时常见的“数据结构不匹配”问题。核心在于api返回的数据结构与组件预期的或typescript接口定义的不一致。教程将详细指导如何通过精确定义数据接口、优化react状态初始化以及正确访问数据属性来解决此类问题,确保数据能够被正确且高…

    2025年12月21日
    000
  • JavaScript中嵌套函数访问全局变量:理解作用域与变量遮蔽

    本文深入探讨了javascript中嵌套函数访问全局变量时遇到的变量遮蔽问题。通过解析作用域链机制,我们将理解为何内部函数有时无法直接访问同名的外部全局变量。教程将提供两种解决方案:优先推荐重命名内部变量以避免遮蔽,并介绍在特定环境下通过window对象访问全局变量的方法。同时,文章强调了避免全局变…

    2025年12月21日
    000
  • Stripe Payment Element 集成中自定义字段验证与重定向控制

    本教程旨在解决stripe payment element集成中,自定义输入字段验证失败时仍意外触发`stripe.confirmpayment`导致页面重定向的问题。文章将详细阐述如何通过客户端javascript在调用stripe支付确认前,对自定义字段进行有效验证,并根据验证结果决定是否执行支…

    2025年12月21日
    000
  • 深入理解React状态管理与受控组件:解决列表更新不渲染问题

    本文旨在探讨react组件中,当状态中的列表数据更新后,ui却未能正确渲染的常见问题。核心原因在于对表单元素采取了非受控方式的dom直接操作,绕过了react的状态管理机制。通过详细解析react的渲染原理,本文将重点介绍如何利用受控组件模式,将输入元素的值与组件状态绑定,从而确保状态变化能够及时准…

    2025年12月21日
    000
  • React应用中API数据与接口不匹配导致.map失效的解决方案

    本文深入探讨react应用中`.map`方法失效的常见原因,主要归结于api返回数据结构与前端定义接口不符。教程将通过具体示例,指导如何根据api实际响应调整typescript接口定义,并优化组件状态初始化与数据访问逻辑,确保`.map`方法正确高效地处理异步获取的数据,提升应用稳定性。 在Rea…

    2025年12月21日
    000
  • JavaScript实现移动端手势识别_javascript移动端

    通过监听touchstart、touchmove和touchend事件,可实现滑动、长按、双击和缩放手势;1. 滑动手势通过坐标差判断方向;2. 长按通过setTimeout检测时长;3. 双击基于两次点击时间间隔;4. 缩放通过两指距离变化计算比例;需注意阈值设置、默认行为阻止及性能优化。 在移动…

    2025年12月21日
    000
  • Electron.js应用中安全地与SQL数据库交互的最佳实践

    本文旨在指导electron.js开发者如何安全地与sql数据库进行交互。核心原则是electron应用不应直接连接sql数据库或在客户端嵌入数据库凭据。正确的做法是引入一个独立的后端api服务作为中间层,由该服务负责与数据库通信,从而保护敏感信息,防止sql注入,并提升整体应用安全性。 Elect…

    2025年12月21日
    000
  • 阻止嵌套元素事件传播:React中Link与Button点击冲突的解决方案

    本文旨在解决React应用中,当父级`Link`组件包含一个子级`button`时,点击`button`却意外触发`Link`导航的问题。通过深入解析事件传播机制,本文将详细介绍如何利用`e.stopPropagation()`和`e.preventDefault()`方法,确保嵌套元素的点击事件能…

    2025年12月21日
    000
  • 实现CSS图片循环动画并避免页面滚动条的教程

    本教程旨在解决css图片循环动画中常见的页面滚动条问题。通过优化`@keyframes`的`transform`属性和父容器的`overflow`设置,我们将展示如何实现图片从屏幕左侧滑入、滑出,并再次从左侧循环出现的流畅动画,同时确保页面不会因动画元素超出视口而产生不必要的水平滚动。 实现流畅的C…

    2025年12月21日
    000
  • JavaScript与Lodash:高效过滤多层嵌套对象中数组的共同元素

    本教程详细阐述了如何使用JavaScript和Lodash库,从复杂嵌套数据结构中识别并移除在所有对应数组中均出现的共同元素。通过两步法:首先构建一个包含所有待移除共同元素的映射对象,然后遍历原始数据,利用Lodash的intersection和difference等函数,实现数据的高效清洗和转换,…

    2025年12月21日
    000
  • JavaScript 嵌套函数中全局变量的访问与变量遮蔽问题解析

    本文深入探讨了JavaScript中嵌套函数访问全局变量时遇到的变量遮蔽(Variable Shadowing)问题。通过示例代码,我们将解析当内部作用域声明了与外部作用域同名的变量时,如何阻止嵌套函数访问到预期的全局变量。教程将提供两种解决方案:首选是避免变量遮蔽,通过重命名内部变量来确保作用域链…

    2025年12月21日
    000
  • JavaScript中嵌套函数访问全局变量的策略与陷阱

    本文深入探讨了javascript中嵌套函数访问全局变量的机制与常见陷阱,特别是变量遮蔽(shadowing)问题。我们将通过示例代码演示为何直接访问可能失败,并提供避免遮蔽的最佳实践,例如使用不同的变量名或利用eslint等工具检测。此外,对于使用`var`声明的全局变量,文章还将介绍通过`win…

    2025年12月21日
    000
  • JavaScript中从嵌套函数访问全局变量:理解作用域与避免变量遮蔽

    本文深入探讨了JavaScript中从嵌套函数访问全局变量时遇到的变量遮蔽问题。我们将通过示例代码解析变量遮蔽的原理,并提供两种解决方案:一是通过重命名局部变量来消除遮蔽(推荐实践),二是在特定情况下通过 `window` 对象显式访问全局变量。同时,文章还将强调使用代码检查工具和遵循最佳实践的重要…

    2025年12月21日
    000
  • JavaScript中嵌套函数访问全局变量的策略与变量遮蔽解析

    本文深入探讨javascript中嵌套函数访问全局变量时遇到的变量遮蔽问题。我们将解析作用域链的工作原理,并提供三种主要解决方案:通过重命名局部变量避免遮蔽、利用window对象直接访问全局变量,以及通过参数传递。同时,文章强调了使用linter工具、let/const以及最小化全局变量等最佳实践,…

    2025年12月21日
    000
  • 如何阻止React中嵌套元素点击事件冒泡并触发父级链接跳转

    本教程旨在解决React应用中常见的事件冒泡问题:当一个交互式子元素(如按钮)嵌套在一个可点击的父元素(如React Router的`Link`组件)中时,点击子元素可能意外触发父元素的点击行为。文章将详细介绍如何通过在子元素的事件处理函数中使用`e.stopPropagation()`和`e.pr…

    2025年12月21日
    000
  • JavaScript动态创建提交按钮:避免$_POST失效的正确姿势

    本文探讨了在使用javascript动态创建表单提交按钮时,php `$_post`超全局变量无法正确识别提交数据的问题。核心原因在于错误地使用了`document.createelement(“submit”)`。教程将详细解释为何此方法无效,并提供两种正确的解决方案:使用…

    2025年12月21日
    000
  • 解决JavaScript动态创建表单提交按钮在PHP中无法识别的问题

    本教程探讨了在javascript中动态创建表单提交按钮时,php后端无法识别提交数据这一常见问题。核心原因在于错误地使用了非标准的submit元素标签。文章将详细解释为何应使用标准的或元素,并提供正确的代码示例及关键注意事项,确保前后端数据交互的顺畅。 当我们在网页中动态生成表单元素,特别是提交按…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信