JS 懒加载 瀑布流

//Util1.js

var Utils=(function () {
    return {
        //SSS
        loadImg:function (srcList,callBack) {
            var img=new Image();
            img.num=0;
            img.imgList=[];
            img.srcList=srcList;
            img.callBack=callBack;
            img.addEventListener("load",this.loadHandler);
            img.src="./img/"+srcList[img.num];

        },
        loadHandler:function (e) {
            // console.log(this.num);
            // console.log(this.imgList);
            // console.log(this.callBack);
            this.imgList.push(this.cloneNode(false));
            this.num++;
            if(this.num>=this.srcList.length){
                this.callBack(this.imgList);
                return;
            }
            //事件侦听没有被删除,只需更改src,加载后仍然触发了该事件,进入该函数
            this.src="./img/"+this.srcList[this.num];
        },
        ce:function (type,style) {
            var elem=document.createElement(type);
            Object.assign(elem.style,style);
            return elem;
        },
        randomColor:function () {
            var col="#";
            for(var i=0;i<6;i++){
                col+=Math.floor(Math.random()*16).toString(16);
            }
            return col;
        }
    }
})();
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/Utils1.js"></script>
</head>
<body>
    <script>
        /*
        *
        *  1\创建ul,创建li,创建指定数量的li,并且做浮动,设置各li的宽度
        *  2\创建一个数组,这个数组里面是统计每个li的当前高度
        *  3\创建图片,加载图片,设置图片宽度,获取图片高度
        *  4\寻找数组中最小高度的索引值,在li中找到这个索引值对应的列,
        *  5\将加载进来图片放入在这个列中并且累加高度存储在数组中对应的元素中
        *  6\继续加载新的图片,加载图片当数量都完成后,让数值归3
        *
        * */
        var bodyWidth,colWidth,ul,img;//可视化页面宽度    每个li的宽度
        let {ce,randomColor}=Utils;//解构赋值 将Utils中的 ce randomColor方法赋予 ce randomColor
        var minHeight=[],//最小高度
            position=3;//图片名,最小图片名为3
        const COL=5,//创建li的个数  有几列
              MARGIN=10;
        init();
        function init() {
            document.body.style.margin="0px";
            bodyWidth=document.documentElement.clientWidth;//可视化页面宽度
            //每个li的宽度
            colWidth=(bodyWidth-MARGIN*(COL-1))/COL;  
            createUl();//创建ul
            loadImage();//加载图片

        }
        
        function scrollHandler() {//滑动事件
        	//(页面内容高度-滚动隐藏到内容高度)<2*可视化窗口宽度
            if(document.documentElement.scrollHeight-document.documentElement.scrollTop<2*document.documentElement.clientHeight){
//                console.log("继续");
                window.removeEventListener("scroll",scrollHandler);//移除监听滚动
                addImage();//滚动到(页面内容高度-滚动隐藏到内容高度)<2*可视化窗口宽度  加图
            }
        }

        function createUl() {//创建ul
            ul=ce("ul",{
                listStyle:"none",
                margin:"0px",
                padding:"0px"
            });
            for(var i=0;i<COL;i++){//创建li
                var li=ce("li",{
                    marginLeft: i===0 ? "0px" : MARGIN+"px",
                    width:colWidth+"px",
                    float:"left"
                });
                minHeight.push(0);//往minHeight添加col(5)次最低高度0
                ul.appendChild(li);
            }
            document.body.appendChild(ul);
            window.addEventListener("resize",resizeUl)//window添加监听resize事件
        }
    
        
        function loadImage() {//加载图片
            img=new Image();
            img.addEventListener("load",loadHandler);
            img.src="./img611/"+position+"-.jpg"//图片路径
//            img.src=`./img/${position}-.jpg`;
        }
        
        function loadHandler(e) {//图片加载事件
            var img=this.cloneNode(false);//复制图片
            var scale=img.width/img.height;
//            图片有两个宽高,一个是样式宽高(放在body中以后才可以获取),另一个是图片宽高,不放在页面中也可以获取
            img.width=colWidth;
            img.height=colWidth/scale;
            var min=Math.min.apply(null,minHeight);//取数组minHeight的最小值
            var index=minHeight.indexOf(min);//找最小值的下标
            ul.children[index].appendChild(img);//给高度最小的li添加新图片
            minHeight[index]+=img.height;//minHeight数组更新添加图片li 的高度
            resizeUl();//重设ul,li,图片大小
			//(页面内容高度-滚动隐藏到内容高度)/可视化窗口高度     设置图片加载到 下方3倍自身可视化窗口的高度
            if((document.documentElement.scrollHeight-document.documentElement.scrollTop)/document.documentElement.clientHeight>=3){
                window.addEventListener("scroll",scrollHandler);//添加滚动监听事件
                return;
            }
            addImage();//正常加图    设置图片加载到 下方3倍自身可视化窗口的高度
        }

        function addImage() {
            position++;
            if(position>79){//可重复加载图片
                position=3;
            }
            img.src="./img611/"+position+"-.jpg";
        }
        
        function resizeUl() {//重设ul,li,图片大小
            if(bodyWidth===document.documentElement.clientWidth) return;//页面宽度和可视化窗口宽度一致返回(和上次页面大小一致)
//          console.log("aaaa");
            bodyWidth=document.documentElement.clientWidth;//重新获取可视化页面宽度
            //重新获取每一列宽度
            colWidth=(bodyWidth-MARGIN*(COL-1))/COL;
            for(var i=0;i<ul.children.length;i++){//li
                var li=ul.children[i];
                li.style.width=colWidth+"px";//重新赋予li宽度
                var sum=0;//记录每个li的高度
                for(var j=0;j<li.children.length;j++){
                    var img=li.children[j];
                    //计算图片宽高比,保持图片比例
                    var scale=img.width/img.height;
                    img.width=colWidth;
                    img.height=colWidth/scale;
                    sum+=img.height;//累加记录每个li的高度
                }
                minHeight[i]=sum;//记录每个li的高度
            }
        }
    </script>
</body>
</html>

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值