图片懒加载库echo.js源码学习

最近不是在学习设计模式吗,然后就看到了代理模式加载图片的样例,然后自己实现了一下,就发现,自己写的这货每次就只能加载一张图片,而且图片要放在哪也是个很严重的问题

然后就去了 gayhub 找了找了找流行的图片懒加载库,这一找,就找到了一个echo.j是,打开一看,源码只有100多行吧,震惊。。,看完源码,哎,木有上代理模式呀

仔细学习了下源码:觉得这种做法比较适合图片位置确定场景的吧,比如文章啊,一篇文章老长了,里面有蛮多图片散落在不同的地方,这样就比较合适,有可能有很多图片读者都不会翻到哪里,加载下来就浪费了

关键点:

1.如何判断元素距离出现在视野里的长度还有多少?以常见鼠标往下滚动,图片在下面为例

          

灵魂画手哈哈,,,;H1是视窗的高度,window.innerHeight可以获得,H2就是提供给使用者设置的offsetBottom

然后祭出一个大招!element.getBoundingClientRect(),就能得到元素相对于视窗的四个距离

            

var H=Element.getboundingclientrect().top;
var flag=H-(H1+H2);//当flag值小于0就代表可以开始加载图片了

  那么,看看源码里面是怎么写的:

var offset = {//四个值由用户传入决定,默认为0
      t: ,
      b:,
      l: ,
      r:
};
var   view = {  //计算邻界的距离
      l: 0 - offset.l,
      t: 0 - offset.t,
      b: (root.innerHeight || document.documentElement.clientHeight) + offset.b,
      r: (root.innerWidth || document.documentElement.clientWidth) + offset.r
};
 var isHidden = function (element) {
    return (element.offsetParent === null);  //element.offsetParent 表示父元素,如果为null证明没有在添加到DOM里面,或者position值为fixed
  };

  var inView = function (element, view) {  //判断是否在视图中调用这个函数判断
    if (isHidden(element)) {  //判断是否在界面上
      return false;
    }

    var box = element.getBoundingClientRect();  //计算四边的距离是否满足条件
    return (box.right >= view.l && box.bottom >= view.t && box.left <= view.r && box.top <= view.b);
  };

  

2.已经有了是否加载的判断函数,那么如何做到图片的懒加载?

 先加载loadding小菊花图片,当满足懒加载的条件时候,切换img的src属性,

对于img元素的设置有两个比较重要的值一个是src,一个是data-echo ,(还有一个是背景图片,不太重要,忽略他)两个,src设置小菊花的地址,data-echo真实的地址;

那么所有页面元素都这样设置后,会有什么影响?

当所有图片都用设置src为同一值,也就是用同一张菊花图,加载完之后就可以通用了

img这个元素的特性就是,当设置了src属性,他会去先加载这张图图片,如果在js里面马上改变了img的src属性,他会同事再进行一次网络请求去加载你js设置的src地址的图片

但是 会先将html里面设置的src图片加载完,显示,你什么时候加载完第二个图片什么时候替换,如果你在第二张图片加载的时候又改变了src的值,,,那也是一样的,什么加载完什么时候显示,没加载完的情况下显示原来的

源代码:

  if (inView(elem, view)) {//是否满足加载条件

        if (unload) {//如果设置超出了不加载,保存小菊花地址在data-echo-placeholder属性
          elem.setAttribute(‘data-echo-placeholder‘, elem.src);
        }

        if (elem.getAttribute(‘data-echo-background‘) !== null) {//img的背景图片
          elem.style.backgroundImage = ‘url(‘ + elem.getAttribute(‘data-echo-
background‘) + ‘)‘;
        }
        //当ele的src不等于data-echo的值,也就是真蒸的图片地址,改变图片的src
        else if (elem.src !== (src = elem.getAttribute(‘data-echo‘))) {
          elem.src = src;
        }

        if (!unload) { //如果没有设置超出不加载,在这里就可以清除这些属性了
          elem.removeAttribute(‘data-echo‘);
          elem.removeAttribute(‘data-echo-background‘);
        }

        callback(elem, ‘load‘);
      }
      else if (unload && !!(src = elem.getAttribute(‘data-echo-placeholder‘))) {
     //处理超出不加载图片的情况,把原来保存的小菊花图赋给elem的src
    //因为小菊花是最开始就加载好了的,所以图片切换回小菊花,不再加载之前设置的真实图片
        if (elem.getAttribute(‘data-echo-background‘) !== null) {
          elem.style.backgroundImage = ‘url(‘ + src + ‘)‘;
        }
        else {
          elem.src = src;
        }

        elem.removeAttribute(‘data-echo-placeholder‘);
        callback(elem, ‘unload‘);
      }
    }
    if (!length) {
      echo.detach();//移除事件监听
    }

  

3,scroll函数节流

函数节流,两种方式:

1:在滚动的时候不会触发,滚动停下来才会隔一段时间触发

2:每隔一段事件都触发

