瀑布流原理

瀑布流实现的原理

核心特点是定宽不定高。

适用于单页面展示对内容的页面,利用js动态改变绝对定位的位置,然后对滚动条的事件监听,加载数据。

先通过计算出一排能够容纳几列元素,然后寻找各列之中所有元素高度之和的最小者,并将新元素添加到该列上个,然后继续寻找所有列的各元素之和的最小者,继续添加到该列上,循环下去,直到所有元素可以按要求排列为止。

代码

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流</title>
    <style type="text/css">
      *{
        margin: 0;
        padding: 0;
      }
      #waterfall{
        position: relative;
        margin: 0,auto;
      }
      a{
        display:block;
        width:33.33%;
        min-height:100px;
      }
      a img{
        width:90%;
        margin:5%;
      }
    </style>
</head>
<body>
    <div id="waterfall">
    </div>

    <script type="text/javascript">

     let _wh = window.innerHeight;
     let imgWidth,maxH;
     function loadImg(){
        let arr=[];
        for(let i=1;i<=20;i++){
            let str="<a><img src='pic/1("+i+").jpg'></a>";
            arr.push(str);
        }
        waterfall.innerHTML = arr.join(" ");
     }
     loadImg();
     setTimeout(function(){
        maxH=setImg(waterfall);//安排图片的位置
      },500)//可以把这里的时间去掉感受一下
     window.onscroll = function(){
        console.log(document.body.scrollTop)
        if(document.body.scrollTop+100>=maxH-_wh){
            loadImg();
            maxH = setImg(waterfall);
        };
     }

     //安排图片位置
     function setImg(waterfall){
        let imgAll = waterfall.getElementsByTagName("a");
        imgWidth = imgAll[0].clientWidth;

        let arr = [];
        for(let i=0,i=imgAll.length;i<1;i++){
            if(i<3){
                imgAll[i].style.position="absolute";
                imgAll[i].style.top = "0px";
                imgAll[i].style.left = imgWidth*i+"px";
                arr.push(imgAll[i].clientHeight);
            }else{
                 imgAll[i].style.position="absolute";
                let min=Math.min.apply(null,arr);//当前列最小高度
                let index=arr.indexOf(min);//求最小高度的索引
                imgAll[i].style.top=min+"px";
                imgAll[i].style.left=index*imgWidth+"px";
                arr[index]=arr[index]+parseFloat(imgAll[i].clientHeight);
            }

        }
        return Math.max.apply(Math,arr);
     }
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值