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 相关文章推荐
jQuery 实现自动填充邮箱功能(带下拉提示)
Oct 14 Javascript
通过JS获取Request.QueryString()参数的值实现方法
Sep 27 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
jquery实现放大镜简洁代码(推荐)
Jun 08 jQuery
微信小程序template模板实例详解
Oct 27 Javascript
angular 实时监听input框value值的变化触发函数方法
Aug 31 Javascript
详解写好JS条件语句的5条守则
Feb 28 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
Jul 10 Javascript
React中使用UMEditor的方法示例
Dec 27 Javascript
bootstrap实现嵌套模态框的实例代码
Jan 10 Javascript
原生js+canvas实现贪吃蛇效果
Aug 02 Javascript
react中props 的使用及进行限制的方法
Apr 28 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 木马攻击防御技巧
2009/06/13 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
php通过COM类调用组件的实现代码
2012/01/11 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
php时间函数用法分析
2016/05/28 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
python 多进程通信模块的简单实现
2014/02/20 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
python如何通过protobuf实现rpc
2016/03/06 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
PyQt5实现登录页面
2020/05/30 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
会计电算化个人自我评价
2013/11/17 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
中文师范生自荐信
2014/01/30 职场文书
优秀食品类广告词
2014/03/19 职场文书
2014年防汛工作总结
2014/12/08 职场文书