基于javascript实现图片懒加载


Posted in Javascript onJanuary 05, 2016

一、定义

图片延迟加载也称为懒加载,延迟加载图片或符合某些条件时才加载某些图片,通常用于图片比较多的网页。可以减少请求数或者延迟请求数,优化性能。

 二、呈现形式

【1】延时加载,使用setTimeout或setInterval进行加载延迟,如果用户在加载前就离开,自然就不会进行加载。
【2】条件加载,符合某些条件或者触发了某些条件才开始异步加载。
【3】可视区域加载,仅仅加载用户可以看到的区域,这个主要监控滚动条来实现,一般距离用户看到的底边很近的时候开始加载,这样能保证用户下拉时图片正好接上,不会有太长时间的停顿。

 三、基本步骤

【1】网页中的图片都设为同一张图片
【2】给图片增加data-original = "img/test.jpg"的属性,保存图片的真实地址
【3】当触发某些条件时,自动改变该区域的图片的src属性为真实的地址 

四、应用

1、点击按钮显示图片

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
  margin: 0;
}
img{
  height: 100px;
  width: 100px;
}
</style>
</head>
<body>
<button>加载图片</button>
<img src="#" alt="测试" data-original = "img/test.png">
<script>
var oBtn = document.getElementsByTagName('button')[0];
var oImg = document.images[0];  
oBtn.onclick = function(){
  oImg.src = "img/loading.gif";
  if(oImg.dataset){
    aftLoadImg(oImg,oImg.dataset.original);  
  }else{
    aftLoadImg(oImg,oImg.getAttribute("data-original"));
  }
}
function aftLoadImg(obj,url){
  var oImg = new Image();
  oImg.onload = function(){
    obj.src = oImg.src;
  }
  oImg.src = url;
}
</script>  
</body>
</html>

2、可视区显示图片

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
  margin: 0;
}
ul{
  margin: 0;
  padding: 0;
  list-style: none;
}
img{
  border: none;
  vertical-align: middle;
}
.in{
  border: 1px solid black;
  margin: 10px;
  text-align: center;
  height: 400px;
  width: 400px;
  float: left;
}
.in img{
  height: 400px;
  width: 400px;
}
</style>
</head>
<body>
<ul class="list">
  <li class="in"><img src="img/loading.gif" alt="测试" data-original = "img/img1.gif"></li>
  <li class="in"><img src="img/loading.gif" alt="测试" data-original = "img/img2.gif"></li>
  <li class="in"><img src="img/loading.gif" alt="测试" data-original = "img/img3.gif"></li>
  <li class="in"><img src="img/loading.gif" alt="测试" data-original = "img/img4.gif"></li>  
  <li class="in"><img src="img/loading.gif" alt="测试" data-original = "img/img1.gif"></li>
  <li class="in"><img src="img/loading.gif" alt="测试" data-original = "img/img2.gif"></li>
  <li class="in"><img src="img/loading.gif" alt="测试" data-original = "img/img3.gif"></li>
  <li class="in"><img src="img/loading.gif" alt="测试" data-original = "img/img4.gif"></li>              
</ul>

<script>
var oBtn = document.getElementsByTagName('button')[0];
var aImages = document.images;
loadImg(aImages);
window.onscroll = function(){
  loadImg(aImages);
};
function loadImg(arr){
  for( var i = 0,len = arr.length; i < len; i++){
    if(arr[i].getBoundingClientRect().top < document.documentElement.clientHeight && !arr[i].isLoad){
      arr[i].isLoad = true;
      arr[i].style.cssText = "transition: ''; opacity: 0;"
      if(arr[i].dataset){
        aftLoadImg(arr[i],arr[i].dataset.original);  
      }else{
        aftLoadImg(arr[i],arr[i].getAttribute("data-original"));
      }
      (function(i){
        setTimeout(function(){
          arr[i].style.cssText = "transition: 1s; opacity: 1;"
        },16)
      })(i);
    }
  }
}
function aftLoadImg(obj,url){
  var oImg = new Image();
  oImg.onload = function(){
    obj.src = oImg.src;
  }
  oImg.src = url;
}

</script>  
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,顺利实现javascript图片懒加载。

Javascript 相关文章推荐
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
javaScript同意等待代码实现心得
Jan 01 Javascript
jquery 日期控件datepicker属性详细解析
Nov 08 Javascript
js字符串完全替换函数分享
Dec 03 Javascript
ECMAScript5(ES5)中bind方法使用小结
May 07 Javascript
简介JavaScript中的setTime()方法的使用
Jun 11 Javascript
node.js实现快速截图
Aug 27 Javascript
JavaScript中const、var和let区别浅析
Oct 11 Javascript
mui back 返回刷新页面的实例
Dec 06 Javascript
Angular利用trackBy提升性能的方法
Jan 26 Javascript
Vue中实现权限控制的方法示例
Jun 07 Javascript
JavaScript图像放大镜效果实现方法详解
Jun 28 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 #Javascript
基于javascript实现图片预加载
Jan 05 #Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
Jan 05 #Javascript
javascript设置和获取cookie的方法实例详解
Jan 05 #Javascript
javascript简单比较日期大小的方法
Jan 05 #Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
Jan 05 #Javascript
简述jQuery ajax的执行顺序
Jan 05 #Javascript
You might like
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
详谈PHP编码转换问题
2015/07/28 PHP
PHP/HTML混写的四种方式总结
2017/02/27 PHP
Yii框架安装简明教程
2020/05/15 PHP
告诉大家什么是JSON
2008/06/10 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
python基础之入门必看操作
2017/07/26 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
查看Django和flask版本的方法
2018/05/14 Python
Python实现的建造者模式示例
2018/08/06 Python
python面向对象法实现图书管理系统
2019/04/19 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
2019史上最全Database工程师题库
2015/12/06 面试题
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang