美文网首页
关于图片懒加载

关于图片懒加载

作者: Gnomo | 来源:发表于2017-10-16 10:54 被阅读11次

title: 关于图片懒加载
date: 2017-06-23 17:59:15
tags: 图片懒加载 lazyload


先po代码如下,

之后再做详细描述

------ emmmm 分割线 ------

现在来说说下面的懒加载的代码

(1)先说思路,所有图片元素img一开始当然是不显示的,辣么给他们的src属性全都值为空,或者全都置为一个default默认图片,在浏览器srcoll触发时,计算并判断img元素是否在当前屏幕可见区域内,在区域内的话,则onload图片。

(2) $.extend使用jquery的extend扩展方法,注意此处

$.extend用在全局对象 $.fn,extend用在实例对象

这里是扩展了全局对象的方法lazyImage,lazyImage里遍历所有图片元素,isView判断图片是否在可是区域内,loadThisImg是加载图片

;(function($){
    function loadThisImg($img){
        $img.attr("src",$img.attr("lazy-src"));
        $img[0].onload = function(){
            $img.removeClass("lazy-img");
        }
    }
    function isView($img,callback){
        var win_h = $(window).height(),
            sTop = $(window).scrollTop(),
            oTop = $img.offset().top,
            h = $img.outerHeight(true);
            if(sTop + win_h > oTop + h && sTop < oTop + h){
                callback($img);
            }
    }
    $.extend({
        lazyImage: function(){
            var lazys = $("body").find("img.lazy-img");
            if(lazys.length>0){
                var timer = null;
                $(window).on("scroll",function(){
                    clearTimeout(timer);
                    timer = setTimeout(function(){
                       lazys.each(function(index,item){
                            var _this = $(this);
                            if(_this.attr("src") !== _this.attr("lazy-src")){
                                isView(_this,loadThisImg);
                            }
                        })
                    },100)
                }).trigger("scroll");
            }
        }
    }) 
})(jQuery)

$.lazyImage();

(3)以上基本配合相应的css样式即可。但是又有一个新的问题,真正的瀑布流加载时,不仅要对图片懒加载,还要根据图像的显示对,元素布局。

可参考以下的代码片段,元素生成时计算图片列的位置。

//图集布局
$(function(){
    var _t = $('.image_box');
    var tuLayout = {
        getMinColumn:function(obj){
            /**
             * [_min 获取最小高度列]
             * @type {[type]}
             */
            var _min = obj[0],_index;
            $.each(obj,function(index,item){
                if(_min>=obj[index]){
                    _index = index;
                    _min = obj[index];
                }
            });
            return {"index":_index,"min":_min};
        },
        getMaxColumn:function(obj){
            /**
             * [_max 获取最大高度列]
             * @type {[type]}
             */
            var _max = obj[0],_index;
            $.each(obj,function(index,item){
                if(obj[index]>=_max){
                    _index = index;
                    _max = obj[index];
                }
            });
            return {"index":_index,"max":_max};
        }
    }
    tuLayout.init = function(){
            /**
             * [heightObj 记录每列高度]
             * @type {Object}
             */
            var heightObj = {};
            for(var n=0;n<5;n++){
                heightObj[n] = 0;
            }
            var items = $(".image_trunk").find("li");
            $.each(items,function(index,item){
                if(index%5==0){
                    for(var i=0;i<5;i++){
                        var min_index = tuLayout.getMinColumn(heightObj)["index"];
                            items.eq(index-(-i)).animate({
                                "top": heightObj[min_index],
                                "left": 245*min_index+"px"
                            });
                            heightObj[min_index] = parseInt(heightObj[min_index])-(-items.eq(index-(-i)).outerHeight(true));
                            items.eq(index-(-i)).css("position","absolute");
                    }
                }
                if(index===(items.length-1)){
                    var max_height = tuLayout.getMaxColumn(heightObj)["max"];
                        $(".image_trunk").css("height",max_height);
                        // tuLayout.lazyLoad();
                        $.lazyImage();
                }
            })
    }

    if(_t){
        var trunks = {imgs:[]};
            _t.append('<ul class="image_trunk"></ul>');

        var imageJson = $.trim(_t.find('.image_json').html());
        var _imageList = window.JSON ? JSON.parse(imageJson) : eval('(' + imageJson + ')');
            trunks.imgs = _imageList;
        //生成页面dom元素
        function trunksRenderToBox() {
            $.each(trunks.imgs, function (inx, img) {
                if (!img.appended) {
                    img.appended = true;
                    _t.find('.image_trunk').append('<li><a href="" title="">![](' + img.src + ')</a><a class="img_title">' + img.title + '</a><div class="img_time">' + img.time + '</div></li>');
                }
            });
        }
        //渲染dom样式
        trunksRenderToBox();
        //dom元素重新布局
        tuLayout.init();

    }

})

排列后如下图:

lazyload_demolazyload_demo

相关文章

  • 关于图片懒加载

    title: 关于图片懒加载date: 2017-06-23 17:59:15tags: 图片懒加载 lazylo...

  • 项目优化

    图片懒加载,数据懒加载, 路由懒加载 1.图片懒加载原理 1.1 开始时 不设置src属性 1.2 图片在可视区域...

  • JS

    JS 懒加载,预加载 概念:懒加载也叫延迟加载:JS图片延迟加载,延迟加载图片或符合某些条件时才加载某些图片。预加...

  • 图片懒加载

    懒加载与预加载的基本概念。 懒加载也叫延迟加载:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片。 预...

  • 图片懒加载

    图片懒加载 图片懒加载在一些图片密集型的网站中运用比较多,通过图片懒加载可以让一些不可视的图片不去加载,避免一次性...

  • js 实现图片懒加载

    一、懒加载 懒加载也叫延迟加载,Js中图片的延迟加载,延迟图片需要符合某些条件时才加载;对于图片过多的页面,为了加...

  • 图片懒加载和预加载

    图片懒加载的原理是什么? 首先明白为什么要懒加载: 懒加载即延迟,对于图片过多的页面,为了加快页面加载速度,我们需...

  • selenuim和phantonJs处理网页动态加载数据的爬取

    一.图片懒加载 什么是图片懒加载? 图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源...

  • 懒加载和瀑布流

    一、简述图片懒加载的实现原理 图片懒加载 若一开始,页面上有许多的图片要加载,而如果同时加载这么多图片,会消耗性能...

  • jquery懒加载、回到顶部

    1.知识点部分: 懒加载图片的原理是什么? 图片懒加载也称为曝光加载,将页面上的图片分批加载,只有当图片出现在wi...

网友评论

      本文标题:关于图片懒加载

      本文链接:https://www.haomeiwen.com/subject/nehoyxtx.html