前言: 貌似以前自己也写过图片懒加载插件,但是新公司使用的是jQuery.lazyload插件,为了更好的运用,自己还是把源码看了遍,分别记录了如何使用, 插件原理,各个配置属性的完整解释,demo实例,源码分析(较简短),源码分析可以配合使用,配置属性,原理进行阅读,如需转载,请注明出处 博客园 华子yjh
一、如何使用// 最简单的使用,不带参数$('img').lazyload();// 带参数(配置对象),下面配置对象中的各个属性值都是默认的$('img').lazyload({ threshold : 0, failure_limit : 0, event : "scroll", effect : "show", container : window, data_attribute : "original", skip_invisible : true, appear : null, load : null, placeholder : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"});
二、内部原理首先选中的img元素都绑定了一个appear事件(处理img显示真实的图片地址),方便以后满足条件时触发该事件;
在配置对象中有一个container属性配置,默认为window,如果img元素在该container容器视口中,则触发appear事件;
为了判断img元素是否在container容器视口范围中,造了如下四个轮子: $.belowthefold = function(element, settings) {}; // 在视口下方$.rightoffold = function(element, settings) {}; // 在视口右方$.abovethetop = function(element, settings) {}; // 在视口上方$.leftofbegin = function(element, settings) {}; // 在视口左方
看看源码中是如何利用这四个轮子: if ($.abovethetop(this, settings) || $.leftofbegin(this, settings)) { /* Nothing. */}// 不满足在上方,左方;也不满足在下方,右方; 则触发appear事件else if (!$.belowthefold(this, settings) && !$.rightoffold(this, settings)) { $this.trigger("appear");}
三、配置对象中的其他属性临界值,这个值是针对container容器的,即距离container容器视口的临界值 { threshold: 0}
事件,container容器默认绑定这个事件,在这个事件被触发时,会不断的判断img元素是否满足触发appear的条件,
因此当浏览器不停的滚动下来时,如果满足条件,则显示图片; 另外还有一点,如果这个事件不是scroll事件,则选中的img元素都会绑定这个事件,绑定的这个事件中同样会触发内部appear事件; { event: 'scroll'}
显示方法,默认为show,也可以设置为fadeIn,API中隐藏了一个配置属性effectspeed,动画运行的时间 { effect: "show"}
img元素的一个data属性,用于存放图片的真实地址 { data_attribute: "original",}
忽略隐藏的img元素 { skip_invisible: true}
图片占位符,img元素默认src属性为1*1像素的透明图片 { placeholder: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"}
在img触发appear事件时执行的回调 { appear: null}
在img触发load事件时执行的回调 { load: null}
最后一个配置属性failure_limit { failure_limit: 0}
为了便于理解,我们先来看一段与其有关的源码: var counter = 0;elements.each(function() { if ($.abovethetop(this, settings) || $.leftofbegin(this, settings)) { // ... } else if (!$.belowthefold(this, settings) && !$.rightoffold(this, settings)) { // ... } else { if (++counter > settings.failure_limit) { return false; } }});
什么意思呢,如果找到的是第 failure_limit 个img元素,且不在container视口上方,左方及视口内(可以允许在视口下方,右方),则中断循环
|