js如何实现图片懒加载

图片懒加载的实现首先通过将img标签的src替换为data-src来延迟加载,1. 使用intersectionobserver监听图片是否进入可视区域,进入则加载;2. 兼容性不足时可引入polyfill;3. 可通过getboundingclientrect或计算偏移量判断,但性能较差;4. 推荐intersectionobserver因其性能高、异步且代码简洁;5. 优化体验可结合预加载、占位图、图片压缩、cdn加速和响应式图片,从而显著提升页面加载速度与用户体验。

js如何实现图片懒加载

图片懒加载,简单来说,就是先不加载页面上的所有图片,而是只加载可视区域内的图片,当图片滚动到可视区域时,再动态加载。这样做可以显著提升页面加载速度,尤其是在图片较多的页面上。

js如何实现图片懒加载

实现图片懒加载,主要思路是:监听滚动事件,判断图片是否进入可视区域,如果进入,则加载图片。

解决方案

HTML结构:

js如何实现图片懒加载

首先,在HTML中,将

@@##@@

标签的

src

属性替换为

data-src

,并将

src

属性留空。

data-src

属性用于存储图片的真实地址。

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

JavaScript代码:

js如何实现图片懒加载

function lazyLoad() {  const images = document.querySelectorAll('img[data-src]');  const observer = new IntersectionObserver((entries, observer) => {    entries.forEach(entry => {      if (entry.isIntersecting) {        const img = entry.target;        img.src = img.dataset.src;        img.removeAttribute('data-src'); // 移除data-src,避免重复加载        observer.unobserve(img); // 停止观察已加载的图片      }    });  });  images.forEach(image => {    observer.observe(image);  });}document.addEventListener('DOMContentLoaded', lazyLoad); // 页面加载完成后执行

这段代码使用了

IntersectionObserver

API,这是一个现代浏览器提供的用于监听元素是否进入可视区域的API。

IntersectionObserver

创建一个观察者,它会监听指定元素(这里是所有的

img[data-src]

)是否进入可视区域。

entries

是一个数组,包含了所有被观察的元素的状态信息。

entry.isIntersecting

表示元素是否进入了可视区域。如果元素进入了可视区域,就将

data-src

的值赋给

src

,从而加载图片。加载完成后,移除

data-src

属性,避免重复加载,并且停止观察该图片。

observer.observe(image)

开始观察指定的图片元素。

兼容性处理:

IntersectionObserver

API在一些老版本的浏览器中可能不支持。可以使用polyfill来解决兼容性问题。 可以引入

polyfill.io

提供的polyfill,或者使用

lazysizes

库,它已经包含了polyfill。


如何判断图片是否进入可视区域?

除了

IntersectionObserver

,还有其他方法可以判断图片是否进入可视区域,例如:

getBoundingClientRect(): 获取元素相对于视口的位置信息。

function isInViewport(element) {  const rect = element.getBoundingClientRect();  return (    rect.top >= 0 &&    rect.left >= 0 &&    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&    rect.right  {    if (isInViewport(img)) {      img.src = img.dataset.src;      img.removeAttribute('data-src');    }  });}document.addEventListener('scroll', lazyLoad);document.addEventListener('DOMContentLoaded', lazyLoad);

这种方法需要监听

scroll

事件,并在滚动时不断判断图片是否进入可视区域,性能上不如

IntersectionObserver

计算offsetTop和scrollTop: 这种方法需要手动计算元素距离文档顶部的距离,以及滚动条滚动的距离,比较繁琐,不推荐使用。

为什么推荐使用IntersectionObserver?

IntersectionObserver

API的优势在于:

性能优化:

IntersectionObserver

是由浏览器原生提供的,使用了浏览器的优化机制,性能更高。 它不会频繁触发回调函数,只有在元素进入或离开可视区域时才会触发。异步处理:

IntersectionObserver

是异步执行的,不会阻塞主线程,避免页面卡顿。代码简洁: 使用

IntersectionObserver

可以简化代码,提高可读性。

如何优化图片懒加载的体验?

预加载: 可以在图片进入可视区域之前,提前加载一部分图片,避免用户滚动到图片时出现短暂的空白。 可以使用

IntersectionObserver

rootMargin

选项来实现预加载。

const observer = new IntersectionObserver((entries, observer) => {  // ...}, {  rootMargin: '200px 0px' // 提前200px加载});

占位图: 在图片加载完成之前,可以使用占位图来填充图片区域,避免页面布局抖动。 可以使用纯色背景、模糊图片或SVG占位图。

图片优化: 对图片进行压缩,减小图片体积,可以加快图片加载速度。 可以使用工具

TinyPNG

ImageOptim

CDN加速: 使用CDN加速可以提高图片的访问速度,尤其是在用户分布在不同地区的情况下。

响应式图片: 根据不同的屏幕尺寸,加载不同大小的图片,可以节省流量,提高加载速度。 可以使用


元素或

srcset

属性来实现响应式图片。 例如:

@@##@@

总的来说,图片懒加载是一个重要的性能优化手段。 使用

IntersectionObserver

API可以方便地实现图片懒加载,并获得更好的性能。 结合预加载、占位图、图片优化和CDN加速等手段,可以进一步提升用户体验。

Image 1Image 2Image 3js如何实现图片懒加载Responsive Image

以上就是js如何实现图片懒加载的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
javascript怎么拼接多个数组
上一篇 2025年12月20日 09:08:38
js 如何用zipObject将键值数组转为对象
下一篇 2025年12月20日 09:08:42

相关推荐

  • win11怎么开启卓越性能模式_win11开启卓越性能模式操作教程

    通过管理员终端执行powercfg命令可启用隐藏的“卓越性能”模式;2. 若未显示,可通过设置应用刷新电源选项列表;3. 使用搜索功能可快速以管理员身份运行终端完成操作。 如果您发现Windows 11的电源选项中缺少“卓越性能”模式,导致无法最大化发挥硬件性能,可以通过系统内置命令手动启用该隐藏的…

    2026年8月29日
    600
  • win11系统提示”Windows聚焦无法更新”_win11锁屏壁纸自动更换失效解决

    win11系统提示”Windows聚焦无法更新”_win11锁屏壁纸自动更换失效解决win11系统提示”Windows聚焦无法更新”_win11锁屏壁纸自动更换失效解决win11系统提示”Windows聚焦无法更新”_win11锁屏壁纸自动更换失效解决win11系统提示”Windows聚焦无法更新”_win11锁屏壁纸自动更换失效解决

    windows聚焦无法更新的解决方法包括检查网络、重置设置和服务运行状态。首先确认网络连接正常,接着进入“设置→个性化→锁屏界面”,将个性化设置为“图片”或“幻灯片放映”,重启后重新设回“windows聚焦”。若无效,可打开注册表编辑器删除lock screen下的creative和slidesho…

    2026年8月29日 用户投稿
    200
  • 如何解决图片和视频的复杂变换问题?使用CloudinaryTransformationBuilderSDK可以!

    可以通过一下地址学习composer:学习地址 在开发网站和移动应用时,处理图片和视频的变换和优化是常见但又复杂的任务。我最近在项目中遇到的问题是需要对大量图片进行尺寸调整、格式转换和优化处理。这不仅需要大量的时间和精力,而且容易出错。经过一番探索,我发现了 cloudinary transform…

    用户投稿 2026年8月29日
    100
  • 联想主机系统蓝屏代码0x0000001A的排查与解决方案详解

    联想主机系统蓝屏代码0x0000001A的排查与解决方案详解联想主机系统蓝屏代码0x0000001A的排查与解决方案详解联想主机系统蓝屏代码0x0000001A的排查与解决方案详解联想主机系统蓝屏代码0x0000001A的排查与解决方案详解

    蓝屏代码0x0000001a表示“memory_management”异常,通常由内存管理错误引发。常见原因包括内存条故障、驱动冲突、系统文件损坏或第三方软件冲突。排查方法如下:1. 检查内存条插拔状态并使用windows内存诊断工具检测;2. 更新或回滚不兼容的驱动程序,尤其是显卡和主板驱动;3.…

    2026年8月29日 用户投稿
    400
  • 魔兽世界污染者战袍零门槛获取指南!阿拉希盆地速刷秘籍

    幻化党狂喜!污染者战袍作为《魔兽世界》经典绝版外观,暗绿纹路与金属肩甲堪称部落荣耀象征。无需声望苦熬,不用看脸掉落,这份保姆级攻略带你轻松入手战场传奇战袍,新手也能一小时拿下! 第一步:高地集结!寻找任务使者传送坐标:直飞阿拉希高地! 关键NPC:抵达中部避难谷地(联盟)/ 落锤镇(部落),定位奥斯…

    2026年8月29日
    100
  • 在悟空浏览器上怎么免费看电视剧 免会员看剧资源获取方法

    免费看电视剧的关键在于选择合适的资源渠道而非依赖悟空浏览器本身,可通过正版平台免费专区、聚合类影视app、第三方网站、bt下载或短视频平台获取资源,但需注意版权、安全、广告和画质等风险,为安全追剧应优先选择正规渠道、安装杀毒软件、谨慎点击链接、保护个人信息并使用广告拦截插件,同时解决卡顿问题可检查网…

    2026年8月29日
    100
  • MySQL日志审计如何实现_满足合规需求的方法?

    MySQL日志审计如何实现_满足合规需求的方法?MySQL日志审计如何实现_满足合规需求的方法?MySQL日志审计如何实现_满足合规需求的方法?MySQL日志审计如何实现_满足合规需求的方法?

    mysql日志审计可通过多种方式组合实现,以满足不同场景的合规需求。1. 开启通用查询日志可记录所有sql操作,适合低并发系统,但无法区分用户身份;2. 慢查询日志结合过滤机制可用于监控耗时操作,但仅作为补充手段;3. 启用二进制日志(row格式)可实现数据变更的细粒度审计,并通过工具解析具体操作;…

    2026年8月29日 用户投稿
    100
  • ThinkPHP 队列(Queue)与异步任务处理

    在thinkphp中,可以使用队列来处理异步任务。具体方法包括:1.定义任务类并实现fire方法;2.使用queue::push方法将任务推送到队列中;3.通过配置驱动(如redis或数据库)来管理和执行任务。这种方式可以有效提升应用性能和用户体验。 引言 在现代Web开发中,异步任务处理和队列管理…

    2026年8月29日
    100
  • 电脑出现dxgi_error_device_removed显卡错误

    频繁出现dxgi_error_device_removed错误通常由驱动不稳定、硬件过热、供电不足、系统或游戏文件损坏、超频或软件冲突导致;2. 解决方案包括使用ddu彻底重装显卡驱动、清理散热系统并监控温度、确保电源功率充足且连接稳固、验证游戏完整性或重装游戏、恢复默认频率排除超频影响;3. 彻底…

    2026年8月29日
    200
  • SpringBoot2应用在Docker中异常停止(Exited 139)并提示libawt.so错误,该如何解决?

    springboot2 应用部署至 docker 容器后异常停止的排查 本文针对 SpringBoot2 应用在 Docker 容器中运行时出现异常停止的问题进行分析和解答。该问题主要体现在容器日志中显示 Exited (139) 状态码,并伴随 libawt.so 相关的错误信息。 问题描述中,开…

    用户投稿 2026年8月29日
    100
  • 企查查怎么查分支机构_企查查App查询企业下属分支机构详细方法

    首先打开企查查App搜索目标企业进入主页,向下滑动查找“分支机构”或“企业关系”栏目并点击,可查看分公司、子公司等关联企业的名称、法人、成立日期及状态等信息;如需精确查找,可进入“企业关系”或“投资持股”页面点击右上角“筛选”按钮,选择“分支机构”类型,并按地区、时间或状态进一步过滤,确认后即可显示…

    2026年8月29日
    100
  • 谷歌相机隐私设置详解_谷歌相机个人隐私保护功能与配置指南

    谷歌相机可能泄露位置信息,因默认开启地理标记功能,建议关闭“保存位置信息”并限制应用权限,同时谨慎使用Google Photos的面孔分组与备份功能,确保账号安全及分享时剥离敏感元数据。 谷歌相机在我们的日常生活中扮演着越来越重要的角色,它不仅仅是一个拍照工具,更是一个数据收集的入口。关于它的隐私设…

    2026年8月29日
    600
  • Mac+IDEA+百度富文本UEditor

    Mac+IDEA+百度富文本UEditorMac+IDEA+百度富文本UEditorMac+IDEA+百度富文本UEditorMac+IDEA+百度富文本UEditor

    最近,我在项目中需要嵌入一个富文本编辑器,考虑到百度ueditor的强大功能,决定使用它。然而,从%ignore_a_1%+eclipse环境转到mac+idea后,遇到了几个问题。经过一番努力,终于解决了这些问题,现分享我的经验。 环境:Mac + IDEA + UEditor 基于 Maven+…

    2026年8月29日 用户投稿
    200
  • win11怎么关闭vbs以提升游戏性能 win11关闭VBS提升游戏性能教程

    禁用Windows 11的基于虚拟化的安全性(VBS)可提升游戏性能。首先通过“内核隔离”设置关闭内存完整性并重启;接着在管理员命令提示符执行bcdedit /set hypervisorlaunchtype off并重启生效;若无效,可通过注册表编辑器将HKEY_LOCAL_MACHINESYST…

    2026年8月29日
    100
  • 168.25.1路由器界面 192.168.25.1手机登录重置wifi密码

    168.25.1路由器界面 192.168.25.1手机登录重置wifi密码168.25.1路由器界面 192.168.25.1手机登录重置wifi密码168.25.1路由器界面 192.168.25.1手机登录重置wifi密码168.25.1路由器界面 192.168.25.1手机登录重置wifi密码

    手机必须连接目标路由器的wi-fi才能访问192.168.25.1管理界面;2. 在浏览器地址栏输入192.168.25.1并登录,用户名密码通常为admin/admin或查看路由器底部默认信息;3. 进入无线设置或wi-fi管理菜单,修改wi-fi密码后保存,路由器可能需重启生效;4. 若忘记管理…

    2026年8月29日 用户投稿
    200
  • Win10电脑安装破解软件一直被删除怎么解决?

    Win10电脑安装破解软件一直被删除怎么解决?Win10电脑安装破解软件一直被删除怎么解决?Win10电脑安装破解软件一直被删除怎么解决?Win10电脑安装破解软件一直被删除怎么解决?

    相信各位在使用电脑时,若尝试从网上下载破解版软件,常常会遇到文件被系统自动删除的情况,而且这种情况屡试不爽。这主要是由于windows系统自带的防病毒软件会拦截这些软件,认为它们存在风险。不过,我们可以通过调整系统设置来解决这一问题。接下来就让我们一起看看具体的操作流程吧。 解决办法: 首先,准备好…

    2026年8月29日 用户投稿
    700
  • 如何修复硬盘坏道_磁盘错误检测修复工具

    硬盘坏道能否修复取决于类型:1. 逻辑坏道可通过系统工具如windows的chkdsk、macos磁盘工具或linux的fsck进行修复,这些工具能修复文件系统错误并标记坏扇区;2. 物理坏道是硬件损伤,无法真正修复,只能通过软件手段隔离或重新映射,避免数据写入;3. 第三方工具如crystaldi…

    2026年8月29日
    200
  • 宝塔面板部署 Workerman 失败,该如何排查?

    部署 workerman 失败的原因主要包括 php 版本不兼容、端口冲突和权限问题。1) 确保 php 版本与 workerman 兼容(需 php 7.0+)。2) 检查并解决端口冲突。3) 确保 workerman 服务有足够权限运行,通常需 root 权限。通过查看日志和使用状态命令可以有效…

    2026年8月29日
    100
  • 哔哩哔哩大会员兑换码怎么使用_B站会员兑换码激活步骤

    打开哔哩哔哩App或官网登录账号,进入大会员页面点击【激活码开通】,输入兑换码和验证码后点击【立即激活】,最后检查会员有效期确认是否成功到账。 直接观看“☞☞☞☞☞点击bilibili主页便捷入口☜☜☜☜☜”; 直接观看“☞☞☞☞☞点击免费观看B站及海内外高清资源APP☜☜☜☜☜”; 如果您获得了哔…

    2026年8月29日
    300
  • 电脑出现system_thread_exception_not_handled

    遇到“system_thread_exception_not_handled”蓝屏错误,通常由驱动程序问题、硬件故障或系统文件损坏引起;2. 解决方案包括:首先尝试进入安全模式,检查并更新或回滚显卡、主板芯片组等关键驱动;3. 若无效,则运行sfc /scannow和dism命令修复系统文件;4. …

    2026年8月29日
    900

发表回复

登录后才能评论
关注微信