瀑布流

整体效果:

​随着浏览器的宽度变小每次随着列数改变方块的位置改变,但不会有空隙.

1.整体给一个容器用来装所有的内容,整体容器始终在屏幕居中
2.每一列的高度是随机的分配的,(不固定).
3.不论怎样变化块与块之间的间距是不变的,同时距离左边整体有固定的距离
4.根据整体宽度,求出随着宽度的改变每一行的块数是多少,因为每一小块的宽度是固定的
5.根据没一小块的宽度求出整体容器的宽度,(有了宽度才可以使整体居中)
6.给定每一列的初始高度(创建一个保存列高度的数组)
7.给定块的个数(将个数作为参数)
8.一个一个创建每个小块
9.将保存小块的数组给定下标
10.随机生成高度并依次添加到保存高度的数组上
11.为了使空间不浪费,依次寻找每一行中的最短列
12.将元素依次加入
13.求出元素距左边的距离,和距上边的距离将元素定位到指定位置
14.每填完一个元素更新最小值列
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            #flow{
                list-style: none;
                position: relative;
                margin: 0 auto;

            }
            #flow li{
                width: 200px;
                background-color: lightpink;
                position: absolute;
                font-size: 50px;
                transition: 1s;
            }
        </style>
    </head>
    <body>
        <ul id="flow">
        </ul>


        <script type="text/javascript">
            //随机高度的函数
            function randH (min,max) {
                return parseInt(Math.random()*(max-min+1)+min);
            }
            var ul = document.getElementById("flow");
            var leftSpace = 10;//左间距
            var paddingSpace = 10;//li间距
            var hs = [];
            function layout (bol) {
                var lis = document.getElementsByTagName("li");
                //列数
                var cols = parseInt(document.documentElement.clientWidth/200);
                //大水杯(ul)的宽度
                ul.style.width = cols*200+paddingSpace*(cols-1)+leftSpace+"px";
                //保存列高度的数组
                var arrH = [];
                for (var i = 0;i < cols;i++) {
                    arrH[i] = 10;//每一列的初始高度
                }
                function creatLi (index) {
                    var li = lis[index] || document.createElement("li");
                    //将下标赋给li
                    li.innerHTML = index;
                    //随机生成高度
                    var h = hs[index] || randH(100,300);
                    li.style.height = h + "px";
                    if (bol) {
                        //往高度数组添高度
                        hs.push(h);
                    }
                    //找最短列
                    var minl = 0;//最短列的列号
                    var minH = arrH[0];//最短列的高度
                    for (var i = 0;i < arrH.length;i++) {
                        if (minH > arrH[i]) {
                            minH = arrH[i];
                            minl = i;
                        }
                    }
                    //求left值
                    var l = leftSpace + (200+paddingSpace)*minl;
                    li.style.left = l + "px";
                    //求top值
                    var t = arrH[minl] + paddingSpace;
                    li.style.top = t + "px";

                    bol && ul.appendChild(li);
                    //更新最小值列
                    arrH[minl] = arrH[minl] + li.offsetHeight + paddingSpace;
                }
                //循环创建li
                for (var i=0;i<30;i++) {
                    creatLi(i);
                }
            }


            layout(true);window.onresize = function () {
                layout(false);
            }


        </script>

    </body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值