关于惰性加载

在讲图片的惰性加载前,我们先来聊聊惰性加载。惰性加载又称为延迟加载、懒加载等,还有个好听的英文名字叫做 "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. Play framework简介
  2. 异步调用WebService方式!
  3. Roman and Browser-罗曼的浏览器 CodeForce1100A 暴力
  4. 小林菌2020总结,我差点没毕业~
  5. 推荐几个在大厂996,却一心想要按时下班的公众号主和他们的工作(摸鱼)心得...
  6. Oracle的回收站和闪回查询机制(二)
  7. JavaScript 小技巧之数组合并
  8. android 动态壁纸 时钟,Android自定义动态壁纸开发(时钟)
  9. Java冒泡排序代码实现
  10. 如何用两个栈实现一个队列
  11. python实现抠图_python和opencv实现抠图
  12. 原函数的导数与反函数的导数互为倒数
  13. Android 国内阿里云镜像
  14. CC00024.CloudOpenStack——|OpenStack组件.V02|——|OpenStack-Cinder块存储|配置block.V2|
  15. 关于Mysql插入繁体字等特殊字符显示异常及查询异常
  16. 参会记录|全国多媒体取证暨第二届多媒体智能安全学术研讨会(MAS‘2023)
  17. Markdown 数学公式总结
  18. 搜索 php源码,影视搜索php源码
  19. 计算机专业英语谐音读法,英语48个音标中文谐音读法大全
  20. hihoCoder #1135 : Magic Box

热门文章

  1. 结合NBA主题,Niantic再寻LBS AR游戏破局之道
  2. mybatis-plus过滤不查询某一字段
  3. win10安装PHPStudy 2018及mysql版本升级
  4. 新手搭建网站后视频资源在网站上是如何存储的?
  5. canvas画三角形
  6. python模拟登录钉钉,Python—实现钉钉后台开发,
  7. 朱松纯:初探计算机视觉三个源头兼谈人工智能
  8. 分享几个影视采集网站
  9. 比特大陆新一轮裁员50%,回应称系人员调整
  10. 遮罩层内容半透明解决