原生JS實現瀑布流


  瀏覽網頁的時候經常會遇到瀑布流布局的網站。也許有些讀者不了解瀑布流。瀑布流,又稱瀑布流式布局。是比較流行的一種網站頁面布局,視覺表現為參差不齊的多欄布局,隨着頁面滾動條向下滾動,這種布局還會不斷加載數據塊並附加至當前尾部。比如下面圖片的效果,就是一個典型的瀑布流。

網上有很多JQ的瀑布流插件,而且都寫好了兼容,都可以嘗試去使用,這里只是跟大家分享一下原生js實現瀑布流的效果,一起學習。

一步一步來:

首先新建一個文件,就叫瀑布流.html吧。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流</title>
    <style type="text/css">
    div{
        background: #ccc;
        width: 200px;
        position: absolute;
        transition:0.5s;
    }
    </style>
</head>
<body>
    
    <script>
        //js代碼
    </script>
</body>
</html>

 這里先說明一下,就像上面那張圖片的布局一樣,只不過里面的小圖片我全部用div表示,每個div寬度(200px)都一樣,跟上面的圖片例子一樣(高度可能不一樣),然后將每一個div都絕對定位,因為在后面會通過left、top值改變div的位置。transition:0.5s;只是給div改變樣式時一個過渡。

下面是JS代碼部分:

<script type="text/javascript">
    createDiv ()
    function createDiv () {
        for (var i = 0; i < 20; i++) {
            var div = document.createElement('div');
            var rnd = Math.floor(Math.random()*300+50)   //div的高度在50到350之間
            div.style.height = rnd + "px";
            div.innerHTML = i;
            document.body.appendChild(div);    
        };
        change()
    }

    function change() {
        var aDiv = document.getElementsByTagName('div');
        // alert(aDiv.length);
        var windowCW = document.documentElement.clientWidth;  //窗口視口的寬度
        var n = Math.floor(windowCW/210);                     //一行能容納多少個div,並向下取整
        if (n<=0) {return};
        // alert(n);
        var t = 0;
        var center = (windowCW - n*210)/2;                   //居中
        var arrH = [];                                       //定義一個數組存放div的高度
        for (var i = 0; i < aDiv.length; i++) {
            var j = i%n;                                  

            if (arrH.length==n) {                    //一行排滿n個后到下一行                    
                var min = findMin(arrH);              //從最“矮”的排起,可以從下圖的序號中看得出來,下一行中序號是從矮到高排列的
                aDiv[i].style.left =center + min*210 + "px";       
                aDiv[i].style.top = arrH[min]+10 + "px";
                arrH[min] += aDiv[i].offsetHeight + 10;    
                // alert(min);
            }else{
                arrH[j] = aDiv[i].offsetHeight;        
                aDiv[i].style.left =center + 200*j+10*j + "px";
                aDiv[i].style.top = 0;
            }

        };
    }
    window.onresize = function(){      //窗口改變也調用函數  
        change();
    }
    window.onscroll= function  () {
        // 頁面總高度
        var bodyHeight = document.documentElement.offsetHeight;
        // 可視區高度
        var windowHeight = document.documentElement.clientHeight;
        //滾動條的高度    
        var srcollTop = document.documentElement.scrollTop || document.body.scrollTop;
        var srcollH = document.body.scrollHeight;
        // alert(srcollH);
        if (srcollTop+windowHeight  >= srcollH-20) {
            createDiv();
        };
    }

    function findMin(arr) {
    var m = 0;
    for (var i = 0; i < arr.length; i++) {
        m = Math.min(arr[m], arr[i]) == arr[m] ? m : i;
    }
    return m;
}
</script>

 把JS部分代碼放在html文件下就完成了,你也可以將新建一個js文件。瀏覽器打開就會看到下面的效果:

               

注意看2張圖片的滾動條,在第二張中已經生成了很多個div。隨着滾動條的下滑div不斷生成,這樣就沒必要將全部內容一下子顯示出來,節省空間的同時也節省了流量。京東商城或是淘寶商品詳細介紹也是下拉到該內容的時候才加載。

同時改變窗口大小也能自適應。

     

暫時分享到這里,如果對你有幫助就點個贊吧,不明白的地方留個言。本文是我原創的,所以有需要轉載的讀者麻煩說明一下出處,O(∩_∩)O謝謝。

 

//9月7號補充內容

今天做項目用到了瀑布流,就把今天寫的效果和代碼貼出來跟大家交流,寫的不好的地方歡迎指出,只有學習才有進步。

 

 懸浮的時候有文字說明,同時透明背景過渡顯示。還可以點擊圖片查看大圖。

 

其實實現起來也很簡單,時間有限我直接吧js部分代碼拷貝下來。下班走人咯。

 

//瀑布流
var fall=document.getElementById("waterfall_ul");

createLi();
function createLi(){
    for (var i = 0; i < 40; i++) {
            var li = document.createElement('li');
            var img=document.createElement('img');
            var div=document.createElement('div');
            var span=document.createElement('span');
            // li.style.width="210px";
            fall.appendChild(li);  
            li.appendChild(img); 
            li.appendChild(div);
            div.appendChild(span);
            span.innerHTML="我是文字";
            div.setAttribute('class',"cover");
            img.setAttribute("src", "img/"+i+".jpg"); 
        };
}

function change(){
    var lis=fall.getElementsByTagName("li");
    var lis_W=lis[0].offsetWidth;
    // alert(lis_W);
    var imgs=fall.getElementsByTagName('img');
    // alert(imgs.length);
    var windowCW = document.documentElement.offsetWidth;
    var n = Math.floor(windowCW/lis_W); 

    var center = (windowCW - n*lis_W-(n-1)*10)/2;
    var arrH = []; 
    for(var i=0;i<lis.length;i++){
        var j=i%n;
        // alert(arrH);
        if (arrH.length==n) {                   
                var min = findMin(arrH);              
                lis[i].style.left =center + min*(lis_W+10) +"px";  
                lis[i].style.top = arrH[min]+10 + "px";
                arrH[min] += lis[i].offsetHeight + 10; 

                var k=0;
                for(var b=0;b<n;b++){
                    k=Math.max(arrH[k],arrH[b])==arrH[k] ? k : b;
                } 
                fall.style.height= arrH[k]+'px';
                // alert(min);
            }else{
                arrH[j] = imgs[i].offsetHeight;        
                lis[i].style.left =center + lis_W*j+10*j + "px";
                lis[i].style.top = 0;
            }
    }

    function findMin(arr) {
        var m = 0;
        for (var i = 0; i < arr.length; i++) {
            m = Math.min(arr[m], arr[i]) == arr[m] ? m : i;
        }
        return m;
    }
}
window.onload=function(){
    change();
}
window.onresize=function(){
    change();
}
//點擊查看圖片大圖
$(document).ready(function(){
    $(".cover").click(function(){
        // console.log(this.previousSibling.src);
        var cover_img=document.getElementById("cover_img");
        var big_cover=document.getElementById('big_cover');
        cover_img.setAttribute("src", this.previousSibling.src);
        big_cover.style.display="block";
    });
    $("#x").click(function(){
        big_cover.style.display="none";
    });
    $(".cover").hover(function() {
        /* Stuff to do when the mouse enters the element */
        $(this).animate({opacity:1});
    }, function() {
        /* Stuff to do when the mouse leaves the element */
        $(this).animate({opacity:0});
    });
});

 完了,再次謝謝大家的讀閱。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM