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 相关文章推荐
js 获取子节点函数 (兼容FF与IE)
Apr 18 Javascript
node.js使用nodemailer发送邮件实例
Mar 10 Javascript
javascript相关事件的几个概念
May 21 Javascript
JavaScript声明变量名的语法规则
Jul 10 Javascript
html+js实现简单的计算器代码(加减乘除)
Jul 12 Javascript
基于vue.js实现图片轮播效果
Dec 01 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
Dec 14 Javascript
Bootstrap的modal拖动效果
Dec 25 Javascript
js原生日历的实例(推荐)
Oct 31 Javascript
JavaScript实现单图片上传并预览功能
Sep 30 Javascript
小程序实现图片移动缩放效果
May 26 Javascript
js 获取扫码枪输入数据的方法
Jun 10 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安全编程之加密功能
2006/10/09 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
javascript 函数速查表
2010/02/07 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
python抓取网页中的图片示例
2014/02/28 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
Python 对输入的数字进行排序的方法
2018/06/23 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
python在不同条件下的输入与输出
2020/02/13 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
毕业生求职简历中的自我评价
2013/10/18 职场文书
生产主管岗位职责
2013/11/10 职场文书
财务会计专业求职信范文
2013/12/31 职场文书
党员组织关系介绍信
2014/02/13 职场文书
质检员岗位职责
2015/02/03 职场文书
自我推荐信格式模板
2015/03/24 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android
Hive导入csv文件示例
2022/06/25 数据库