瀑布流3

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>瀑布流</title>
    <style>
    *{
        padding: 0;
        margin: 0;
    }
    </style>
</head>
<body>
<script>
    // 思路: 先实现ul  col 个li  预加载每一张图片, 加载后将图片添加到对应的li 修改存储高度的数组,继续加载下一张图片
    // document.documentElement.clientWidth 获取的值是 经过四舍五入后的值
    let ul;
    let bodyWidth;
    const col = 5;
    const GAP = 5;
    let heightlist = [];
    // 最小图片 
    let num = 2;
    // 最大图片
    const MAX = 79;
    init()
    function init() {
        ul = document.createElement('ul');
        Object.assign(ul.style,{
            margin:'0px',
            fontSize:'0px',
            padding:'0px',
            listStyle:'none',
            width:'100%',
        })
        for(let i =0;i<col;i++){
            let li = document.createElement('li');
            Object.assign(li.style,{
                width:(document.documentElement.clientWidth-1-(col-1)*GAP)/col+'px',
                // height:'2000px',
                marginLeft:i===0?0:GAP+'px',
                float:'left',
                // backgroundColor:'red',
            })
            ul.appendChild(li);
            // 初始值为0;
            heightlist.push(0);
        }
        document.body.appendChild(ul);
        resizeHandler();
        window.addEventListener('resize',resizeHandler);
        // 新增
        window.addEventListener('scroll',scrollHandler);
        // 加载图片,一个加载完在加载一个新的
        loadImage('./img/'+num+'-.jpg');
    }
    // 当 满足条件 继续加载
    function  scrollHandler(e) {
        if((document.body.scrollHeight-document.documentElement.scrollTop) < 2*document.documentElement.clientHeight){
            loadImage('./img/'+num+'-.jpg');
        }
    }
    // function loadHandler(src){
        // 加载完后 就会执行then 方法
        // loadImage(src).then((img)=>{
        //     let min = Math.min.apply(null,heightlist);
        //     let idx = heightlist.indexOf(min);
        //     ul.children[idx].appendChild(img);
        //     img.style.width = '100%';
        //     img.style.marginBottom = GAP +'px';
        //     // 一开始没有滚动条,后面滚动条出现,宽度改变
        //     // 每次加载完图片之后,要判断当前宽度是否改变,如果改变则重新改变宽度;
        //     if(document.documentElement.clientWidth !== bodyWidth){
        //         resizeHandler();
        //     }
        //     heightlist[idx] += (img.height+GAP);
        //     num++;
        //     if(num>MAX)return;
        //     loadHandler('./img/'+num+'-.jpg');
        // })
    // }
    // function  loadImage(src) {
    //    return new Promise((res,rej)=>{
    //        let img = new Image();
    //        img.src = src;
    //        img.onload = function () {
    //             res(img);
    //        }
    //    })
    // }
    function loadImage(src) {
        let img = new Image();
        img.addEventListener('load',loadHandler);
        img.src = src;
    }
    function loadHandler(e) {
        // 加载后,找到数组中的最小值,及最小值的索引,然后将img添加到对应索引li上,并且修改数组的高度;
        let min = Math.min.apply(null,heightlist);
        let idx = heightlist.indexOf(min);
        // 设置宽 及marginBottom
        this.style.width = '100%';
        this.style.marginBottom = GAP+'px';
        ul.children[idx].appendChild(this);
        if(document.documentElement.clientWidth !== bodyWidth){
            resizeHandler();
        }
        // 图片高度:img.height + marginBottom;
        heightlist[idx] += (this.height+GAP);
        // 继续加载下一张
        num++;
        // 当num的值大于MAX时,重新赋值
        if(num>MAX) num=2;
        // 当满足条件时 停止加载
        if(document.body.scrollHeight>2*document.documentElement.clientHeight) return;
        loadImage('./img/'+num+'-.jpg');
    }
    // function loadHandler(e) {
    //     // 加载后,找到数组中的最小值,及最小值的索引,然后将img添加到对应索引li上,并且修改数组的高度;
    //     let min = Math.min.apply(null,heightlist);
    //     let idx = heightlist.indexOf(min);
    //     // 设置宽 及marginBottom
    //     this.style.width = '100%';
    //     this.style.marginBottom = GAP+'px';
    //     ul.children[idx].appendChild(this);
    // if(document.documentElement.clientWidth !== bodyWidth){
    //     resizeHandler();
    // }
    //     // 图片高度:img.height + marginBottom;
    //     heightlist[idx] += (this.height+GAP);
    //     // 继续加载下一张
    //     num++;
    //     // 当num的值大于MAX时,退出
    //     if(num>MAX) return;
    //     loadImage('./img/'+num+'-.jpg');
    // }
    function resizeHandler(e) {
        bodyWidth = document.documentElement.clientWidth;
        for(let i =0;i<ul.children.length;i++){
            ul.children[i].style.width = (document.documentElement.clientWidth-1-(col-1)*GAP)/col+'px';
        }
    }

</script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值