js實現瀑布流佈局

html:css

<!doctype html>html

<html>node

<head>數組

    <meta charset="UTF-8">app

    <title>Document</title>函數

    <link rel="stylesheet" href="index.css"/>佈局

    <script src="index.js"></script>url

</head>htm

<body>索引

    <div id="walterfall">

        <div>

            <div>

                <img src="imgs/0.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/1.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/2.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/3.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/4.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/5.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/6.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/7.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/8.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/9.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/10.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/11.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/12.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/13.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/14.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/15.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/16.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/17.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/18.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/19.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/20.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/21.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/22.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/23.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/24.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/25.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/26.jpg" alt=""/>

            </div>

        </div>

        <div>

            <div>

                <img src="imgs/27.jpg" alt=""/>

            </div>

        </div>

    </div>

</body>

</html>

css:

body, div{

    margin: 0;

    padding: 0;

}

#walterfall{

    height: auto;

    position: relative;

}

.container{

    float: left;

    padding: 15px 0 0 15px;

}

.img{

    padding: 10px;

    border: 1px solid #ccc;

    box-shadow: 0px 0px 5px gray;

}

img{

    width: 190px;

}

js:

/**

 * Created by ll0u on 1/7/2015.

 */

var data = {imgs:

                  [

                    {url: 'imgs/28.jpg'},

                    {url: 'imgs/29.jpg'},

                    {url: 'imgs/30.jpg'},

                    {url: 'imgs/31.jpg'},

                    {url: 'imgs/32.jpg'}

                  ]

            }

window.onload = function(){

    walterFall('walterfall', 'container');

    //滾動加載圖片

    window.onscroll = function(){

        var oParent = document.getElementById('walterfall');

        var listNode= getEByClass(oParent, 'container');

        if(checkLoad()){

            for(var i=0; i< data.imgs.length; i++){

                var containerNode = document.createElement('div');

                containerNode.className = 'container';

                var imgNode = document.createElement('div');

                imgNode.className = 'img';

                var img = document.createElement('img');

                img.src = data.imgs[i].url;

                imgNode.appendChild(img);

                containerNode.appendChild(imgNode);

                oParent.appendChild(containerNode);

                listNode.push(containerNode);

//                walterFall('walterfall', 'container');

                //計算新加載圖片的位置

                listI++;

                minH = Math.min.apply(null, columnsHArr);

                var index = getIndex(columnsHArr, minH);

                listNode[listI].style.cssText = 'position: absolute; top: ' + minH + 'px; left: ' + listNode[index].offsetLeft + 'px';

                columnsHArr[index] += listNode[listI].offsetHeight;

            }

        }else{


        }

    }

}

//封裝瀑布流佈局函數

//存放每一列高度的數組

var columnsHArr = [];

//存放最小高度

var minH = 0;

var listI = 0;

function walterFall(parent, box){

    //獲得屏幕寬度

    var screenW = document.documentElement.offsetWidth;

    var oParent = document.getElementById(parent);

    //獲得class爲container的全部元素

    var listNode= getEByClass(oParent, box);

    //獲得container的寬度

    var listNodeW = listNode[0].offsetWidth;

    //獲得列數

    var columns = Math.floor(screenW / listNodeW);

    //設置大容器的css屬性

    oParent.style.cssText = 'width: ' + (listNodeW*columns+15) + 'px; margin: 0 auto';

    for(var i=0; i<listNode.length; i++){

        if(i < columns){

            columnsHArr.push(listNode[i].offsetHeight);

        }else{

            listI = i;

            minH = Math.min.apply(null, columnsHArr);

            var index = getIndex(columnsHArr, minH);

            listNode[i].style.cssText = 'position: absolute; top: ' + minH + 'px; left: ' + listNode[index].offsetLeft + 'px';

            columnsHArr[index] += listNode[i].offsetHeight;

        }

    }

}


//封裝獲得class的函數

function getEByClass(node, className){

    var nodeArr = [];

    var allNode = node.getElementsByTagName('*');

    for(var i=0; i<allNode.length; i++){

        if(allNode[i].className == className){

            nodeArr.push(allNode[i]);

        }

    }

    return nodeArr;

}


//封裝獲得最小高度列的索引值

function getIndex(columnsHArr, minH){

    for(var i in columnsHArr){

        if(columnsHArr[i] == minH){

            return i;

        }

    }

}


//封裝是否加載圖片函數

function checkLoad(){

    var oParent = document.getElementById('walterfall');

    var listNode = getEByClass(oParent, 'container');

    //屏幕高度

    var screenH = document.documentElement.clientHeight || document.body.clientHeight;

    //滾動條滾動高度

    var scrollH = document.documentElement.scrollTop || document.body.scrollTop;

    var height = screenH + scrollH;

    //最後一張圖片距離頂部的高度

    var lastT = listNode[listNode.length - 1].offsetTop + Math.round(listNode[listNode.length - 1].offsetHeight/2);

    return lastT<height ? true : false;

}

相關文章
相關標籤/搜索