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 相关文章推荐
一端时间轮换的广告
Jun 26 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
Aug 23 Javascript
javascript中普通函数的使用介绍
Dec 19 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
Oct 23 Javascript
解析浏览器端的AJAX缓存机制
Jun 21 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
Jul 12 Javascript
js继承实现方法详解
Dec 16 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 Javascript
vue-for循环嵌套操作示例
Jan 28 Javascript
vue项目使用.env文件配置全局环境变量的方法
Oct 24 Javascript
vue抽出组件并传值实例
Jul 31 Javascript
Vue3 响应式侦听与计算的实现
Nov 11 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
一个捕获函数输出的函数
2007/02/14 PHP
php 分页类 扩展代码
2009/06/11 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
基于jquery的跨域调用文件
2010/11/19 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
记录Django开发心得
2014/07/16 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
python lambda的使用详解
2021/02/26 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
精彩的推荐信范文
2013/11/26 职场文书
生产部管理制度
2014/01/31 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
重阳节标语大全
2014/10/07 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python