瀑布流布局

特点:利用绝对定位固定图片位置,图片等宽不等高,参差不齐,滚动滚轮能自动加载。

结构


图片之间的距离用padding实现,而不是margin

等宽不等高

Paste_Image.png
Paste_Image.png

效果:

offsetWidth属性获取元素的宽度

Paste_Image.png

获取页面的宽度

Paste_Image.png

Math.floor取整

Paste_Image.png

cssText的方式设置样式

Paste_Image.png

第二行的第一张图片加在第一行高度最小的图片之后,即top值等于最小高度

Paste_Image.png

Math.min.apply(null,harr);//求数组最小值

核心代码

Paste_Image.png

布局效果完成

加载数据块的条件

加载

混杂模式和标准模式,混杂模式下,使用document.body,标准模式下,使用document.documentElement

Paste_Image.png

获取所有元素

 s = oP.getElementsByTagName('*');
<!Doctype>
<html>

    <head>
        <meta charset="utf-8" />
        <title>瀑布流布局</title>
        <style type="text/css">
            * {
                padding: 0px;
                margin: 0px;
            }
            
            #main {
                width: 1185px;
                margin: 0px auto;
                position: relative;
            }
            
            .box {
                padding-left: 15px;
                padding-top: 15px;
                float: left;
            }
            
            .pic {
                padding: 10px;
                border: 1px solid #CCCCCC;
                border-radius: 5px;
                box-shadow: 0 0 5px #CCCCCC;
            }
            
            .pic img {
                width: 200px;
                height: auto;
            }
        </style>
        <script type="text/javascript">
            window.onload = function() {
                setBoxPosition();
                window.onscroll = function() {
                    if(checkScrollSlide()) {
                        var main = document.getElementById("main");
                        var imgUrl = "http://coding.imooc.com/static/module/index/img/banner02.jpg";
                        //模拟动态添加10个box数据
                        for(var i = 0; i < 10; i++) {
                            var box = getBoxDiv(imgUrl);
                            main.appendChild(box);
                        }
                        setBoxPosition();
                    }
                }

                /**
                 * 设置Box所在位置,实现瀑布流效果
                 */
                function setBoxPosition() {
                    //将main下所有class为box的元素取出来
                    var boxs = document.getElementById("main").getElementsByClassName("box");
                    //将box按照高度进行排列
                    var boxsPos = new Array(); //box底部相对页面位置
                    for(var i = 0; i < boxs.length; i++) {
                        if(i < 5) { //由于在CSS中固定了main的宽度,所以每列只能显示五行
                            boxsPos.push(boxs[i].offsetHeight);
                        } else {
                            var minH = Math.min.apply(null, boxsPos);
                            var index = getMinHIndex(boxsPos, minH);
                            //设置box的绝对定位
                            boxs[i].style.position = "absolute";
                            boxs[i].style.top = minH + "px";
                            boxs[i].style.left = index * boxs[i].offsetWidth + "px";
                            //更新boxsPos位置信息
                            boxsPos[index] += boxs[i].offsetHeight;
                        }
                    }
                }
                /**
                 * 取出boxsPos中最小值的索引
                 */
                function getMinHIndex(arr, val) {
                    for(var i = 0; i < arr.length; i++) {
                        if(arr[i] == val) {
                            return i;
                        }
                    }
                }
                /**
                 * 检测是否具备了滚动加载数据的条件
                 */
                function checkScrollSlide() {
                    var main = document.getElementById("main");
                    var boxs = main.getElementsByClassName("box");
                    var lastBoxHeight = boxs[boxs.length - 1].offsetTop
                        //+ Math.floor(boxs[boxs.length - 1].offsetHeight / 2);
                    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
                    var screenHeight = document.body.clientHeight || document.documentElement.clientHeight;
                    return(scrollTop + screenHeight > lastBoxHeight) ? true : false;
                }

                /**
                 * 创建Box节点
                 */
                function getBoxDiv(src) {
                    var box = document.createElement("div");
                    var pic = document.createElement("div");
                    var img = document.createElement("img");
                    box.className = "box";
                    pic.className = "pic";
                    img.src = src;
                    box.appendChild(pic);
                    pic.appendChild(img);
                    return box;
                }
            }
        </script>
    </head>

    <body>
        <div id="main">
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
            <div class="box">
                <div class="pic">
                    ![](http://upload-images.jianshu.io/upload_images/5540636-b5103446b1e77dbd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
                </div>
            </div>
        </div>
    </body>

</html>

jq实现##

获取宽度, obj.width(内容宽度)和obj.outerWidth()(包括padding和border)

Paste_Image.png

设置宽度,不需要加单位

Paste_Image.png

jq中用each(index,value)遍历所有的boxs,其中value是dom对象,需要转换为jq对象,$(value)

Paste_Image.png
Paste_Image.png

eq(index)方法

Paste_Image.png

$.inArray(值,所在数组)方法判断一个值在数组中出现的索引

jq实现瀑布流布局部分代码###

Paste_Image.png
Paste_Image.png

onscroll事件事件瀑布流加载###

$('#main>div').last();去最后的一个div

Paste_Image.png

jq:$lastBox.offset().top先调用offset()方法,再取属性值
js:lastBox.offsetTop属性

Paste_Image.png

此时的value也是js原生的对象
Jquery对象本质是一个“类数组”

Paste_Image.png
Paste_Image.png

通过$(value).attr('src');取值

Paste_Image.png

jq 实现加载的代码###

Paste_Image.png
Paste_Image.png

css3多栏布局##

多栏布局,利用columns属性:多栏布局column-width可以设置每一列的宽度,并根据窗口宽度除以每一列宽度得到的列数进行纵向排列div模块,实现瀑布流布局

知识点:

  • column的浏览器兼容问题,不同内核要写其前缀
    -webkit Google浏览器内核
    -ms IE
    -o 欧朋opera
    -moz 火狐FireFox

  • column-width 和column-count没有必要同时出现

  • column-rule设置列与列之间的边框

  •  column-gap 设置列间距,不一定定义多少,实际就显示多少。其计算规则:用当前浏览器宽口宽除以定义的列宽,剩下的距离平均分配
    

设置了column-width属性的值

Paste_Image.png

效果

随着窗口的大小变化,列数也会跟着改变

Paste_Image.png

column-rule设置边框属性
column-gap设置内间距

<div>元素一</div>
<div>元素二</div>
<div>元素三</div>
var $div = $('div') //jQuery对象
var div = $div.get(0) ;//通过get方法,转化成DOM对象
div.style.color = 'red' //操作dom对象的属性

总结##

比较
js方式:

Paste_Image.png

css3方式:

Paste_Image.png

扩展##

使用jQuery实现加载图片带有分散效果的瀑布流布局

Paste_Image.png
任务
一、定义图片布局函数waterfall
二、在waterfall函数中定义根据class获取元素函数getByClass
三、计算整个父盒子的宽度且让它在浏览器中水平居中
四、计算及排列每个数据块应该出现的位置,一开始数据块紧跟在第二张图片的后边且位于最高的那个图片的下边,然后通过动画分散到它该出现的位置
五、拖动滚动条时定义检测是否具备了滚条加载数据块条件的函数。
六、遍历给出的数据,将图片添加到数据块中渲染出来
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容