瀑布流布局

效果如图:

HTML代码结构:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Countent-Type" content="text/html;charset=UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <div id="main">
        <div class="box">
            <div class="imgCom">
                <img src="images/1.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/2.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/3.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/4.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/5.jpg">
            </div>
        </div>
        
        <div class="box">
            <div class="imgCom">
                <img src="images/6.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/7.jpg">
            </div>
        </div>

        
        <div class="box">
            <div class="imgCom">
                <img src="images/8.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/9.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/10.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/11.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/12.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/13.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/14.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/15.jpg">
            </div>
        </div>
        
        <div class="box">
            <div class="imgCom">
                <img src="images/16.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/17.jpg">
            </div>
        </div>

        <div class="box">
            <div class="imgCom">
                <img src="images/18.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/19.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/20.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/21.jpg">
            </div>
        </div>
        <div class="box">
            <div class="imgCom">
                <img src="images/22.jpg">
            </div>
        </div>
        
    </div>
</body>
</html>
*{ padding: 0; margin: 0;}
#main{ position: relative;}
.box{ padding: 15px 0 0 15px; float: left; width: 230px; }
.imgCom{ border: 1px solid #ccc; border-radius: 4px; box-shadow: 0px 0px 4px #ccc;}
.imgCom img{ display: block; padding: 15px;}

一,用原生js来写:

window.onload=function(){
    waterfall("main","box");
    //模拟后台数据加载
    var dataInt={"data":[{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"},{"src":"8.jpg"},{"src":"9.jpg"},{"src":"10.jpg"},{"src":"11.jpg"},{"src":"12.jpg"}]}
    window.onscroll=function(){
        if(checkScrollSlide){
            var oPartent=document.getElementById("main");
            for(var i=0;i<dataInt.data.length;i++){
                var oBox=document.createElement("div");//创建一个div元素
                oBox.className="box";
                oPartent.appendChild(oBox);
                var oImgCom=document.createElement("div");
                oImgCom.className="imgCom";
                oBox.appendChild(oImgCom);
                var oImg=document.createElement("img");
                oImg.src="images/"+dataInt.data[i].src;
                oImgCom.appendChild(oImg);
            }
            waterfall("main","box");
        }
    }

}

//瀑布流基础设置
function waterfall(partent,box){
    
    var oPartent=document.getElementById(partent);
    var oBoxs=getByClass(oPartent,box);
    //计算整个页面显示的列数(页面宽度/box宽度 *取整)
    var oBoxW=oBoxs[0].offsetWidth;
    var cols=Math.floor(document.documentElement.clientWidth/oBoxW);
    //设置main的宽
    oPartent.style.cssText="width:"+cols*oBoxW+"px; margin:0px auto; padding-right:15px;"
    var hArr=[];//存放每一列高度的数组
    for(var i=0;i<oBoxs.length;i++){
        if(i<cols){
            hArr.push(oBoxs[i].offsetHeight);//存储第一行的高度    
        }
        else{
            var minH=Math.min.apply(null,hArr);//获取第一行高度最小的值
            var index=getMinhIndex(hArr,minH);
            oBoxs[i].style.position="absolute";
            oBoxs[i].style.top=minH+"px";
            oBoxs[i].style.left=oBoxW*index+"px";
            // oBoxs[i].style.left=oBoxs[index].offsetLeft+"px";
            hArr[index]+=oBoxs[i].offsetHeight;//更新添框快后的列高
        }
    }
}

//获取数组中某值的索引
function getMinhIndex(arr,val){
    for(var i in arr){
        if(arr[i]==val){
            return i;
        }
    }
}

//将main下的所有class为box的元素取出来
function getByClass(partent,clsName){
    var boxArr=new Array(),//用来存储获取到的所有class为box的元素
    oElement=partent.getElementsByTagName("*");//获取之下的所有元素
    for(var i=0;i<oElement.length;i++){
        if(oElement[i].className==clsName){
            boxArr.push(oElement[i]);//存储到数组中
        }
    }
    return boxArr;
}

//检查滚动条是否具备了加载数据块的条件
function checkScrollSlide(){
    var oPartent=document.getElementById("main");
    var oBoxs=getByClass(oPartent,"box");
    var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length].offsetHeight/2);//最后一块距离顶部高度+自身的一半高度
    var scrollH=document.body.scrollTop||document.documentElement.scrollTop;//滚动的高度
    var winH=document.body.clientHeight||document.documentElement.clientHeight;
    return (lastBoxH-scrollH<winH)?true:false;
}

二,用jquery框架来写

$(function(){
    waterfall("#main",".box");
    var dataInt={"data":[{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"},{"src":"8.jpg"},{"src":"9.jpg"},{"src":"10.jpg"},{"src":"11.jpg"},{"src":"12.jpg"}]}
    $(window).scroll(function(){
        if(checkScrollSlide){
            for(var i=0;i<dataInt.data.length;i++){
            $("#main").append("<div class='box'><div class='imgCom'><img src='images/"+dataInt.data[i].src+"'/></div></div>")
            }
            waterfall("#main",".box");
        }
    })
})

//瀑布流基础设置
function waterfall(parent,box){
    var oBoxw=$(box).width()+15;
    var cols=parseInt($(window).width()/oBoxw);//计算整个页面显示的列数(页面宽度/box宽度 *取整)
    $(parent).css({"width":cols*oBoxw,"margin":"0 auto","padding-left":"15px"});
    var hArr=[];//存放每一列的高度
    for(i=0;i<$(box).length;i++){
        if(i<cols){    
            hArr.push($(box).eq(i).height()+15);
        }
        else{
            var minH=Math.min.apply(null,hArr);//获取第一行高度最小的值
            var index=getMinHIndex(hArr,minH);//获取该值在数组中的索引
            $(box).eq(i).css({"position":"absolute","top":minH,"left":oBoxw*index+15});
            hArr[index]+=$(box).eq(i).height()+15;
        }
    }
}

//获取数组中某值的索引
function getMinHIndex(arr,val){
    for(var i=0;i<arr.length;i++){
        if(arr[i]==val){
            return i;
        }
    }
}

//检查滚动条是否具备了加载数据块的条件
function checkScrollSlide(){
    var lastH=($(".box:last").height()+15)/2+$(".box:last").offset().top;//最后一块距离顶部高度+自身的一半高度
    var windH=$(window).height();
    var scrollH=$(document).scrollTop();//滚动的高度
    return (lastH-scrollH<windH)?true:false;
}

三、用css3来写:

待续......

posted @ 2014-12-17 15:30  落日知暮  阅读(308)  评论(0编辑  收藏  举报
作者:boyzi007 出处:http://www.cnblogs.com/boyzi/ QQ:470797533 QQ交流群:364307742 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。