瀑布流的实现方法

瀑布流布局
国外:Pinterest
国内:花瓣

1.js方法
2.jq方法
3.css3多栏布局

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="main">
        <div class="box">
            <div class="pic">
                <img src="../images/0.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/1.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/2.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/3.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/4.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/5.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/6.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/7.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/8.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/9.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/10.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/11.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/12.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/13.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/14.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/15.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/16.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/17.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/18.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/19.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/20.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/21.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/22.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/23.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/24.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/25.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/26.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/27.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/28.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/29.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/30.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/31.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/32.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="../images/33.jpg" alt="">
            </div>
        </div>
    </div>
    <script type="text/javascript" src="js/script.js"></script>
</body>
</html>

style.css

*{
    margin: 0;
    padding: 0;
}
#main{
    position: relative;
}
.box{
    padding: 15px 0 0 15px;
    float: left;
}
.pic{
    padding: 10px;
    border: 1px solid #ccc;
    border-radius: 5px;
    box-shadow: 0 0 5px #ccc;
}
.pic img{width: 165px;height: auto}

javascript:script.js

window.onload=function(){
    waterfall('main','box');
}

function waterfall(parent,box){
    //取出所有main下所有的class为box的元素
    var oParent = document.getElementById(parent);
    var oBoxs=getByClass(oParent,box);
    console.log("oboxs:"+oBoxs.length);
    // 计算需要显示的列数(页面宽度/box宽度)
    var oBoxWidth = oBoxs[0].offsetWidth;
    console.log("oBoxWidth:"+oBoxWidth);
    var cols= Math.floor(document.documentElement.clientWidth/oBoxWidth);
    console.log("cols:"+cols);
    //设置main宽度
    oParent.style.cssText='width:'+oBoxWidth*cols+"px;margin:0 auto;";
    var hArr=[];//存放每一列高度的数组
    for(var i=0;i<oBoxs.length;i++){
        if(i<cols){
            hArr.push(oBoxs[i].offsetHeight);
        }
        else{

            var minheight = Math.min.apply(null,hArr);
            console.log(minheight);
            var index=getMinheightIndex(hArr,minheight);
            oBoxs[i].style.position="absolute";
            oBoxs[i].style.top=minheight+"px";
            // oBoxs[i].style.left=oBoxWidth*index+"px";
            oBoxs[i].style.left=oBoxs[index].offsetLeft+"px";
            hArr[index]+=oBoxs[i].offsetHeight;
        }


    }
    console.log("oBoxsHeight:"+hArr);
}

//根据class获取元素
function getByClass(parent,clsName){
    var boxArr=new Array(); //存储所有class为box的元素
    oElements = parent.getElementsByTagName('*')
    for(var i =0;i<oElements.length;i++){
        if(oElements[i].className==clsName){
            boxArr.push(oElements[i])
        }
    }
    return boxArr
}
function getMinheightIndex(arr,val){
    for (var i in arr)
        if (arr[i]==val){
            return i;
        }
}

jquery:script.js

$(window).on('load',function(){
    waterfall();
    var dataInt ={"data":[{"src":"0.jpg"},{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"}]}
    $(window).on('scroll',function(){
        if(checkScrollSlide){
            $.each(dataInt.data,function(key,value){
                console.log(value);
                var oBox=$('<div>').addClass('box').appendTo($("#main"));
                var oPic=$('<div>').addClass('pic').appendTo($(oBox));
                $('<img>').attr('src',"images/"+$(value).attr("src")).appendTo($(oPic));
            })
            waterfall();
        }
    })
   
})

function waterfall(){
    var $boxs=$('#main>div');
    var percolwidth= $boxs.eq(0).outerWidth();
    var cols = Math.floor($(window).width()/percolwidth);
    $('#main').width(cols*percolwidth).css('margin','0 auto');
    var hArr=[];
    $boxs.each(function(index, val) {
         /* iterate through array or object */
         // console.log(index)
         // console.log(val)
         var h = $boxs.eq(index).outerHeight();
         if(index<cols){
            hArr[index]=h
         }
         else{
            var minheight = Math.min.apply(null,hArr);
            var minheightIndex = $.inArray(minheight,hArr);
            $(val).css({
                'position':'absolute',
                'top':minheight+"px",
                'left':percolwidth*minheightIndex+"px"
            });
            // hArr[minheightIndex]+=$boxs.eq(index).outerHeight()
            hArr[minheightIndex]+=h
        }
    });
    console.log(hArr)
}

function checkScrollSlide(){
    var $lastBox=$("#main>div").last();
    var lastBoxDis = $lastBox.offset().top+Math.floor($lastBox.outerHeight()/2);
    var scrollTop=$(window).scrollTop();
    var documentHeight = $(window).height();
    return (lastBoxDis<scrollTop+documentHeight)?true:false;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容