图片延迟加载

工作需要写了一个简单的图片延迟加载 【效果预览

大概思路如下:

获取所有需要延迟加载的图片,根据位置进行排序,触发滚动条或window窗口大小的时候判断哪些图片在当前可见区域,以此类推,完毕之后删除事件,完成。

写代码的时候大概思路如下:

1、默认给需要延迟的图片src设置成一张1px的透明gif图片,把图片路径存储到img的一个叫"_src"的属性当中(属性名自定义)。

2、给需要延迟加载的图片一个标识,我这里用的一个class叫"loadImg"的名字。

3、获取所有标识的对象,然后根据其位置进行排序。这个方法可以参考源代码里边初始化时候的sortNumber方法。这个是用来排序的,其中tool.getPos()是用来获取元素位置的。tool.getPos方法算出的坐标并非兼容所有情况,一般是可行的。计算元素坐标的方法比较复杂,我一般粗略估算的,如果一定要细化可以参考jquery源代码里头的offset的实现方法。

4、给滚动和窗口大小变化绑定事件,并把数组里头符合条件的图片清除。

 

html部分:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
<title>getElePosition</title>
<meta charset="utf-8" />
<style type="text/css">
*
{margin: 0;padding: 0;}
body
{background: #ccc;}
img
{display:block;}
.loadImg
{background: url(http://preview.zcool.com.cn/upimg/allimg/070622/05043120.gif) no-repeat center;}
</style>
</head>
<body>
<img class="loadImg" src="http://www.js63.net/demo/js/2012/3/transparent.gif" width="550" height="400" _src="http://deskcity.com/picture/image_url/84384/Concept_028019.jpg?1309370822" alt="" />
<img class="loadImg" src="http://www.js63.net/demo/js/2012/3/transparent.gif" width="550" height="400" _src="http://deskcity.com/picture/image_url/84366/Concept_028001.jpg?1309370284" alt="" />
<img class="loadImg" src="http://www.js63.net/demo/js/2012/3/transparent.gif" width="550" height="400" _src="http://deskcity.com/picture/image_url/84367/Concept_028002.jpg?1309370338" alt="" />
<img class="loadImg" src="http://www.js63.net/demo/js/2012/3/transparent.gif" width="550" height="400" _src="http://deskcity.com/picture/image_url/84368/Concept_028003.jpg?1309371571" alt="" />
<img class="loadImg" src="http://www.js63.net/demo/js/2012/3/transparent.gif" width="550" height="400" _src="http://deskcity.com/picture/image_url/84369/Concept_028004.jpg?1309370717" alt="" />
<img class="loadImg" src="http://www.js63.net/demo/js/2012/3/transparent.gif" width="550" height="400" _src="http://deskcity.com/picture/image_url/84371/Concept_028006.jpg?1309370735" alt="" />
<img class="loadImg" src="http://www.js63.net/demo/js/2012/3/transparent.gif" width="550" height="400" _src="http://deskcity.com/picture/image_url/84372/Concept_028007.jpg?1309370744" alt="" />
<img class="loadImg" src="http://www.js63.net/demo/js/2012/3/transparent.gif" width="550" height="400" _src="http://deskcity.com/picture/image_url/84373/Concept_028008.jpg?1309370757" alt="" />
<img style="position:absolute;left:0px;top:25px;" class="loadImg" src="http://www.js63.net/demo/js/2012/3/transparent.gif" width="550" height="400" _src="http://deskcity.com/picture/image_url/84374/Concept_028009.jpg?1309370761" alt="简便文件上传" />
</body>
</html>


js部分:

var tool={
            $:function(id){
                return typeof id==="object"?id:document.getElementById(id)
            },
            $$:function(tagName,oParent){
                return(oParent||document).getElementsByTagName(tagName)
            },
            $$$:function(className,tagName,elem){
                var i=0,aClass=[],
                    reClass=new RegExp("(^|\\s)"+className+"(\\s|$)"),
                    aElement=tool.$$(tagName||"*",elem||document);
                for(i=0;i<aElement.length;i++)
                    reClass.test(aElement[i].className)&&aClass.push(aElement[i]);
                return aClass
            },
            addClass:function(elem,value){
                !elem.className ? elem.className = value : elem.className += " " + value
            },
            removeClass:function(elem,className){
                var reg=new RegExp('(\\s|^)'+className+'(\\s|$)');
                var ematch=elem.className.match(reg);
                if(ematch)elem.className=elem.className.replace(reg,' ')
            },
            addHandler:function(ele,type,handler){ //
                    var list = {a:["addEventListener","attachEvent"],r:["removeEventListener","datachEvent"]};
                    var name = arguments[3]===true ? list["r"]:list["a"];
                    if(ele[name[0]]){
                        ele[name[0]](type,handler,false)
                    }else if(ele.attachEvent){
                        document.title = name[1];
                        ele[name[1]]("on"+type,handler);
                    }else{
                        var handler = arguments[3]===true ? handler : null;
                        ele["on"+type] = handler;
                    }
                },
                removeHandler:function(ele,type,handler){//
                    this.addHandler(ele,type,handler,true);
                },
                getPos:function(ele){
                       if(!ele)return;
                       var left = 0,top = 0;
                       if("getBoundingClientRect" in document.documentElement){
                            var box = ele.getBoundingClientRect(),
                            doc = ele.ownerDocument,
                            body = doc.body,
                            docElem = doc.documentElement,
                            clientTop = doc.clientTop || body.clientTop || 0,
                            clientLeft = doc.clientLeft || body.clientLeft || 0 ,
                            left = box.left + (self.pageXOffset || docElem  && docElem.scrollLeft || body.scrollTop) - clientLeft,
                            top = box.top + (self.pageYOffset || docElem && docElem.scrollTop || body.scrollTop) - clientTop;
                        }else{
                            do{
                                top+=ele.offsetTop,
                                left+=ele.offsetLeft,
                                ele = elel.offsetParent;
                            }while(ele)
                        };
                        return {left:left,top:top}
                },
                getW:function(){
                    var client_h,client_w,scrollTop;
                    client_h = document.documentElement.clientHeight || document.body.clientHeight;5
                    client_w = document.documentElement.clientWidth || document.body.clientWidth;
                    scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
                    return o = {w:client_w,h:client_h,s:scrollTop};
                }
        }

        //lazyLoadImg Object
        var lazyLoadImg = {
            init:function(cName){
                var that = this;
                that.timer = null;
                that.cName = cName;
                that.imgList = tool.$$$(that.cName,"img");
                for(var i = 0,l = this.imgList.length;i<l;i++){
                    var c = this.imgList[i];
                    c.t = tool.getPos(c)["top"];
                };
                function sortNumber(a,b){                    
                    return a["t"] -b["t"];
                };                
                this.imgList.sort(sortNumber);
                
                that.setLoad();
                that.oldScroll = window.onscroll;
                that.oldResize = window.onresize;
                if(typeof that.oldScroll=="function"){
                    window.onscroll = function(){
                        that.oldScroll();
                        that.timeLoad();
                    };    
                }else{
                    window.onscroll = function(){
                        that.timeLoad();
                    };        
                };
                if(typeof that.oldResize == "function"){    
                    window.onresize = function(){
                        that.oldResize();
                        that.timeLoad();    
                    }
                }else{
                    window.onresize = function(){
                        that.timeLoad();    
                    }                        
                };
            },
            unBind:function(){
                var that = this;            
                if(typeof that.oldScroll=="function"){
                    window.onscroll = function(){
                        that.oldScroll();
                    };        
                }else{
                    window.onscroll = null;
                };
                if(typeof that.oldResize == "function"){    
                    window.onresize = function(){
                        that.oldResize();                        
                    }
                }else{
                    window.onresize =null;    
                };
            },
            timeLoad:function(){
                 var that = this;
                 lazyLoadImg.timer = setTimeout(function(){
                   lazyLoadImg.setLoad();
                 },100);
            },
            setLoad:function(){                
                var win = tool.getW(),c_h = win.h+win.s,that = this,l=this.imgList.length;       
                if(l<=0){
                    that.unBind();        
                };    
                for(var i = 0;i<l;i++){
                    var nowImg = this.imgList[i];                        
                    if(nowImg.t <= c_h){
                         nowImg.src = nowImg.getAttribute("_src");
                         tool.removeClass(nowImg,that.cName);    
                     }else{
                        this.imgList.splice(0,i);
                        break;
                        return ;
                     };             
                };
            }
        };
        //test
        function showMsg(a){
            document.title = a;
        };
        //initlazyLoadImg.init("loadImg");

 

posted on 2012-03-28 15:50  向我开炮  阅读(206)  评论(0编辑  收藏  举报