zoukankan      html  css  js  c++  java
  • 图片延迟加载

        Lazy Load Plugin for jQuery

        可实现图片出现在视口时才加载的效果,网上的例子一堆堆。

        官方网站:http://www.appelsiini.net/projects/lazyload

        网上例子个人觉得比较好的:http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/

        使用起来难度不大,配置一下效果就有了(网上有说这个插件的异步加载有bug,不过貌似新版本已经修复),下面是源码:

      1 /*
      2  * Lazy Load - jQuery plugin for lazy loading images
      3  *
      4  * Copyright (c) 2007-2013 Mika Tuupola
      5  *
      6  * Licensed under the MIT license:
      7  *   http://www.opensource.org/licenses/mit-license.php
      8  *
      9  * Project home:
     10  *   http://www.appelsiini.net/projects/lazyload
     11  *
     12  * Version:  1.9.3
     13  *
     14  */
     15 
     16 (function($, window, document, undefined) {
     17     var $window = $(window);
     18 
     19     $.fn.lazyload = function(options) {
     20         var elements = this;
     21         var $container;
     22         var settings = {
     23             threshold       : 0,
     24             failure_limit   : 0,
     25             event           : "scroll",
     26             effect          : "show",
     27             container       : window,
     28             data_attribute  : "original",
     29             skip_invisible  : true,
     30             appear          : null,
     31             load            : null,
     32             placeholder     : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"
     33         };
     34 
     35         function update() {
     36             var counter = 0;
     37 
     38             elements.each(function() {
     39                 var $this = $(this);
     40                 if (settings.skip_invisible && !$this.is(":visible")) {
     41                     return;
     42                 }
     43                 if ($.abovethetop(this, settings) ||
     44                     $.leftofbegin(this, settings)) {
     45                         /* Nothing. */
     46                 } else if (!$.belowthefold(this, settings) &&
     47                     !$.rightoffold(this, settings)) {
     48                         $this.trigger("appear");
     49                         /* if we found an image we'll load, reset the counter */
     50                         counter = 0;
     51                 } else {
     52                     if (++counter > settings.failure_limit) {
     53                         return false;
     54                     }
     55                 }
     56             });
     57 
     58         }
     59 
     60         if(options) {
     61             /* Maintain BC for a couple of versions. */
     62             if (undefined !== options.failurelimit) {
     63                 options.failure_limit = options.failurelimit;
     64                 delete options.failurelimit;
     65             }
     66             if (undefined !== options.effectspeed) {
     67                 options.effect_speed = options.effectspeed;
     68                 delete options.effectspeed;
     69             }
     70 
     71             $.extend(settings, options);
     72         }
     73 
     74         /* Cache container as jQuery as object. */
     75         $container = (settings.container === undefined ||
     76                       settings.container === window) ? $window : $(settings.container);
     77 
     78         /* Fire one scroll event per scroll. Not one scroll event per image. */
     79         if (0 === settings.event.indexOf("scroll")) {
     80             $container.bind(settings.event, function() {
     81                 return update();
     82             });
     83         }
     84 
     85         this.each(function() {
     86             var self = this;
     87             var $self = $(self);
     88 
     89             self.loaded = false;
     90 
     91             /* If no src attribute given use data:uri. */
     92             if ($self.attr("src") === undefined || $self.attr("src") === false) {
     93                 if ($self.is("img")) {
     94                     $self.attr("src", settings.placeholder);
     95                 }
     96             }
     97 
     98             /* When appear is triggered load original image. */
     99             $self.one("appear", function() {
    100                 if (!this.loaded) {
    101                     if (settings.appear) {
    102                         var elements_left = elements.length;
    103                         settings.appear.call(self, elements_left, settings);
    104                     }
    105                     $("<img />")
    106                         .bind("load", function() {
    107 
    108                             var original = $self.attr("data-" + settings.data_attribute);
    109                             $self.hide();
    110                             if ($self.is("img")) {
    111                                 $self.attr("src", original);
    112                             } else {
    113                                 $self.css("background-image", "url('" + original + "')");
    114                             }
    115                             $self[settings.effect](settings.effect_speed);
    116 
    117                             self.loaded = true;
    118 
    119                             /* Remove image from array so it is not looped next time. */
    120                             var temp = $.grep(elements, function(element) {
    121                                 return !element.loaded;
    122                             });
    123                             elements = $(temp);
    124 
    125                             if (settings.load) {
    126                                 var elements_left = elements.length;
    127                                 settings.load.call(self, elements_left, settings);
    128                             }
    129                         })
    130                         .attr("src", $self.attr("data-" + settings.data_attribute));
    131                 }
    132             });
    133 
    134             /* When wanted event is triggered load original image */
    135             /* by triggering appear.                              */
    136             if (0 !== settings.event.indexOf("scroll")) {
    137                 $self.bind(settings.event, function() {
    138                     if (!self.loaded) {
    139                         $self.trigger("appear");
    140                     }
    141                 });
    142             }
    143         });
    144 
    145         /* Check if something appears when window is resized. */
    146         $window.bind("resize", function() {
    147             update();
    148         });
    149 
    150         /* With IOS5 force loading images when navigating with back button. */
    151         /* Non optimal workaround. 兼容移动端*/
    152 if ((/(?:iphone|ipod|ipad).*os 5/gi).test(navigator.appVersion)) { 153 $window.bind("pageshow", function(event) { 154 if (event.originalEvent && event.originalEvent.persisted) { 155 elements.each(function() { 156 $(this).trigger("appear"); 157 }); 158 } 159 }); 160 } 161 162 /* Force initial check if images should appear. */ 163 $(document).ready(function() { 164 update(); 165 }); 166 167 return this; 168 }; 169 170 /* Convenience methods in jQuery namespace. */ 171 /* Use as $.belowthefold(element, {threshold : 100, container : window}) */ 172 //判断图片是否在视口中 173 $.belowthefold = function(element, settings) { 174 var fold; 175 176 if (settings.container === undefined || settings.container === window) { 177 fold = (window.innerHeight ? window.innerHeight : $window.height()) + $window.scrollTop(); 178 } else { 179 fold = $(settings.container).offset().top + $(settings.container).height(); 180 } 181 182 return fold <= $(element).offset().top - settings.threshold; 183 }; 184 185 $.rightoffold = function(element, settings) { 186 var fold; 187 188 if (settings.container === undefined || settings.container === window) { 189 fold = $window.width() + $window.scrollLeft(); 190 } else { 191 fold = $(settings.container).offset().left + $(settings.container).width(); 192 } 193 194 return fold <= $(element).offset().left - settings.threshold; 195 }; 196 197 $.abovethetop = function(element, settings) { 198 var fold; 199 200 if (settings.container === undefined || settings.container === window) { 201 fold = $window.scrollTop(); 202 } else { 203 fold = $(settings.container).offset().top; 204 } 205 206 return fold >= $(element).offset().top + settings.threshold + $(element).height(); 207 }; 208 209 $.leftofbegin = function(element, settings) { 210 var fold; 211 212 if (settings.container === undefined || settings.container === window) { 213 fold = $window.scrollLeft(); 214 } else { 215 fold = $(settings.container).offset().left; 216 } 217 218 return fold >= $(element).offset().left + settings.threshold + $(element).width(); 219 }; 220 221 $.inviewport = function(element, settings) { 222 return !$.rightoffold(element, settings) && !$.leftofbegin(element, settings) && 223 !$.belowthefold(element, settings) && !$.abovethetop(element, settings); 224 }; 225 226 /* Custom selectors for your convenience. */ 227 /* Use as $("img:below-the-fold").something() or */ 228 /* $("img").filter(":below-the-fold").something() which is faster */ 229 230 $.extend($.expr[":"], { 231 "below-the-fold" : function(a) { return $.belowthefold(a, {threshold : 0}); }, 232 "above-the-top" : function(a) { return !$.belowthefold(a, {threshold : 0}); }, 233 "right-of-screen": function(a) { return $.rightoffold(a, {threshold : 0}); }, 234 "left-of-screen" : function(a) { return !$.rightoffold(a, {threshold : 0}); }, 235 "in-viewport" : function(a) { return $.inviewport(a, {threshold : 0}); }, 236 /* Maintain BC for couple of versions. */ 237 "above-the-fold" : function(a) { return !$.belowthefold(a, {threshold : 0}); }, 238 "right-of-fold" : function(a) { return $.rightoffold(a, {threshold : 0}); }, 239 "left-of-fold" : function(a) { return !$.rightoffold(a, {threshold : 0}); } 240 }); 241 242 })(jQuery, window, document);

           使用原生JS实现延迟加载的一个小例子,转自:http://js.fgm.cc/learn/lesson10/07.html,思路跟上面那个差不多,不过容易看懂的多。。。

      1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      2 <html xmlns="http://www.w3.org/1999/xhtml">
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      5 <title>延时加载</title>
      6 <style type="text/css">
      7 body,div,ul,li{margin:0;padding:0;}
      8 #box{width:770px;margin:0 auto;padding:10px 0 0 10px;background:#f00;overflow:hidden;zoom:1;}
      9 #box li{float:left;width:375px;height:225px;color:#fff;padding:10px 0;display:inline;text-align:center;margin:0 10px 10px 0;background:#000 url(img/lazy/loading.gif) 50% 50% no-repeat;}
     10 #box li img.loaded{width:353px;height:225px;vertical-align:middle;}
     11 </style>
     12 </head>
     13 <script type="text/javascript">
     14 var fgm = {
     15     on: function(element, type, handler) {
     16         return element.addEventListener ? element.addEventListener(type, handler, false) : element.attachEvent("on" + type, handler)
     17     },
     18     bind: function(object, handler) {
     19         return function() {
     20             return handler.apply(object, arguments)    
     21         }
     22     },
     23     pageX: function(element) {
     24         return element.offsetLeft + (element.offsetParent ? arguments.callee(element.offsetParent) : 0)
     25     },
     26     pageY: function(element) {
     27         return element.offsetTop + (element.offsetParent ? arguments.callee(element.offsetParent) : 0)    
     28     },
     29     hasClass: function(element, className) {
     30         return new RegExp("(^|\s)" + className + "(\s|$)").test(element.className)
     31     },
     32     attr: function(element, attr, value) {
     33         if(arguments.length == 2) {
     34             return element.attributes[attr] ? element.attributes[attr].nodeValue : undefined
     35         }
     36         else if(arguments.length == 3) {
     37             element.setAttribute(attr, value)
     38         }
     39     }
     40 };
     41 //延时加载
     42 function LazyLoad(obj) {
     43     this.lazy = typeof obj === "string" ? document.getElementById(obj) : obj;
     44     this.aImg = this.lazy.getElementsByTagName("img");
     45     this.fnLoad = fgm.bind(this, this.load);
     46     this.load();
     47     fgm.on(window, "scroll", this.fnLoad);
     48     fgm.on(window, "resize", this.fnLoad);
     49 }
     50 LazyLoad.prototype = {
     51     load: function() {
     52         var iScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
     53         var iClientHeight = document.documentElement.clientHeight + iScrollTop;
     54         var i = 0;
     55         var aParent = [];
     56         var oParent = null;
     57         var iTop = 0;
     58         var iBottom = 0;
     59         var aNotLoaded = this.loaded(0);
     60         if(this.loaded(1).length != this.aImg.length) {
     61             for(i = 0; i < aNotLoaded.length; i++) {
     62                 oParent = aNotLoaded[i].parentElement || aNotLoaded[i].parentNode;
     63                 iTop = fgm.pageY(oParent);
     64                 iBottom = iTop + oParent.offsetHeight;
     65                 if((iTop > iScrollTop && iTop < iClientHeight) || (iBottom > iScrollTop && iBottom < iClientHeight)) {
     66                     aNotLoaded[i].src = fgm.attr(aNotLoaded[i], "data-img") || aNotLoaded[i].src;
     67                     aNotLoaded[i].className = "loaded";
     68                 }
     69             }
     70         }
     71     },
     72     loaded: function(status) {
     73         var array = [];
     74         var i = 0;
     75         for(i = 0; i < this.aImg.length; i++)
     76         eval("fgm.hasClass(this.aImg[i], "loaded")" + (!!status ? "&&" : "||") + "array.push(this.aImg[i])");
     77         return array
     78     }
     79 };
     80 //应用
     81 fgm.on(window, "load", function () {new LazyLoad("box")});
     82 </script>
     83 <body>
     84 <ul id="box">
     85     <li><img src="img/lazy/none.gif" data-img="img/lazy/1.jpg" /></li>
     86     <li><img src="img/lazy/none.gif" data-img="img/lazy/2.jpg" /></li>
     87     <li><img src="img/lazy/none.gif" data-img="img/lazy/3.jpg" /></li>
     88     <li><img src="img/lazy/none.gif" data-img="img/lazy/4.jpg" /></li>
     89     <li><img src="img/lazy/none.gif" data-img="img/lazy/5.jpg" /></li>
     90     <li><img src="img/lazy/none.gif" data-img="img/lazy/6.jpg" /></li>
     91     <li><img src="img/lazy/none.gif" data-img="img/lazy/7.jpg" /></li>
     92     <li><img src="img/lazy/none.gif" data-img="img/lazy/8.jpg" /></li>
     93     <li><img src="img/lazy/none.gif" data-img="img/lazy/9.jpg" /></li>
     94     <li><img src="img/lazy/none.gif" data-img="img/lazy/10.jpg" /></li>
     95     <li><img src="img/lazy/none.gif" data-img="img/lazy/11.jpg" /></li>
     96     <li><img src="img/lazy/none.gif" data-img="img/lazy/12.jpg" /></li>
     97     <li><img src="img/lazy/none.gif" data-img="img/lazy/13.jpg" /></li>
     98     <li><img src="img/lazy/none.gif" data-img="img/lazy/14.jpg" /></li>
     99     <li><img src="img/lazy/none.gif" data-img="img/lazy/15.jpg" /></li>
    100     <li><img src="img/lazy/none.gif" data-img="img/lazy/16.jpg" /></li>
    101     <li><img src="img/lazy/none.gif" data-img="img/lazy/17.jpg" /></li>
    102     <li><img src="img/lazy/none.gif" data-img="img/lazy/18.jpg" /></li>
    103     <li><img src="img/lazy/none.gif" data-img="img/lazy/19.jpg" /></li>
    104     <li><img src="img/lazy/none.gif" data-img="img/lazy/20.jpg" /></li>
    105     <li><img src="img/lazy/none.gif" data-img="img/lazy/21.jpg" /></li>
    106     <li><img src="img/lazy/none.gif" data-img="img/lazy/22.jpg" /></li>
    107     <li><img src="img/lazy/none.gif" data-img="img/lazy/23.jpg" /></li>
    108     <li><img src="img/lazy/none.gif" data-img="img/lazy/24.jpg" /></li>
    109     <li><img src="img/lazy/none.gif" data-img="img/lazy/25.jpg" /></li>
    110     <li><img src="img/lazy/none.gif" data-img="img/lazy/26.jpg" /></li>
    111     <li><img src="img/lazy/none.gif" data-img="img/lazy/27.jpg" /></li>
    112     <li><img src="img/lazy/none.gif" data-img="img/lazy/28.jpg" /></li>
    113     <li><img src="img/lazy/none.gif" data-img="img/lazy/29.jpg" /></li>
    114     <li><img src="img/lazy/none.gif" data-img="img/lazy/30.jpg" /></li>
    115 </ul>
    116 </body>
    117 </html>
  • 相关阅读:
    【Alpha】开发日志Day30714
    【Alpha】开发日志Day10712
    实验1
    实验2
    图深度优先搜索最短路径
    一切都结束了
    C#操作XML(读XML,写XML,更新,删除节点,与dataset结合等)
    字符串匹配
    纯数学规律题
    高精度
  • 原文地址:https://www.cnblogs.com/missuu/p/3770769.html
Copyright © 2011-2022 走看看