瀑布流佈局 - 浮動

<div id="box"><ul><li><img src="../img/p-1.jpg" alt=""><p>浮動瀑布流佈局1</p></li><li><img src="../img/p-2.jpg" alt=""><p>浮動瀑布流佈局2</p></li><li><img src="../img/p-3.jpg" alt=""><p>浮動瀑布流佈局3</p></li></ul><ul><li><img src="../img/p-4.jpg" alt=""><p>浮動瀑布流佈局4</p></li><li><img src="../img/p-5.jpg" alt=""><p>浮動瀑布流佈局5</p></li><li><img src="../img/p-6.jpg" alt=""><p>浮動瀑布流佈局6</p></li></ul><ul><li><img src="../img/p-7.jpg" alt=""><p>浮動瀑布流佈局7</p></li><li><img src="../img/p-8.jpg" alt=""><p>浮動瀑布流佈局8</p></li><li><img src="../img/p-9.jpg" alt=""></li></ul></div>
window.onload = function () {
        var ul = document.getElementsByTagName('ul')
        window.onscroll = function () {
            var veiwHeight = document.documentElement.clientHeight; //可視區的距離
            var scrollY = document.documentElement.scrollTop || document.body.scrollTop; //滾動條滾動的距離
            var bBtn = true //判斷是否需要加ajax
            //開始循環: 所有ul,找裏面對應最後一個Li,與屏蔽上面進行比較
            for (var i = 0; i < ul.length; i++) {
                var li = ul[i].getElementsByTagName('li');
                var lastli = li[li.length - 1] //找最後一個即可
                if (posTop(lastli) < veiwHeight + scrollY && bBtn) {  //必須發送請求加載
                    bBtn = false
                    ajax('data.js', function (str) { //xxx.php?page=1&num=10  //ajax(請求的地址,請求成功回調)
                        var json = eval('(' + str + ')')  //返回字符串,解析成js語句,用eval 兩邊加小括號
                        if (json.code) {  //json.code == 0 不發請求
                            bBtn = true; //無請求數據時為false
                        }
                        for (var i = 0; i < json.list.length; i++) { //三組數據添加到頁面,循環json裏的list == 9
                            var list = json.list[i];
                            for (var j = 0; j < list.src.length; j++) {
                                var li = document.createElement('li')
                                li.innerHTML = '<img src="' + list.src[j] + '"/><p>' + list.title[j] + '</p>'
                                ul[i].appendChild(li)
                            }
                        }
                    })
                }
            }
        };
        //觸發滾動條事件,每一個ul裏的li提前到達可視區,則分別添加數據;,先寫方法獲取距離下面的距離 ,offsetTop沒辦法直接獲取屏幕的距離,offsetTop是獲取到有定位的距離;
        function posTop(obj) { //最後一個li頂部距離瀏覽器上邊的距離
            var top = 0;
            while (obj) {
                top += obj.offsetTop;
                obj = obj.offsetParent;
            }
            return top;
        }
    }

運行

瀑布流佈局 - 定位

<div id="box"><ul><li><img src="p-1.jpg" alt=""><p>浮動瀑布流佈局1</p></li><li><img src="p-2.jpg" alt=""><p>浮動瀑布流佈局2</p></li><li><img src="p-3.jpg" alt=""><p>浮動瀑布流佈局3</p></li><li><img src="p-4.jpg" alt=""><p>浮動瀑布流佈局4</p></li><li><img src="p-5.jpg" alt=""><p>浮動瀑布流佈局5</p></li><li><img src="p-6.jpg" alt=""><p>浮動瀑布流佈局6</p></li><li><img src="p-7.jpg" alt=""><p>浮動瀑布流佈局7</p></li><li><img src="p-8.jpg" alt=""><p>浮動瀑布流佈局8</p></li><li><img src="p-9.jpg" alt=""><p>浮動瀑布流佈局9</p></li></ul></div>
    window.onload = function () {
        var li = document.getElementsByTagName('li');
        var aHeight = {L: [], C: [], R: []};//存高度對象
        for (var i = 0; i < li.length; i++) {
            var iNow = i % 3// 0,1,2
            switch (iNow) {
                case 0:
                    li[i].style.left = '5px'
                    aHeight.L.push(li[i].offsetHeight)
                    var step = Math.floor(i / 3) //向下取整 0/3 1/3 2/3
                    if (!step) {  //前三個
                        li[i].style.top = 0;
                    }
                    else {           // 4/3 5/3....下面的每個累加
                        var sum = 0;//累加變量
                        for (var j = 0; j < step; j++) {
                            sum += aHeight.L[j] + 10
                        }
                        li[i].style.top = sum + 'px';
                    }
                    break;
                case 1:
                    li[i].style.left = '200px'
                    aHeight.C.push(li[i].offsetHeight)
                    var step = Math.floor(i / 3) //向下取整 0/3 1/3 2/3
                    if (!step) {  //前三個
                        li[i].style.top = 0;
                    }
                    else {           // 4/3 5/3....下面的每個累加
                        /*
                        * 1,2,3關三個Li top值為0
                        * 後面li top值為前面累加,如 3 4 5   3/3 = 1, 4/3 = 1 , 5/3 =1 向下取整 即前面有一個元素的高度
                        * 6 7 8 Math.floor(i/3) = 2,即有兩個元素高度
                        * */
                        var sum = 0;//累加變量
                        for (var j = 0; j < step; j++) {
                            sum += aHeight.C[j] + 10
                        }
                        li[i].style.top = sum + 'px';
                    }
                    break;
                case 2:
                    li[i].style.left = '400px'
                    aHeight.R.push(li[i].offsetHeight)
                    var step = Math.floor(i / 3) //向下取整 0/3 1/3 2/3
                    if (!step) {  //前三個
                        li[i].style.top = 0;
                    }
                    else {           // 4/3 5/3....下面的每個累加
                        var sum = 0;//累加變量
                        for (var j = 0; j < step; j++) {
                            sum += aHeight.R[j] + 10
                        }
                        li[i].style.top = sum + 'px';
                    }
                    break;
            }
        }
    }

運行