瀑布流佈局

瀑布流佈局 - 浮動

<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;
            }
        }
    }

運行

百葉窗效果

簡陋佈局

<ul id="ul"><li><div><p>這是一個百葉窗效果,測試1</p><p>這是一個百葉窗效果,測試2</p></div></li><li><div><p>這是一個百葉窗效果,測試3</p><p>這是一個百葉窗效果,測試4</p></div></li><li><div><p>這是一個百葉窗效果,測試5</p><p>這是一個百葉窗效果,測試6</p></div></li><li><div><p>這是一個百葉窗效果,測試7</p><p>這是一個百葉窗效果,測試8</p></div></li><li><div><p>這是一個百葉窗效果,測試9</p><p>這是一個百葉窗效果,測試A</p></div></li></ul>
    window.onload = function () {
        var ul = document.getElementById('ul')
        var iNow = 0; //從第0個div - 第N個div,有層次變化,需要一個當前值;
        var timer = null;
        var onoff = true;//開關,一次真一次假
        toShow(ul)
        function toShow(obj) {
            var div = obj.getElementsByTagName('div')
            setInterval(function () {
                toChange();//有頻率的變化,層次效果
            }, 2000)
            function toChange() {
                timer = setInterval(function () { //第二個定時器,有層次效果
                    if (iNow == div.length) {  //需要判斷定時器何時結束,所以需要一個tiemr
                        clearInterval(timer);
                        iNow = 0;
                        onoff = !onoff;
                    }
                    else if (onoff) {
                        startMove(div[iNow], {top: 0}); //一次為0,一次為30,所以需要一個開關 onoff
                        iNow++;
                    }
                    else {
                        startMove(div[iNow], {top: -30});
                        iNow++;
                    }
                }, 100)
            }
        }
    }
*{ margin: 0; padding: 0;} li{list-style:none;} #ul{ width: 300px; height: auto;border-top:3px solid #333; margin: 20px auto;text-indent: 1em;} li{ width: 100%; height: 30px; overflow: hidden; position: relative; border-bottom:1px solid #2291AB;line-height: 30px;} li div{ position: absolute; top: -30px;} li div p{ height: 30px;}

運行