JS实现瀑布流

HTML:先让图片充满一页

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>瀑布流</title>
    <link rel="stylesheet" href="css/style.css" type="text/css">
    <script src="js/app.js"></script>
</head>
<body>
    <div id="container"><div class="box">
          <<div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div>
    </div><div class="box">
        <div class="box_img">
            <img src="img/5.jpg">
        </div></div></div>

</body>
</html>

app.js:

window.onload=function() {
    imgLocation("container");
    var imgData={"data":[{"src":"2.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"}]};
    window.onscroll =function(){
        if(checkFlag()){
            var cparent = document.getElementById("container");
            for(var i=0;i<imgData.data.length;i++){
                var cnode=document.createElement("div");
                cnode.className="box";
                cparent.appendChild(cnode);
                var boxImg=document.createElement("div");
                boxImg.className="box_img";
                cnode.appendChild(boxImg);
                var img=document.createElement("img");
                img.src="img/"+imgData.data[i].src;
                boxImg.appendChild(img);
            }
            imgLocation("container");
        }
    }
}

function checkFlag(){
    var cparent = document.getElementById("container");
    var arr=cparent.childNodes;
    var lastContentHeight=arr[arr.length-1].offsetTop;
    var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
    var pageHeight=document.documentElement.clientHeight||document.body.clientHeight;

    if(lastContentHeight<scrollTop+pageHeight){
        return true;
    }
}

function imgLocation(parent){
    var cparent = document.getElementById(parent);
    var arr=Array.prototype.slice.call(cparent.childNodes,0);
    var imgWidth=arr[0].offsetWidth;
    var num=parseInt(document.documentElement.clientWidth/imgWidth);
    cparent.style.cssText=""+imgWidth*num+"px;"+"margin:0px auto";

    var boxHeightArr=[];
    for(var i=0;i<arr.length;i++){
        if(i<num){
            boxHeightArr[i]=arr[i].offsetHeight;
        }else{
            var minHeight=Math.min.apply(null,boxHeightArr);
            var index=getMinHeightindex(boxHeightArr,minHeight);
            arr[i].style.position = "absolute";
            arr[i].style.top = minHeight+"px";
            arr[i].style.left = arr[index].offsetLeft+"px";
            boxHeightArr[index] = boxHeightArr[index]+arr[i].offsetHeight;
        }
    }
}

function getMinHeightindex(boxHeightArr,minHeight){
    for(var i in boxHeightArr){
        if(boxHeightArr[i]==minHeight){
            return i;
        }
    }
}

css:

*{
    padding:0px;
    margin:0px;
}
#container{
    position:relative;
}
.box{
    padding:5px;
    float:left;
}
.box_img{
    padding:5px;
    border:1px solid #cccccc;
    border-radius: 5px;
    box-shadow: 0 0 5px #cccccc;
}
.box_img img{
    150px;
    height: auto;
}
原文地址:https://www.cnblogs.com/shytong/p/5069996.html