jquery实现图片按需延迟加载原理

为什么我们需要图片按需加载?

网站中的图片可以使网站添加不少"色彩", 但大量的图片会使我们打开的速度下降, 但我们又不得不用这些图的时候, 我们可以变相的加载这些图片, 常见与一些列表页啊, 或者大数据的主页啊, 或者 "全是图" 的页面, 那么这个图片加载就显着重要了, 比如 jd,taobao啥的都在用, 所以说 你并不孤单!

数据显示通过按需加载图片可以大大的提高网站的打开速度!

1, 首先我们得改变这些图片的HTML结构, 把图片的 src 换成一个 "1*1" 的透明的gif图片(不要说你不会做这个哦), 然后把图片的真实路径写到图片标签中的一个占位属性, 如: data-src="图片真实路径"; 这一步能保证页面在加载的时候每个图片只加载一个很小的图, 以保证打开速度, 因为真实的路径就没有在 src 属性上, 这里切记, src 不能给空!

2, 用js判断这个图片的位置,并给window绑定 scroll, resize 事件, 如果该图片可见则把真实占位的值替换到图片的 src 上,并删除占位的属性,

 代码如下 复制代码

var fn = function(){
    $("#id img").each(function() {//遍历所有图片
        var othis = $(this),//当前图片对象
            top = othis.offset().top - $(window).scrollTop();//计算图片top - 滚动条top
        if (top > $(window).height()) {//如果该图片不可见
            return;//不管
        } else {
            othis.attr('src', othis.attr('data-src')).removeAttr('data-src');//可见的时候把占位值替换 并删除占位属性
        }
    });
}
fn();
$window.scroll(fn).resize(fn);//绑定事件

以上代码摘自 八圆包, 但因让您看的更彻底改过源码, 不是 八圆包的源啊...

3, 其实你这现在就已经ok了, 但你会发现一些能优化的地方, 比如: js代码的优化啊,因为大量的执行 scroll 事件是很不帅的一件事,你得缓存+延迟下, 还有图片在加载中的时候给个loading, 没问题, 这个可以给这个img用css写个loading的背景gif图片;

 代码如下 复制代码

img.load{background:url('/images/loading.gif') no-repeat center center;}/*没有加载时loading的效果*/

4, 那个 $("#id img") 是图片选择器, 你可以给图片都加上 class , 然后用 $("img.loadImg") 等, 这样也更方便的只给需要延迟加载的图片加了;

注: 当你把这些玩的很熟的时候你就应该写成插件了, 另这个判断图片可见只是个简单的判断, 如果用户在加载完时直接按的键盘 end 键或者用户打开就在最小面, 那么你的图片一下子全部加载起来, 解决这个问题只需要在判断可见的时候再加深点判断即可, 代码如:

 代码如下 复制代码

