瀑布流

瀑布流写法(一)

概述:在4个ul内通过循环添加li,每次循环可以添加20个li.每次新产生的li都会被添加到最短的ul中去.(外加两个其它的小功能,当滚轮向下滑动时可以重新添加20个li,点击红色原点可以返回顶部)

定义css样式

        <style type="text/css">
            .wrap{
                width: 850px;
                border: 1px solid red;
                overflow: hidden;
                margin: 0 auto;
            }
            .wrap ul{
                width: 200px;
                /*height: 100px;*/
                float: left;
                box-sizing: border-box;
                margin-left: 10px;
                /*margin-bottom: 10px;*/
                padding: 10px;
            }
            .wrap ul li{
                list-style: none;
                text-align: center;
                font-size: 50px;
                line-height:100px ;
                margin-bottom: 10px;
                background-color: #CCCCCC;

            }
            .back{
                width: 40px;
                height: 40px;
                border-radius: 40px;
                background-color: red;
                position: fixed;
                right: 30px;
                bottom: 0;
            }
        </style>

一些基础样式,可以自行了解,

设置body样式

<body>
        <div class="wrap">
            <ul>
                <!--<li>1</li>-->
            </ul>
            <ul>
                <!--<li>2</li>-->
            </ul>
            <ul>
                <!--<li>3</li>-->
            </ul>
            <ul>
                <!--<li>4</li>-->
            </ul>
            <div class="back"></div>
        </div>
    </body>

body中的li是一开始设置css时候用来观察布局的,后期用js循环创建li,

js部分

    <script src="js/tween.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        var uls = document.getElementsByTagName("ul");
        var back = document.querySelector('.back');
        var timer = null;

        function randh(min,max){
            return parseInt(Math.random()*(max-min+1))+min;
        }
        function creatli(){

        for (var i=0;i<20;i++) {

            var li = document.createElement("li");
            li.innerHTML = i;
            li.style.height = randh(100,300)+"px";

            //用第一列ul的高度依次与其它几列ul比较,在最小的ul中添加li
            var minh = uls[0].offsetHeight;
            var mini = 0;

            for (var j=0;j<uls.length;j++) {
                    if(minh > uls[j].offsetHeight){
                        minh = uls[j].offsetHeight;
                        mini = j;
                    }
                    uls[mini].appendChild(li);
            }
        }

        }

        creatli();

        window.onscroll = function(){
            var windowh = document.documentElement.clientHeight;
            var bodyh = document.documentElement.offsetHeight;
            var rollh = bodyh - windowh;
            var top = document.documentElement.scrollTop || document.body.scrollTop;
            if(rollh == top){
                creatli();
            }
        }

        back.onclick = function(){
                var start = document.body.scrollTop || document.documentElement.scrollTop;
                var end = 0;
                t = 0;
                d = 20;
                clearInterval(timer);
            timer = setInterval(function(){
                t++;
                if(t >= d){
                    clearInterval(timer);
                }
                var speed = Tween.Back.easeIn(t,start,end-start,d);
                document.body.scrollTop = speed;
            },30)
        }

返回顶部时调用了tween.js中的代码,所以引用.

获取变量:
var uls = document.getElementsByTagName("ul");
        var back = document.querySelector('.back');
        var timer = null;
随机数代码:
function randh(min,max){
            return parseInt(Math.random()*(max-min+1))+min;
        }

随机数函数的作用是,每当新创建出一个li时,给新的li赋新的值,而这个值是由随机函数产生的,这样每一个li都有不同的高度,

创建li函数:
        for (var i=0;i<20;i++) {

            var li = document.createElement("li");
            li.innerHTML = i;
            li.style.height = randh(100,300)+"px";

            //用第一列ul的高度依次与其它几列ul比较,在最小的ul中添加li
            var minh = uls[0].offsetHeight;
            var mini = 0;

            for (var j=0;j<uls.length;j++) {
                    if(minh > uls[j].offsetHeight){
                        minh = uls[j].offsetHeight;
                        mini = j;
                    }
                    uls[mini].appendChild(li);
            }
        }

        }

首先通过循环产生20个li,然后在循环内创建li(var li = document.createElement(“li”);),然后把i的值赋给相应的li内.
li.style.height = randh(100,300)+”px”;给每一个li产生随机的高度,但是高度在100~300内取出.
因为我们要找出最短的ul列,然后将新的li添加进去,所以先设置了两个变量minh与mini

var minh = uls[0].offsetHeight;
var mini = 0;

把第一个ul的高度赋给minh,然后下边利用一个循环依次和其它的ul比较.mini是用来储存最短ul下标的,以便后期将li添加到最短ul中.
下边利用循环找出最短ul,然后进行添加li

for (var j=0;j<uls.length;j++) {
        if(minh > uls[j].offsetHeight){
            minh = uls[j].offsetHeight;
            mini = j;
                    }
            uls[mini].appendChild(li);
            }

在这里ul一共是4个,所以uls.length也可以用4来代表,下一篇会分享一个自适应宽度的瀑布流.
minh > uls[j].offsetHeight,利用第一个ul逐个和其它的ul比较,如果新的ul小于minh,将新的ul高度赋值给minh,将最短ul的下标赋值给mini.最后把li最短ul内.

附加功能

鼠标向下滚动时继续产生li

window.onscroll = function(){
            var windowh = document.documentElement.clientHeight;
            var bodyh = document.documentElement.offsetHeight;
            var rollh = bodyh - windowh;
            var top = document.documentElement.scrollTop || document.body.scrollTop;
            if(rollh == top){
                creatli();
            }
        }

回滚函数

back.onclick = function(){
                var start = document.body.scrollTop || document.documentElement.scrollTop;
                var end = 0;
                t = 0;
                d = 20;
                clearInterval(timer);
            timer = setInterval(function(){
                t++;
                if(t >= d){
                    clearInterval(timer);
                }
                var speed = Tween.Back.easeIn(t,start,end-start,d);
                document.body.scrollTop = speed;
            },30)
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值