关于惰性加载

在讲图片的惰性加载前,我们先来聊聊惰性加载。惰性加载又称为延迟加载、懒加载等,还有个好听的英文名字叫做 "lazyload"。需要注意的是,惰性加载并不只是图片的专利,Javascript 中函数也有惰性加载的概念,而在 Javascript 异步加载中还有个 LazyLoad类库,而图片的惰性加载库(lazyload)与之完全是两个概念,这些一定要弄清楚,以免混淆概念。

图片的惰性加载是啥意思?为什么要用它?当我们页面上的东西越来越丰富的时候,我们发现页面的加载速度却越来越慢,而图片的加载量无疑是 HTTP 请求里面的大头。其实很多时候,你把整个页面加载完,用户却不会滑动到最下面,也就是说很多东西其实白白加载了。因为图片的加载是大头,所以我们先拿图片开刀,我们假设,如果试图加载一个 HTML 页面,图片先不加载,当用户将页面往下滑动,图片该出现在可视区域时,再将该图片加载,这样就能将一开始打开页面的 HTTP 请求量降低,这就是图片的惰性加载。

实现

图片的惰性加载实现方式其实很简单。在 HTML 文件中将需要惰性加载的图片的 src 属性置为一个相同的地址(一般设置为一张 loading 图),这样这张图只会加载一次(第二次即会读取缓存),或者干脆置为空(用户体验不好),将真实的图片地址存储在别的属性中(比如 data-original 属性)

监听事件(比如 scroll 事件),判断需要惰性加载的图片是否已经在可视区域,如果是,则将 src 属性替换成 data-original 属性值

接着我们来简单写下代码。

首先,按照第一步将真实的图片地址藏在 data-original 属性中。这里我假设所有图片都要进行惰性加载,现实开发中如果肯定是在第一屏的图片,它的 src 完全可以直接指向真实的地址。

因为我把所有图片都设置为惰性加载模式,而首屏的图片需要直接显示,这里我写了个 init() 函数,注释都在代码中了:

functioninit() {var images =document.images;//加载首屏图片

for (var i = 0, len = images.length; i < len; i++) {var obj =images[i];//如果在可视区域并且还没被加载过

if (obj.getBoundingClientRect().top < document.documentElement.clientHeight && !obj.isLoad) {

obj.isLoad= true;//先调用 HTML5 方法

if(obj.dataset)

imageLoaded(obj, obj.dataset.original);elseimageLoaded(obj, obj.getAttribute('data-original'));

}else { //假设图片标签在 HTML 中的顺序和实际页面中顺序一致

break;

}

}

}View Code

代码中写了个 imageLoaded() 函数来将真实的图片地址指向元素,如果直接将 data-original 属性值指向图片的 src 属性的话,看到的图片可能会一段一段出现,而先将图片完全加载,然后再赋值使图片出现的话,体验就好多了。

functionimageLoaded(obj, src) {var img = newImage();

img.οnlοad= function() {

obj.src=src;

};

img.src=src;

}

OK,接着我们监听 scroll 事件。当用户滑动页面,图片出现在可视区域时,随即加载图片。

window.onscroll = function() {

lazyload();

};functionlazyload() {var lazy = 0;var images =document.images;for (var i = 0, len = images.length; i < len; i++) {var obj =images[i];if (obj.getBoundingClientRect().top - lazy < document.documentElement.clientHeight && !obj.isLoad) {

obj.isLoad= true;if(obj.dataset)

imageLoaded(obj, obj.dataset.original);elseimageLoaded(obj, obj.getAttribute('data-original'));

}

}

}

有的时候并不能当图片刚好在可视区域的时候再去加载,而要稍微 "预加载",可以调整下 lazyload() 函数中的 lazy 参数。

如果 "生硬" 地显示图片体验不大好,也可以搞点淡出效果,具体就不说了,可以看完整代码 Github

这样,一个简单的图片惰性加载 DEMO 就完成了!

PS:惰性加载虽然好处多多,但是也有一个 "非致命" 的缺点,影响 SEO。因为图片都被替换成假的图片,所以会影响图片的收录,所以这功能不建议在详情页使用

