JavaScript瀑布流

瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布局的网站是Pinterest,逐渐在国内流行开来。

    <style>
        .flowul{
            position:relative;
            min-width:200px;
        }
        .flowul li{
            margin:0;
            padding:0;
            list-style-type:none;
            position:absolute;
            margin-bottom:10px;
            font-size:30px;
            text-align:center;
            color:black;
        }
    </style>
    <ul class="flowul"></ul>
    <script>
        var flowul=document.querySelector(".flowul");
        var window_W;//定义窗口的宽度
        var col;//定义列数
        var old;//定义现在的列数
        var arr=[];

        getWidth();
        old=col;//先给其一个当前的列数

        function getWidth(){
            arr=[];
            window_W=document.body.currentStyle?document.body.currentStyle.width:getComputedStyle(document.body,[]).width;//根据浏览器类型,选择合适的代码获取宽度
            window_W=parseInt(window_W);
            col=parseInt((window_W-30)/400);
            flowul.width=col*210-10+"px";
            for(i=0;i<col;i++){
                arr.push(0);
            }
        }

        //开始循环,排列出来所需要的li(及其个数)
        for(var i=0;i<20;i++){
            var newLi=document.createElement("li");
            newLi.style.width=200+"px";
            newLi.style.backgroundColor="rgb("+getRandom(0,255)+","+getRandom(0,255)+","+getRandom(0,255)+")";
            newLi.innerHTML=i+1;
            var newHeight=getRandom(150,300);
            newLi.style.height=newHeight+"px";
            newLi.style.lineHeight=newHeight+"px";
            //判断数组最小值及其对应下标            
            var minH=arr[0];
            var minNum=0;
            for(var j=1;j<arr.length;j++){
                if(minH>arr[j]){
                    minH=arr[j];
                    minNum=j;
                }
            }
            newLi.style.left=minNum*210+"px";
            newLi.style.top=arr[minNum]+"px";
            flowul.appendChild(newLi);
            arr[minNum]+=newHeight+10;
        }
        ulHeight();
        //当浏览器宽度发生改变时,对li重新定位
        window.onresize=function(){
            getWidth();
            if(old==col){
                return;//当列数没有发生改变时,跳出
            }else{
                old=col;
            }
            //通过循环改变li的位置
            for(var i=0;i<20;i++){
                var lis=document.querySelectorAll(".flowul li");
                lis[i].style.transitionDuration="3s";
                var newHeight=parseInt(lis[i].style.height);
                var minH=arr[0];
                var minNum=0;
                for(var j=1;j<arr.length;j++){
                    if(minH>arr[j]){
                        minH=arr[j];
                        minNum=j;
                    }
                }
                lis[i].style.left=210*minNum+"px";
                lis[i].style.top=arr[minNum]+"px";
                arr[minNum]+=newHeight+10;
            }
            ulHeight();            
        }
        function ulHeight(){
            var maxH=arr[0];
            var maxNum=0;
            for(var j=1;j<arr.length;j++){
                if(minH<arr[j]){
                    maxH=arr[j];
                    maxNum=j;
                }
            }
            flowul.style.height=arr[maxNum]+"px";
        }
        function getRandom(min,max){
            return Math.round(Math.random()*(max-min)+min);
        }
    </script>