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写的操作系统
Apr 23 Javascript
JavaScript实现三阶幻方算法谜题解答
Dec 29 Javascript
JavaScript控制按钮可用或不可用的方法
Apr 03 Javascript
使用iojs的jsdom库实现同步系统时间
Apr 20 Javascript
jQuery编程中的一些核心方法简介
Aug 14 Javascript
jQuery实现表格元素动态创建功能
Jan 09 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
Jul 27 Javascript
React Native模块之Permissions权限申请的实例相机
Sep 28 Javascript
Dropify.js图片宽高自适应的方法
Nov 27 Javascript
基于vue实现简易打地鼠游戏
Aug 21 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
Nov 16 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 无限级 SelectTree 类
2009/05/19 PHP
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
PHP 读取和编写 XML
2014/11/19 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
动态样式类封装JS代码
2009/09/02 Javascript
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
2010/09/12 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
js跳转页面方法总结
2014/01/29 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
React Router基础使用
2017/01/17 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
微信小程序实现多张图片上传功能
2020/11/18 Javascript
Python中生成Epoch的方法
2017/04/26 Python
python机器学习库常用汇总
2017/11/15 Python
机器学习10大经典算法详解
2017/12/07 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
外贸专业求职信
2014/03/09 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
新生儿未入户证明
2015/06/23 职场文书
会计主管竞聘书
2015/09/15 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
导游词之无锡梅园
2019/11/28 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android