Js实现瀑布流

2019-07-24  本文已影响0人  光头小青蛙
1.使用原生js实现瀑布流效果,demo地址(https://xukeler.github.io/waterfall/
2.思路
3.由以上思路可以确定一个大概的方向,首先要封装一个随机函数,用来生成随机数。
 function random(a, b) {
            return parseInt(Math.random() * (a - b + 1) + b) //随机函数数b-a范围
        }
4.用一个数组记录高度和列数
let arr = [{
            h: 0,//每一列的高度记录
            col: 0//当前列数以索引记录
        }, {
            h: 0,
            col: 1,
        },
        {
            h: 0,
            col: 2
        }
    ]
5.css代码
 html,
        body {
            height: 100%;
        }

        * {
            padding: 0;
            margin: 0;
        }

        #app {
            width: 1200px;
            margin: 0 auto;
            position: relative;
        }

        #app div {
            width: 380px;
            position: absolute;
            text-align: center;
            color: white;
        }
6.html代码
 <div id="app">

    </div>
7.js代码
let arr = [{
            h: 0,//每一列的高度记录
            col: 0//当前列数以索引记录
        }, {
            h: 0,
            col: 1,
        },
        {
            h: 0,
            col: 2
        }
    ]
    let app = document.getElementById("app");

    function water() {
        let colorStr = "0123456789abcde";

        function random(a, b) {
            return parseInt(Math.random() * (a - b + 1) + b) //随机函数数
        }

        for (let i = 0; i < 30; i++) { //每次添加多少个标签
            let str="#";
            for (let j = 0; j < 6; j++) {//for循环通过随机的索引获取拼接字符串
                str += colorStr.charAt(random(14, 0))
            }
            let node = document.createElement("div");
            let h = random(600, 300); //随机每个div的高度
            node.style.lineHeight = h + "px"; //设置div的行高
            node.style.height = h + "px"; //设置div的高度
            node.innerHTML = "image"; //设置div的内容
            node.style.backgroundColor=str;//设置div的背景颜色
            arr.sort((a, b) => {//从小到到大排序,获取高度最小的一列
                if (a.h > b.h) {
                    return 1
                } else {
                    return -1
                }
            })
            node.style.left = arr[0].col * 400 + "px";//设置left值为列数*指定宽度
            node.style.top = arr[0].h + "px";//设置top值为最小高度+间距
            app.appendChild(node)//插入到容器中
            arr[0].h += (h + 20);//设置最小高度加等于当前div高度和间距
            arr.sort((a, b) => {//再次排序获取最大值
                if (a.h > b.h) {
                    return 1
                } else {
                    return -1
                }
            })
            app.style.height = arr[2].h + "px";//由于是绝对定位,父盒子的高度不能被子元素撑开,所以要设置父盒子的高度为最大的
        }
    }
    water()//初始运行一次
    window.onscroll = function () {//监听滚动事件
        let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;//获取滚动高度
        let ch = window.innerHeight || document.body.clientHeight;//获取窗口的高度
        let H = parseInt(app.style.height)//获取容器的高度
        if (H <= scrollTop + ch + 100) {//判断当容器的高度小于等于滚动高度+窗口高度+100的时候再次运行
            water();
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读