Day24 - 图片懒加载的原理

简介: Day24 - 图片懒加载的原理

知识讲解


Why


懒加载是一种延迟加载技术,在一个长网页中存在大量图片影响加载速度和用户体验。懒加载是一种优化网页性能的方式。大量用在电商场景中。


网络异常,图片无法展示
|


例如京东的首页,只需要第一时间完成首屏展示的任务就可以了,其他图片可以随着页面的滚动下载就可以了。


What


懒加载原理就是将一次性下载全部通篇改为根据判断可视区域下载。也就是说看到哪下载到哪。


  • 图片的src不设置真实的路径


  • 图片的真实路径设置在其他属性中比如: data-original


  • 通过js判断图片是否进入可视区域。


  • 如果图片进入可视区域将图片src换成真实路径


HOW


Step01: 图片的src不设置真实的路径,真实路径设置data-original


<img
      src=""
      class="image-item"
      lazyload="true"
      data-original="https://gitee.com/josephxia/picgo/raw/master/juejin/image-20220124221805647.png?a=1"
    />


Step02:通过js判断图片是否进入可视区域,如果图片进入可视区域将图片src换成真实路径


var viewHeight = document.body.clientHeight;
//获取可视区高度
function lazyload() {
  console.log('load')
  var list = document.querySelectorAll("img[data-original][lazyload]");
  list.forEach((item) => {
    if (item.dataset.original === "") return;
    var rect = item.getBoundingClientRect();
    console.log('图片相对位置top',rect.top)
    // 获得图片相对浏览器视窗的位置
    if (rect.bottom >= 0 && rect.top < viewHeight) {
      var img = new Image();
      img.src = item.dataset.original;
      img.onload = function () {
        item.src = img.src;
      };
      item.removeAttribute("data-original");
      //移除属性,下次不再遍历
      item.removeAttribute("lazyload");
    }
  });
}
lazyload(); //刚开始还没滚动屏幕时,要先触发一次函数,初始化首页的页面图片
document.addEventListener("scroll", lazyload);


面试攻略


懒加载技术大量应用在电商首页的长页面中,大家一定要明白原理并且亲自动手试试这段代码。


相关文章
|
10月前
|
Rust NoSQL 中间件
EAR_v3 《浮声三》 智能化图书管理系统
浮声三 EAR_v3,基于 Actix_Web 框架的智能化图书管理系统,版本 2.1.2,由 Rusty_Borders 的在线控制系统演变而来。该项目采用 Rust 语言编写,依赖库有 Actix_Web、Tokio、OpenSSL 等,提供用户注册登录、借阅归还图书、单会话、集中身份检查等服务。是此版本使用 MySQL 作为数据库,Redis 作为高速缓存,并且实现了 SSL 加密传输,确保了安全性和高效性。项目遵循 GPL v2.0 协议。
263 2
EAR_v3 《浮声三》 智能化图书管理系统
|
SQL 自然语言处理 关系型数据库
NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]
NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]
NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]
|
前端开发 JavaScript 数据库
多个文件上传
多个文件上传
146 0
|
SQL 算法
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
300 1
|
安全 数据安全/隐私保护
新版发布功能上线,新增「大屏快照」功能!
新版发布功能上线,新增「大屏快照」功能! 发布分享 链接设置 分享链接 ​ 打开「发布分享」按钮之后,会随机生成一个分享链接,此链接每次打开之后都会变更,上一次的分享链接随即失效且不能恢复到历史分享链接。
15145 152
|
存储 小程序 编译器
[C进阶] 数据在内存中的存储——整形篇
[C进阶] 数据在内存中的存储——整形篇
|
存储 网络安全 数据安全/隐私保护
【专栏】Python 网络设备管理中,`ConnectHandler`(Paramiko库)和`telnetlib`模块常用于设备交互。
【4月更文挑战第28天】Python 网络设备管理中,`ConnectHandler`(Paramiko库)和`telnetlib`模块常用于设备交互。`ConnectHandler`简化SSH连接,便于与网络设备交互,而`telnetlib`是Python内置模块,支持Telnet协议的远程登录操作。两者都提供命令执行和响应接收功能。示例代码展示了如何使用它们获取防火墙设备的版本信息,降低了代码复杂度,提高了可读性和维护性。
477 0
|
算法 Unix Linux
linux比较两个文件是否一样(linux命令md5sum使用方法)
linux比较两个文件是否一样(linux命令md5sum使用方法)
353 0
|
SQL 运维 监控
Dataphin V3.9 版本升级|支持一站式数据汇聚处理、优化研发体验、提升数据治理能力
Dataphin V3.9 版本升级|支持一站式数据汇聚处理、优化研发体验、提升数据治理能力
383 0
|
存储 JavaScript 前端开发
分别利用split(),slice(),splice(),join(),操作数组的方法
分别利用split(),slice(),splice(),join(),操作数组的方法
231 0