js图片延迟加载(Lazyload)三种实现方式


Posted in Javascript onMarch 01, 2017

延迟加载也称为惰性加载,即在长网页中延迟加载图像。

用户滚动到它们之前,视口外的图像不会加载。

这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快。

在某些情况下,它还可以帮助减少服务器负载。

延迟加载的优点:

提升用户的体验,如果图片数量较大,打开页面的时候要将将页面上所有的图片全部获取加载,很可能会出现卡顿现象,影响用户体验。因此,有选择性地请求图片,这样能明显减少了服务器的压力和流量,也能够减小浏览器的负担。

方法一

将页面上所有图片的src属性设置为loading.gif,而图片的真实路径则设置在data-src属性中。

当页面滚动的时候计算图片位置和滚动的位置,当图片出现在浏览器视口内时,将图片的src属性设置为data-src的值。

<img src="loading.png" data-src="image.png">
img { display: block; margin-bottom: 50px; }
function lazyload() {
 var images = document.getElementsByTagName('img');
 var n = 0; // 用于存储图片加载到的位置,避免每次都从第一张图片开始遍历 
 return function() {
 var seeHeight = document.documentElement.clientHeight;
 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
 for(var i = n; i < images.length; i++) {
  if (images[i].offsetTop < seeHeight + scrollTop) {
  if (images[i].getAttribute('src') === 'loading.png') {
   images[i].src = images[i].getAttribute('data-src');
  }
  n = n + 1;
  }
 }
 }
}
lazyload(); //初始化首页的页面图片
window.addEventListener('scroll', lazyload(), false);

方法二

上面的方法虽然没什么问题,但是性能较差,因为当页面滚动时,scroll事件会高频触发,这非常影响浏览器性能。
所以,这里要对lazyload函数进行函数节流(throttle)与函数去抖(debounce)处理。

这里html和css代码不变,经过throttle处理的js代码如下:

function throttle (fn, delay, atleast) {
 var timeout = null,
  startTime = new Date();
 return function () {
 var curTime = new Date();
 clearTimeout(timeout);
 if (curTime - startTime >= atleast) {
  fn ();
  startTime = curTime;
 } else {
  timeout = setTimeout (fn, delay);
 }
 }
}

function lazyload() {
 var images = document.getElementsByTagName('img'),
  n = 0;  //存储图片加载到的位置,避免每次都从第一张图片开始遍历 
 return function() {
 var seeHeight = document.documentElement.clientHeight;
 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
 for(var i = n; i < images.length; i++) {
  if(images[i].offsetTop < seeHeight + scrollTop) {
  if(images[i].getAttribute('src') === 'loading.png') {
   images[i].src = images[i].getAttribute('data-src');
  }
  n = n + 1;
  }
 }
 }
}
lazyload(); //初始化首页的页面图片
window.addEventListener('scroll', throttle(lazyload(), 500, 1000), false);

方法三

目前有一个新的 IntersectionObserver API,可以自动"观察"元素是否可见。

用这种方法实现代码非常简洁,但是许多浏览器不支持。

js图片延迟加载(Lazyload)三种实现方式

  • IntersectionObserver 传入一个回调函数,当其观察到元素集合出现时候,则会执行该函数。
  • io.observe 即要观察的元素,要一个个添加才可以。
  • io 管理的是一个数组,当元素出现或消失的时候,数组添加或删除该元素,并且执行该回调函数。
function query(selector) {
 return Array.from(document.querySelectorAll(selector));
}
var io = new IntersectionObserver(function(items) {
 items.forEach(function(item) {
 var target = item.target;
 if(target.getAttribute('src') == 'loading.png') {
  target.src = target.getAttribute('data-src');
 }
 })
});
query('img').forEach(function(item) {
 io.observe(item);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用倒置滤镜把div倒置,再把table倒置。
Jul 31 Javascript
JQuery+Ajax无刷新分页的实例代码
Feb 08 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
Apr 04 Javascript
一个js过滤空格的小函数
Oct 10 Javascript
jquery获取当前日期的方法
Jan 14 Javascript
javascript常用的方法分享
Jul 01 Javascript
基于JavaScript短信验证码如何实现
Jan 24 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
Dec 14 Javascript
javascript html5轻松实现拖动功能
Mar 01 Javascript
微信小程序实现购物车代码实例详解
Aug 29 Javascript
详解微信小程序中var、let、const用法与区别
Jan 11 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
Oct 31 Javascript
node.js实现回调的方法示例
Mar 01 #Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
Mar 01 #Javascript
Angular2库初探
Mar 01 #Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
Mar 01 #Javascript
JavaScript两个变量交换值的实现方法
Mar 01 #Javascript
js实现仿购物车加减效果
Mar 01 #Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
Mar 01 #Javascript
You might like
php cli 方式 在crotab中运行解决
2010/02/08 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
实例浅析js的this
2016/12/11 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
canvas时钟效果
2017/02/16 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
python连接oracle数据库实例
2014/10/17 Python
Python实现控制台进度条功能
2016/01/04 Python
python黑魔法之参数传递
2016/02/12 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
python看某个模块的版本方法
2018/10/16 Python
pytorch 模型可视化的例子
2019/08/17 Python
Pytorch之Variable的用法
2019/12/31 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
淘宝店铺营销方案
2014/02/13 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
大学生找工作求职信
2014/07/09 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
工商局调档介绍信
2015/10/22 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android