学习资料_文档下载_软件应用_程序模板

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
查看: 5589|回复: 0

jQuery.lazyload使用及源码分析

[复制链接]

295

主题

297

帖子

787

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
787
发表于 2020-4-8 16:02:29 | 显示全部楼层 |阅读模式
前言:

貌似以前自己也写过图片懒加载插件,但是新公司使用的是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视口上方,左方及视口内(可以允许在视口下方,右方),则中断循环


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

HI223.COM 举报邮箱:345306361@qq.com

GMT+8, 2025-7-4 04:48 , Processed in 0.061227 second(s), 18 queries .

Powered by HI223分享社区 2.3

© 2019-2020 Hi223 All Right Reserved

渝公网安备 50022502000358号

渝ICP备14008270号-3