if ($(window).scrollTop() + $(window).height() >= ($(this).offset().top) && ($(this).offset().top + $(this).height() >= $(window).scrollTop()) { //高级可见
}

是否对SEO有影响

没有影响的, 但要注意的是, 现在百度已经开始大量抓页面的图片, 建议在详情页的时候把产品/商品的首图不采用按需加载, 因为这样加载可能不会被seo/seo.html" target="_blank">搜索引擎捕获到;
网上插件的一个通病

看网上有不少实现图片加载的, 但很多没给出明确的改HTML代码的步骤, 只是用js操作, 经查看源码后发现, 都是在js里把图片的真实路径存起来,如图:

图片延迟加载

但经过控制台网络查看, 这样的会在你js执行之前的所有图片已经请求了, 也就是说没有达到优化的效果!

下面整理一个例子,大家看看

 代码如下 复制代码

//css
img.load{background:url('/iamges/loading.gif') no-repeat center center;}/*没有加载时loading的效果*/

/**
 * @name 图片懒加载插件
 * @description jQuery扩展插件,可制作滚动加载,点击加载等,依赖msc,jQuery,msc.event,目前只对window上操作
 * @version 1.0
 * @author xieliang
 * @demo
 *     1, 延迟加载
 *         $("#id img.imgLoad").imgLoad();//默认真实图片路径在 data-src 里, 默认为淡入
 *     2, 修改真实图片路径
 *         $("img.imgLoad").imgLoad({attr:"data-img-src"});
 *     3, 修改淡入效果
 *         $("img").imgLoad({effect:"show"});//没有淡入效果
 *     4, 自定义事件
 *         $("img").imgLoad({event:"xieliang"});//定义事件名
 *         在需要的地方 $("img").trigger("xieliang");//触发加载
 *     5, 设置屏幕偏移, 支持 正,负
 *         $("img").imgLoad({threshold:-100});
 */
;(function(a) {
    "use strict";
    a.fn.imgLoad = function(config) {
        var self = this;
        if (!self.length || self[0].nodeName.toLowerCase() !== "img") {//如果选择器没有 或者 不是图片则返回自己www.111cn.net
            return self;
        };
        var conf = a.extend({}, a.fn.imgLoad.defaults, config || {});//合并
        var cache = {};//存放图片对象
        var imgLength = self.length;//总图片个数
        var imgI = 0;//已加载的图片个数
        if ("scroll" === conf.event) {//如果是滚动事件
            var scroll = new msc.event("scroll", 0);//创建0延迟的滚动
            scroll.add("imgLoad", function(obj) {
                for (var item in cache) {//运行图片对象缓存
                    // if (obj.scrollTop + obj.height >= (cache[item].offset().top + conf.threshold)) {//如果该图片可见
                    if (obj.scrollTop + obj.height >= (cache[item].offset().top + conf.threshold) && (cache[item].offset().top+cache[item].height() >= obj.scrollTop)) {//高级可见
                        cache[item].trigger("imgLoad");//触发当前图片的加载事件
                    };
                };
                if (imgI >= imgLength) {//如果已加载大于等于总数
                    imgLength = imgI = cache = null;//清
                    msc.event.resize.remove("imgLoad");//移除resize事件
                    return false;//返回false移除scroll事件
                };
            });
            msc.event.resize.add("imgLoad", function() { //设置resize时触发事件
                scroll.trigger("imgLoad");
            });
            setTimeout(function() {
                scroll.trigger("imgLoad"); //默认加载触发下,解决可能滚动条加载完成时不在顶部而不加载图片
            }, 50);
        };
        return self.each(function(i) {//遍历所有图片
            var $img = $(this);
            cache[i] = $img;//把图片填进缓存
            $img.one("imgLoad",//绑定一次性事件
                function() {
                    if(!this['_imgLoad']){//为了配合tab组件可防止重复加载
                        this['_imgLoad'] = 1;
                        $("<img />").bind("load",//创建个img来预加载
                        function() {
                            $img.hide().attr("src", $img.attr(conf.attr))[conf.effect]().removeAttr(conf.attr);//显示该图片
                        }).attr("src", $img.attr(conf.attr));
                    }
                    delete cache[i];//删除缓存里的
                    imgI++;//让已加载数自增下
                });
            if ("scroll" !== conf.event) {//如果不是滚动事件
                $img.one(conf.event,//绑定一次性事件触发
                    function() {
                        if (cache[i]) {//如果缓存存在则视为没有加载
                            cache[i].trigger("imgLoad");//触发加载
                        };
                    });
            };
        });
    };

    a.fn.imgLoad.defaults = { //默认配置
        attr: "data-src",//连接占位
        effect: "fadeIn",//效果
        event: "scroll",//事件
        threshold:0//偏移,可为正/负数
    };
}(jQuery));

时间: 2024-10-31 06:34:46

jquery实现图片按需延迟加载原理的相关文章

jQuery实现图片走马灯效果的原理分析_jquery

本文实例分析了jQuery实现图片走马灯效果的原理.分享给大家供大家参考,具体如下: 这里只讲解水平走马灯效果,垂直向上走马灯效果不讲解,原理一样,但是水平走马灯效果有一个小坑.待会讲解 先上代码: HTML: <div class="box"> <div style="width: 1000px;" id="boxdiv"> <ul> <li style="display: block;&qu

jquery.lazyload 图片延迟加载实例

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-

Jquery实现图片的预加载与延时加载

 有很多项目经常会需要判断图片加载完成后执行相应的操作,或者需要图片延迟加载,网上虽然已经有很不错的插件,但要为这些效果还得单独加载一个插件的话总感觉有点不舒服,干脆自己写了个方法:  代码如下    function loadimg(arr,funLoading,funOnLoad,funOnError){  var numLoaded=0,  numError=0,  isObject=Object.prototype.toString.call(arr)==="[object Object

Jquery实现图片预加载与延时加载的方法_jquery

本文实例讲述了Jquery实现图片预加载与延时加载的方法.分享给大家供大家参考.具体分析如下: 有很多项目经常会需要判断图片加载完成后执行相应的操作,或者需要图片延迟加载,网上虽然已经有很不错的插件,但要为这些效果还得单独加载一个插件的话总感觉有点不舒服,干脆自己写了个方法: 复制代码 代码如下: function loadimg(arr,funLoading,funOnLoad,funOnError){  var numLoaded=0,  numError=0,  isObject=Obje

jquery制作图片时钟特效_jquery

一.生成数字时钟 <script src="http://code.jquery.com/jquery-latest.js"></script> <script> window.onload=function(){ var oBody=document.body; var oP=document.getElementById("time"); setInterval(fnTime,1000); fnTime(); function

超酷的jQuery百叶窗图片滑块实现教程

原文:超酷的jQuery百叶窗图片滑块实现教程 今天我们要来分享一款基于jQuery的百叶窗焦点图插件,也可以说是图片滑块插件.这种jQuery焦点图插件的应用非常广泛,在早些年前,我们需要用flash来完成这种百叶窗的效果.如今我们可以用jQuery来实现这个动画效果.这款jQuery百叶窗焦点图不仅可以横向切换,也可以垂直切换,效果都非常不错. 你也可以在这里查看在线演示 下面我们来简单解说一下实现这款jQuery百叶窗焦点图的过程和代码,代码主要由HTML.CSS以及jQuery组成,实现

基于jquery实现图片上传本地预览功能_jquery

当我们在上传文件时如果每次都要上传到服务器才可以预览这个做看上合理其实是不合理的,如果网速慢或图片有问题,这样不但浪费客户时间同时也浪费服务器资源了,下面我们介绍利用js上传图片时本地实现预览,希望此方法对各位有所帮助哦.一.原理 分为两步: 当上传图片的input被触发并选择本地图片之后获取要上传的图片这个对象的URL(对象URL): 把对象URL赋值给事先写好的img标签的src属性即可把图片显示出来. 在这里,我们需要了解Javascript里File对象.Blob对象和window.UR

一款基于jQuery的图片场景标注提示弹窗特效_jquery

今天给大家分享一款基于jQuery的图片场景标注提示弹窗特效,这款实例适合在图片上标注某个物件,单击弹出详情说明,兼容360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗,不支持IE8及以下浏览器.效果非常不错.效果如下: 实现的过程. 这款实例要引用jquery和jquery ui库,还有一个实现的main.js库.需上的朋友可以点击上现的下载按钮下载来看看. html代码部分: 复制代码 代码如下: <div class="container"

jquery实现图片预加载_jquery

使用jquery实现图片预加载提高页面加载速度和用户体,本就为大家详细分析jquery图片预加载的实现原理. 什么时候使用图片预加载? 如果页面使用了很多不是最初加载便可见的图片,有必要进行预加载: $.preloadImages = function () { for (var i = 0; i < arguments.length; i++) { $('img').attr('src', arguments[i]); } }; $.preloadImages('img/hover-on.pn