图片懒加载 echo.js

  1 (function (root, factory) {
  2   if (typeof define === ‘function‘ && define.amd) {
  3     define(function() {
  4       return factory(root);
  5     });
  6   } else if (typeof exports === ‘object‘) {
  7     module.exports = factory;
  8   } else {
  9     root.echo = factory(root);
 10   }
 11 })(this, function (root) {
 12
 13   ‘use strict‘;
 14
 15   var echo = {};
 16
 17   var callback = function () {};
 18
 19   var offset, poll, delay, useDebounce, unload;
 20
 21   var isHidden = function (element) {
 22     return (element.offsetParent === null);
 23   };
 24
 25   var inView = function (element, view) {
 26     if (isHidden(element)) {
 27       return false;
 28     }
 29
 30     var box = element.getBoundingClientRect();
 31     return (box.right >= view.l && box.bottom >= view.t && box.left <= view.r && box.top <= view.b);
 32   };
 33
 34   var debounceOrThrottle = function () {
 35     if(!useDebounce && !!poll) {
 36       return;
 37     }
 38     clearTimeout(poll);
 39     poll = setTimeout(function(){
 40       echo.render();
 41       poll = null;
 42     }, delay);
 43   };
 44
 45   echo.init = function (opts) {
 46     opts = opts || {};
 47     var offsetAll = opts.offset || 0;
 48     var offsetVertical = opts.offsetVertical || offsetAll;
 49     var offsetHorizontal = opts.offsetHorizontal || offsetAll;
 50     var optionToInt = function (opt, fallback) {
 51       return parseInt(opt || fallback, 10);
 52     };
 53     offset = {
 54       t: optionToInt(opts.offsetTop, offsetVertical),
 55       b: optionToInt(opts.offsetBottom, offsetVertical),
 56       l: optionToInt(opts.offsetLeft, offsetHorizontal),
 57       r: optionToInt(opts.offsetRight, offsetHorizontal)
 58     };
 59     delay = optionToInt(opts.throttle, 250);
 60     useDebounce = opts.debounce !== false;
 61     unload = !!opts.unload;
 62     callback = opts.callback || callback;
 63     echo.render();
 64     if (document.addEventListener) {
 65       root.addEventListener(‘scroll‘, debounceOrThrottle, false);
 66       root.addEventListener(‘load‘, debounceOrThrottle, false);
 67     } else {
 68       root.attachEvent(‘onscroll‘, debounceOrThrottle);
 69       root.attachEvent(‘onload‘, debounceOrThrottle);
 70     }
 71   };
 72
 73   echo.render = function () {
 74     var nodes = document.querySelectorAll(‘img[data-echo], [data-echo-background]‘);
 75     var length = nodes.length;
 76     var src, elem;
 77     var view = {
 78       l: 0 - offset.l,
 79       t: 0 - offset.t,
 80       b: (root.innerHeight || document.documentElement.clientHeight) + offset.b,
 81       r: (root.innerWidth || document.documentElement.clientWidth) + offset.r
 82     };
 83     for (var i = 0; i < length; i++) {
 84       elem = nodes[i];
 85       if (inView(elem, view)) {
 86
 87         if (unload) {
 88           elem.setAttribute(‘data-echo-placeholder‘, elem.src);
 89         }
 90
 91         if (elem.getAttribute(‘data-echo-background‘) !== null) {
 92           elem.style.backgroundImage = "url(" + elem.getAttribute(‘data-echo-background‘) + ")";
 93         }
 94         else {
 95           elem.src = elem.getAttribute(‘data-echo‘);
 96         }
 97
 98         if (!unload) {
 99           elem.removeAttribute(‘data-echo‘);
100           elem.removeAttribute(‘data-echo-background‘);
101         }
102
103         callback(elem, ‘load‘);
104       }
105       else if (unload && !!(src = elem.getAttribute(‘data-echo-placeholder‘))) {
106
107         if (elem.getAttribute(‘data-echo-background‘) !== null) {
108           elem.style.backgroundImage = "url(" + src + ")";
109         }
110         else {
111           elem.src = src;
112         }
113
114         elem.removeAttribute(‘data-echo-placeholder‘);
115         callback(elem, ‘unload‘);
116       }
117     }
118     if (!length) {
119       echo.detach();
120     }
121   };
122
123   echo.detach = function () {
124     if (document.removeEventListener) {
125       root.removeEventListener(‘scroll‘, debounceOrThrottle);
126     } else {
127       root.detachEvent(‘onscroll‘, debounceOrThrottle);
128     }
129     clearTimeout(poll);
130   };
131
132   return echo;
133
134 });

