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

网站中的图片可以使网站添加不少"色彩", 但大量的图片会使我们打开的速度下降, 但我们又不得不用这些图的时候, 我们可以变相的加载这些图片, 常见与一些列表页啊, 或者大数据的主页啊, 或者 "全是图" 的页面, 那么这个图片加载就显着重要了, 比如 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));
Copyright © 2014-2024 it689.com (京ICP备12032795号-2) 版权所有 Power by IT689