php的惰性加载,惰性加载相关推荐

  1. Lync 小技巧-51-Lync 2013-不加域-客户端-1-下载-证书-信任链

    场景: 您公司是否有Lync ? 您公司是否所有电脑加域呢? 您是不是初学Lync ? 如果不加域的客户端,你的Lync服务器没有用公网证书,那么你需要导入证书信任链. Lync 小技巧-51-Lyn ...

  2. Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结

    Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件. 1 ...

  3. jdbc驱动类加载直接指定线程上下文加载器加载

    jdbc获取连接是这么写的,看下代码都干了什么,是如何把驱动类加载到jvm的. Class.forName是装载一个类并且对其进行实例化的操作.这里mysql驱动com.sql.Driver的静态方法 ...

  4. WPS无法加载EndNote加载项

    问题描述 WPS2019通过"开发工具-加载项"加载路径C:\Program Files\Common Files\ResearchSoft\Cwyw\19\EndNote Cwy ...

  5. android图片加载过程,教你写Android ImageLoader框架之图片加载与加载策略

    在教你写Android ImageLoader框架之初始配置与请求调度中,我们已经讲述了ImageLoader的请求配置与调度相关的设计与实现.今天我们就来深入了解图片的具体加载过程以及加载的策略(包 ...

  6. java热加载_java--热加载

    1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...

  7. PPT美化插件 islide 安装过程问题“加载com加载项时运行出现错误”

    一.插件介绍 islide是一款功能强大的PPT美化插件,可以实现快速配色.对齐.图形定制等功能. islide 官网:iSlide- 让PPT设计简单起来 | PPT模板下载平台 二.安装过程中的问 ...

  8. css 同步加载,同步加载,异步加载,懒加载,预加载

    同步加载 默认的就是同步加载 同步加载: 同步模式又称阻塞模式,会阻止浏览器的后续处理,停止了后续的文件的解析,执行,如图像的渲染.流览器之所以会采用同步模式,是因为加载的js文件中有对dom的操作, ...

  9. Vue7 异步加载 懒加载

    vue开发过程中,我们会做出特别多特别多的组件,包括login,header,footer,main等等.这样使整个网站看起来就十分的庞大,当我们在打开网页的时候,突然一下子把这些所有的组件加载上来, ...

  10. Xilinx FPGA在线加载远程更新多重加载 QSPI加载方式 可通过PCIe/网口/串口等接口加载

    Xilinx FPGA在线加载&远程更新&多重加载 QSPI加载方式 可通过PCIe/网口/串口等接口加载 源代码 需要的详谈 ID:6614999670814444294浪里个浪里个 ...

最新文章

  1. 如何判断你的数据集是否适合使用深度学习模型?如果数据量太小有什么解决办法?
  2. 树莓派该文件名_树莓派学习笔记(2):常用linux命令
  3. angular moment 倒计时_Moment 推出多款适用苹果 iPhone 12 的 MagSafe 配件:包括快速安装外接镜头保护壳 - iPhone 12...
  4. jQuery 判断鼠标键
  5. 百度Java电面一面面经
  6. 【CF1182D】Complete Mirror【树的重心】
  7. 具有InlfuxDB的Spring Boot和Micrometer第3部分:Servlet和JDBC
  8. Java 8之前和之后的Lambda表达式
  9. 随机初始化(代码实现)
  10. 计算机五笔字型编码方法,《计算机汉字输入五笔字型打字速成》汉字编码-输入.pdf...
  11. vue点击网页全屏_vue实现浏览器全屏展示功能
  12. QGraphicsItem绘制重叠区域
  13. RT_Thread_进程间通讯——邮箱
  14. 走进JavaWeb技术世界7:Tomcat和其他WEB容器的区别
  15. 《大规模元搜索引擎技(1)》一第1章 绪言
  16. MySQL数据库web客户端管理工具软件
  17. 2. Golang基本语法
  18. 提升eBay店铺流量的方式有哪些?
  19. 贪吃蛇大作战【C++游戏】
  20. BZOJ4920: [Lydsy1706月赛]薄饼切割

热门文章

  1. GB28181系列笔记-语音对讲功能
  2. #AR游戏--音之国度#初次简单的测试
  3. lol服务器维护8月6日,LOL8月6日维护到几点 英雄联盟9.15新版本更新维护公告
  4. 考研公式大全-提问版-数学二
  5. android edittext 输入手机号码格式变化
  6. 美女直播这么火,那你知道怎么测试直播软件吗?
  7. 公历转农历C/C++代码
  8. 安卓期末大作业——图书信息管理系统
  9. 51Nod NOIP2018提高组省一冲奖班模测训练
  10. NSIS脚本学习:创建 MUI 界面使用的自定义语言包文件(nlf nsh)