zoukankan      html  css  js  c++  java
  • 扒一扒瀑布流布局的几种实现

      自Pinterest首次使用瀑布流式布局,现在这种页面布局已经得到了非常广泛的应用,比如蘑菇街、美丽说等各类购物网站,图丽网等美女图片展示网站等。
    现在我们扒一扒瀑布流的几种实现方式(今天在公司加班到10点才回,眼睛好累,代码先不写注解了,有时间再补上,感兴趣的同学可以自己敲着看看效果):
    一、css3
        实现原理:使用css3的多列属性(column),优点是实现起来比较简单,缺点是兼容性不太好。
        上代码:
      
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>waterFall01-css多列</title>
        <style>
            html,body{
                margin:0;
                padding: 0;
            }
            #container{
                column-width:250px;/*列宽*/
                -webkit-column-width:250px;
                -moz-column-width:250px;
                column-gap:5px;/*列间距*/
                -webkit-column-gap:5px;
                -moz-column-gap:5px;
            }
            .item{
                margin:5px 0;/*因为左右有gap*/
                padding:10px;
                border: 1px solid #ccc;
                box-shadow: 0 0 6px #ccc;
                border-radius: 5px;
            }
            .item img{
                width: 100%;
            }
            .item p{
                text-align: center;
                font-family: Microsoft Yahei;
            }
        </style>
    </head>
    <body>
        <div id="container">
            <div class="item"><img src="images/01/img (1).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (2).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (3).jpg" alt=""><p>描述信息</p></div>
            <div class="item"><img src="images/01/img (4).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (5).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (6).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (7).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (8).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (9).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (10).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (11).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (12).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (13).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (14).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (15).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (16).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (17).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (18).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (19).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (20).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (21).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (22).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (23).jpg" alt=""><p>描述信息</p></div>
            <div class="item"><img src="images/01/img (21).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (22).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (23).jpg" alt=""><p>描述信息</p></div>
            <div class="item"><img src="images/01/img (1).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (2).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (3).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (9).jpg" alt=""><p>描述信息</p></div>
            <div class="item"><img src="images/01/img (4).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (5).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (9).jpg" alt=""><p>描述信息</p></div>
            <div class="item"><img src="images/01/img (20).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (11).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (19).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (13).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (15).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (14).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (16).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (21).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (17).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (18).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (12).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (9).jpg" alt=""><p>描述信息</p></div>
            <div class="item"><img src="images/01/img (10).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (6).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (7).jpg" alt=""></div>
            <div class="item"><img src="images/01/img (8).jpg" alt=""></div>
        </div>
    </body>
    </html>
    二、JavaScript
       实现原理:原生js操作dom,动态插入新图片
      上代码:
      
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>waterFall02</title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            #main{
                position: relative;;
            }
            .item{
                padding: 15px 0 0 15px;
                float: left;
            }
            .box{
                padding: 10px;
                border: 1px solid #ccc;
                box-shadow: 0 0 6px #ccc;
                border-radius: 5px;
            }
            .box img{
                width:162px;
            }
        </style>
        <script>
            window.onload = function(){
                waterFall("#main",".item");
                var fakeData = {'data':[{'src':'img (1).jpg'},{'src':'img (2).jpg'},{'src':'img (3).jpg'},{'src':'img (5).jpg'},{'src':'img (9).jpg'},{'src':'img (4).jpg'},{'src':'img (6).jpg'},{'src':'img (7).jpg'}]};
                window.onscroll = function(){
                    if(checkScroll()){
                        var oParent = g("#main"), oItem, oBox, oImg;
                        for(var i = 0;i < fakeData.data.length; i++){
                            oItem = c("div");
                            oItem.className = "item";
                            oParent.appendChild(oItem);
                            oBox = c("div");
                            oBox.className = "box";
                            oItem.appendChild(oBox);
                            oImg = c("img");
                            oImg.src = "images/01/" + fakeData.data[i].src;
                            oBox.appendChild(oImg);
                        }
                        waterFall("#main",".item");
                    }
                }
            };
            function g(selector){
                return selector.substr(0,1) === "#" ? 
                    document.getElementById(selector.substr(1)) : document.getElementsByClassName(selector.substr(1));
            }
            function c(ele){
                return document.createElement(ele);
            }
            function waterFall(parent, item){
                var oParent = g(parent);
                var items = g(item);
                var iWidth = items[0].offsetWidth;
                var cols = Math.floor(document.documentElement.clientWidth / iWidth);
                oParent.style.cssText = "" + iWidth * cols +"px;margin: 0 auto;";
    
                var iHeightArr = [],iHeight, minH, minHIndex;
                for(var i = 0;i < items.length; i++){
                    iHeight = items[i].offsetHeight;
                    if(i < cols){
                        iHeightArr[i] = iHeight;
                    }else{
                        minH = Math.min.apply(null,iHeightArr);
                        minHIndex = getMinHeightIndex(iHeightArr, minH);
                        items[i].style.position = "absolute";
                        items[i].style.top = minH + "px";
                        items[i].style.left = items[minHIndex].offsetLeft + "px";
                        iHeightArr[minHIndex] += items[i].offsetHeight;
                    }
                }
            }
    
            var main = g("#main");
    
            /*
            *获取元素数组中最小高度元素的index
            */
            function getMinHeightIndex(arr, minHeight){
                for(var i =0;i < arr.length;i++){
                    if(arr[i] === minHeight)
                        return i;
                }
                return -1;
            }
    
            function checkScroll(){
                var items = g(".item");
                var doc = document.documentElement, body = document.body;
                var lastItemHeight = items[items.length - 1].offsetTop + Math.floor(items[items.length - 1].offsetHeight /2);//最后一个item距离网页顶部+自身高度的一半,这样未滚到底就开始加载
                var scrollTop = doc.scrollTop || body.scrollTop;
                var documentHeight = doc.clientHeight;
                return lastItemHeight < scrollTop + documentHeight;
            }
        </script>
    </head>
    <body>
        <div id="main">
            <div class="item">
                <div class="box"><img src="images/01/img (1).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (2).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (3).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (4).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (5).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (6).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (7).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (8).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (9).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (10).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (11).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (12).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (13).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (14).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (15).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (16).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (17).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (18).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (19).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (20).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (21).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (22).jpg" alt=""></div>
            </div>
            <div class="item">
                <div class="box"><img src="images/01/img (23).jpg" alt=""></div>
            </div>
        </div>
    </body>
    </html>
    三、jQuery
      实现原理:同上一种,用jQuery,只为简化dom操作代码
      上代码:
      
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>waterFall03</title>
        <style>
            *{
                padding: 0;
                margin: 0;
            }
            .box{
                position: relative;
                float: left;
            }
            .content{
                padding: 10px;
                border: 1px solid #ccc;
                box-shadow: 0 0 5px #ccc;
                border-radius: 5px;
            }
            .content img{
                width: 180px;
                height: auto;
            }
        </style>
        <script src="jquery-2.1.1.min.js"></script>
        <script>
        $(function(){
            $(window).on("load",function(){
                imgLocation();
                var dataImg = {"data":[{"src":"img (1).jpg"},{"src":"img (2).jpg"},{"src":"img (3).jpg"},{"src":"img (4).jpg"},{"src":"img (5).jpg"},{"src":"img (6).jpg"},{"src":"img (7).jpg"}]};
                window.onscroll = function(){
                    if(scrollside()){
                        $.each(dataImg.data,function(index,value){
                            var box = $("<div>").addClass("box").appendTo($("#container"));
                            var content = $("<div>").addClass("content").appendTo(box);
                            $("<img>").attr("src","images/01/"+$(value).attr("src")).appendTo(content);
                        });
                        imgLocation();
                    }
                };
            });
        });
    
    
        function scrollside(){
            var box = $(".box");
            var lastboxHeight = box.last().get(0).offsetTop+Math.floor(box.last().height()/2);
            var documentHeight = $(document).width();
            var scrollHeight = $(window).scrollTop();
            return (lastboxHeight<scrollHeight+documentHeight)?true:false;
        }
    
        function imgLocation(){
            var box = $(".box");
            var boxWidth = box.eq(0).width();
            var num = Math.floor($(window).width()/boxWidth);
            var boxArr=[];
            box.each(function(index,value){
                var boxHeight = box.eq(index).height();
                if(index<num){
                    boxArr[index]= boxHeight;
                }else{
                    var minboxHeight = Math.min.apply(null,boxArr);
                    var minboxIndex = $.inArray(minboxHeight,boxArr);
                    $(value).css({
                        "position":"absolute",
                        "top":minboxHeight,
                        "left":box.eq(minboxIndex).position().left
                    });
                    boxArr[minboxIndex]+=box.eq(index).height();
                }
            });
        }
        </script>
    </head>
    <body>
        <div id="container">
            <div class="box">
                <div class="content">
                    <img src="images/01/img (1).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (2).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (3).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (4).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (5).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (6).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (7).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (8).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (9).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (10).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (11).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (12).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (13).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (14).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (15).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (16).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (17).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (18).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (19).jpg">
                </div>
            </div>
            <div class="box">
                <div class="content">
                    <img src="images/01/img (20).jpg">
                </div>
            </div>
        </div>
    </body>
    </html>

    附:代码包下载链接

  • 相关阅读:
    如何通过网页远程控制linux --远程访问Linux桌面
    用Python快速实现HTTP和FTP服务器
    两台server间测速工具iperf3
    向Linux进程发送信号
    谓语必须为动词或动词短语~
    2021-6-2 支撑
    运用学过的设计原则和思想完善之前讲的性能计数器项目(下)
    运用学过的设计原则和思想完善之前讲的性能计数器项目(上)
    总结回顾面向对象、设计原则、编程规范、重构技巧等知识点
    实战二(下):重构ID生成器项目中各函数的异常处理代码
  • 原文地址:https://www.cnblogs.com/w3cape/p/4649856.html
Copyright © 2011-2022 走看看