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 相关文章推荐
JSON语法五大要素图文介绍
Dec 04 Javascript
jquery实现图片翻页效果
Dec 23 Javascript
javascript与css3动画结合使用小结
Mar 11 Javascript
js获取当前年月日-YYYYmmDD格式的实现代码
Jun 01 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
Nov 09 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
前端MVVM框架解析之双向绑定
Jan 24 Javascript
对angularJs中ng-style动态改变样式的实例讲解
Sep 30 Javascript
vue-cli中vue本地实现跨域调试接口
Jan 16 Javascript
详解ES6 export default 和 import语句中的解构赋值
May 28 Javascript
vue中实现高德定位功能
Dec 03 Javascript
使用vue实现一个电子签名组件的示例代码
Jan 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使用内置dir类实现目录遍历删除
2015/03/31 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
laravel入门知识点整理
2020/09/15 PHP
拖拉表格的JS函数
2008/11/20 Javascript
jQuery 选择器理解
2010/03/16 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
Windows下安装python2和python3多版本教程
2017/03/30 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
Python 线程池用法简单示例
2019/10/02 Python
Python如何生成xml文件
2020/06/04 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
Shein英国:女性时尚网上商店
2019/04/10 全球购物
英文自我鉴定
2013/12/10 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis