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 相关文章推荐
Javascript处理DOM元素事件实现代码
May 23 Javascript
javascript中方便增删改cookie的一个类
Oct 11 Javascript
javascript通过class来获取元素实现代码
Feb 20 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
javaScript 页面自动加载事件详解
Feb 10 Javascript
js的image onload事件使用遇到的问题
Jul 15 Javascript
Jquery元素追加和删除的实现方法
May 24 Javascript
移动端效果之IndexList详解
Oct 20 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
Aug 29 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
Sep 06 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
Dec 18 Javascript
webpack是如何实现模块化加载的方法
Nov 06 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 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
详解vuex的简单使用
2018/03/12 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
Python3基础之基本数据类型概述
2014/08/13 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
写给领导的感谢信
2015/01/22 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
美容院管理规章制度
2015/08/05 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书