//第一种方式,每次滚动过程中一直触发,每次都会新清除上一次的setTimout,添加一个新的setTimout
var poll;
function throttle(){
 clearTimeout(poll);
 poll=setTimeout(function(){
    echo.render();
 },delay||250)
}

  

  

var poll;function throttle(){
if(poll){  //存在setTimout,不清除,直接返回
   return ;
}
clearTimout(poll);
poll=setTimeout(function(){
   echo.render();
   poll=null;      //允许再次添加定时器
},delay||250)
}

  

时间: 2024-10-22 23:45:48

图片懒加载库echo.js源码学习的相关文章

【JavaScript】使用纯JS实现多张图片的懒加载Lazy(附源码)

一.效果图如下 上面的效果图,效果需求如下 1.还没加载图片的时候,默认显示加载图片背景图 2.刚开始进入页面,自动加载第一屏幕的图片 3.下拉界面,当一张图片容器完全显露出屏幕,即刻加载图片,替换背景图 4.加载图片的时候,有渐进显示图片效果 二.难点 1)如何Ajax请求数据 2)如何动态将json数据绑定到html中. 3)如何通过对图片的定位计算,触发图片懒加载机制 4)加分项,显示图片时有渐现的过渡动画 三.前期知识点 1)Ajax相关知识,XMLHttpRequest对象,所有现代的

图片懒加载之lazyload.js插件使用

简介 lazyload.js用于长页面图片的延迟加载,视口外的图片会在窗口滚动到它的位置时再进行加载,这是与预加载相反的. 使用 lazyload依赖与jquery.所以先引入jquery和lazyload <script src="jquery.js"></script> <script src="jquery.lazyload.js"></script> 1.将图片路径写入data-original属性2.给laz

前端性能优化--图片懒加载(lazyload image)

图片懒加载(当然不仅限于图片,还可以有视频,flash)也是一种优化前端性能的方式.使用懒加载可以想要看图片时才加载图片,而不是一次性加载所有的图片,从而在一定程度从减少服务端的请求 什么是懒加载 懒加载怎么个懒法,就是你不想看就不给你看,我也懒得加载出来,懒得去请求.通俗的说就是你不要就不给你,怎么地.举个栗子,比如在进入某个页面的时候,它会有许多的图片,有些图片可能在下面,当我们点进页面但没有滑动下去或没看完整个页面,那么下面的图片就会"没用",加载了也白加载,而且还降低了网页的加

移动端图片懒加载插件

LazyloadImg介绍 LazyloadImg 轻量级的移动端图片懒加载插件原生js开发,不依赖任何框架或库支持将各种宽高不一致的图片,自动剪切成默认图片的宽高.比如说你的默认图片是一张正方形的图片,则各种宽度高度不一样的图片,自动剪切成正方形.完美解决移动端开发中,用户上传图片宽高不一致而导致的图片变形的问题.简洁的API,让你分分钟入门!!! 快速入门 var lazyloadImg = new LazyloadImg({ el: '#ul [data-src]', //匹配元素 top

图片懒加载--lazyload.js的用法

这几天公司的项目已经完成的差不多了,只剩下各种优化问题.今天着重于图片加载的优化.当一个页面需要下拉很长而且又有过多的图片要加载时,就会发生很多http请求,就会拉慢网页加载速度,用户体验不友好.怎么解决这个问题呢?jQuery插件库中有个插件lazyload.js可以实现图片懒加载. lazyload.js的原理就是将真正要加载的图片的地址放在另一个属性中,而图片的src的地址则是一个1px *1px的占位图,这样在网页加载过程中,首先下载的是这个占位图,当网页加载完成后,下拉页面时再下载在可

Js 之图片懒加载插件

一.PC端(lazyload) 1.引入js文件 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.lazyload/1.9.1/jquery.lazyload.min.js"></scrip

图片懒加载 lazyload.js使用方法

lazyload是一个用Javascript编写的jQuery插件,它可以延迟加载长页面中的图片,在浏览器可视区域外的图片将不会被载入,直到用户将它们滚动到它们所在的位置. 跟bootstrap一样,lazyload.js也是依赖于jQuery <script src="resources/js/jquery-1.8.3.min.js"></script> <script src="resources/js/jquery.lazyload.min

js 图片懒加载

图片懒加载(图片出现在可视区域再加载) 兼容性:兼容目前流行的全部浏览器,包括:兼容到IE6) 使用方法: 引入相应的js文件<script src="js/lazy.js"></script> 初始化 Lazy.init(1000); 可以传入延时时间.默认是500ms 注意: <img src="img/load.gif" data-lazy="img/2.jpg"> src 属性放预加载的图片,data-

js可视区域图片懒加载

可视区域图片懒加载 实现原理,页面滚动时获取需要懒加载的图片,判断此图片是否在可视区域内,是则设置图片data-src地址为src地址,加载图片. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jquery可视区域图片懒加载</title> <script src="http://libs.baidu.com/jquery/2