如何使用

1、引入文件

  1. <script src="js/echo.min.js"></script>

2、HTML结构

  1. <img src="img/blank.gif" alt="Photo" data-echo="img/photo.jpg" />

blank.gif 是一个 1 x 1 的图片,用做默认图片,data-echo 的属性值是图片的真实地址。你可以给图片设置宽度和高度,或者在 CSS 中设置,否则似乎很底部很底部的图片才会延迟加载。

3、JavaScript

1     echo.init({
2     offset: 100,
3     throttle: 250,
4     unload: false,
5     callback: function (element, op) {
6     console.log(‘loaded ok.‘);
7     }
8     });  

4、常用参数及方法说明

参数 描述 默认值
offset 离可视区域多少像素的图片可以被加载 0
throttle 图片延迟多少毫秒加载 250
debounce 防抖动 true
unload 告诉echo是加载还是卸载视图中的图片,当图片离开视图区域时触发 false
callback 回调函数,用来检测图片是否加载 function()

最后echo.js还提供了一个.render()方法,用法如下:

echo.render();

应用场景:当你的页面没有发生滚动,而你想加载即将要显示的图片,如图片轮播,当第一张图片显示完,接着滑动展示第二张图片,这个时候使用echo.render()

提前加载第二张图片,就不会出现图片加载卡顿白屏等现象。

原文地址:https://www.cnblogs.com/zhenguo-chen/p/10506733.html

时间: 2024-10-10 04:11:33

图片懒加载 echo.js的相关文章

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

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

图片懒加载 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

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

最近不是在学习设计模式吗,然后就看到了代理模式加载图片的样例,然后自己实现了一下,就发现,自己写的这货每次就只能加载一张图片,而且图片要放在哪也是个很严重的问题 然后就去了 gayhub 找了找了找流行的图片懒加载库,这一找,就找到了一个echo.j是,打开一看,源码只有100多行吧,震惊..,看完源码,哎,木有上代理模式呀 仔细学习了下源码:觉得这种做法比较适合图片位置确定场景的吧,比如文章啊,一篇文章老长了,里面有蛮多图片散落在不同的地方,这样就比较合适,有可能有很多图片读者都不会翻到哪里,

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

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

页面性能优化-原生JS实现图片懒加载

在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的方式叫做图片懒加载,又叫做按需加载或图片的延时加载.这样做的好处是:1.可以加快页面首屏渲染的速度:2.节约用户的流量. 一.实现思路 1.图片img标签自定义一个属性data-src来存放真实的地址. 2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果

js图片懒加载

<script type="text/javascript"> var lazyLoad = { // 获取元素到页面顶部的距离 getoffsetTop: function(elem){ var offTop = 0; while(elem != null){ offTop += elem.offsetTop; // 获取元素到其上一级元素顶部的距离 elem = elem.offsetParent; // 元素的上一级元素 } return offTop; }, //

原生JS实现图片懒加载之一:Element.getBoundingClientRect()

实际项目开放中,特别是电商项目,由于有大量的图片加载必然会影响性能,所以实现图片的懒加载是非常有必要的. 实现图片懒加载的知识点 标签的data-属性 可视区域的监听 实现图片懒加载的原理 <img alt="loading..." data-src="images/1.jpg"> 当我们监听到图片进入可视区域后,就将data-src到值赋值给src属性 <script> var images = document.querySelector