带你来写瀑布流布局

前言:什么是瀑布流布局?

比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。

例如:找网上找了一张比较漂亮的瀑布流布局的图片

 

 

下面我们就来实现一下布局

1.纯css实现瀑布流

前提:图片的宽度固定,高度不固定。

<!DOCTYPE HTML>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>CSS3瀑布布局</title>
    <style>
        .container {
            -webkit-column-width: 200px;
            -moz-column-width: 200px;
            -o-colum-width: 200px;
            -webkit-column-gap: 1px;
            -moz-column-gap: 1px;
            -o-column-gap: 1px;
        }

        div:not(.container) {
            display: inline-block;
            width: 200px;
            position: relative;
            margin: 2px;
        }
    </style>
</head>

<body>
    <section>
        <div class="container">
            <div >
                <img src="./css/01.jpg" alt="">
            </div>
            <div >
                <img src="./css/02.jpg" alt="">
            </div>
            <div >
                <img src="./css/03.jpg" alt="">
            </div>
            <div >
                <img src="./css/04.jpg" alt="">
            </div>
            <div >
                <img src="./css/05.jpg" alt="">
            </div>
            <div >
                <img src="./css/06.jpg" alt="">
            </div>
            <div >
                <img src="./css/07.jpg" alt="">
            </div>
            <div >
                <img src="./css/08.jpg" alt="">
            </div>
            <div >
                <img src="./css/09.jpg" alt="">
            </div>
            <div >
                <img src="./css/10.jpg" alt="">
            </div>
            <div >
                <img src="./css/11.jpg" alt="">
            </div>
            <div >
                <img src="./css/12.jpg" alt="">
            </div>
        </div>
    </section>
</body>

</html>

效果:

 

 

 

2.利用column实现

<!DOCTYPE html>
<html>

<head>
    <style>
        .box {
            margin: 10px;
            column-count: 3; // 每行显示的几个
            column-gap: 10px;
        }

        .box div {
            margin-bottom: 10px;
        }

    </style>
</head>

<body>
<div class="box">
        <div >
            <img src="./css/01.jpg" alt="">
        </div>
        <div >
            <img src="./css/02.jpg" alt="">
        </div>
        <div >
            <img src="./css/03.jpg" alt="">
        </div>
        <div >
            <img src="./css/04.jpg" alt="">
        </div>
        <div >
            <img src="./css/05.jpg" alt="">
        </div>
        <div >
            <img src="./css/06.jpg" alt="">
        </div>
        <div >
            <img src="./css/07.jpg" alt="">
        </div>
        <div >
            <img src="./css/08.jpg" alt="">
        </div>
        <div >
            <img src="./css/09.jpg" alt="">
        </div>
        <div >
            <img src="./css/10.jpg" alt="">
        </div>
        <div >
            <img src="./css/11.jpg" alt="">
        </div>
        <div >
            <img src="./css/12.jpg" alt="">
        </div>
    </div>
</body>

效果:

 

 

 

 

  css实现瀑布流布局不止这两种方法,也可以利用flex布局,我这边就不写了。

3.利用js实现

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>瀑布流</title>
    <style type="text/css">
        *{margin: 0; padding: 0;}
        #main{
            margin :0 auto;
            position: relative;
        }
        .box{
            float: left;
            padding: 15px 0 0 15px;
        }
        .pic{
            padding: 10px;
            border:1px solid #ccc;
            box-shadow: 0 0 5px #ccc;
        }
        .box .pic{
            width: 200px;
        }
    </style>
</head>
<body>
<div id="main">
        <div class="box">
            <div class="pic">
                <img src="./css/01.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/02.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/03.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/04.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/05.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/06.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/07.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/08.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/09.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/10.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/11.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="./css/12.jpg" alt="">
            </div>
        </div>
    </div>
    <script type="text/javascript">
        window.onload = function(){
            waterfall('main','box');
        }
 
        function waterfall(parent,box){
            //获取main元素
            var oparent = document.getElementById(parent);
 
            //获取所有 box 元素
            var obox = getClass('box');
 
            //获取每行能放多少个 居中摆放
            var w = document.body.clientWidth||document.documentElement.clientWidth;
            //var w =1000;
            var oneWidth = obox[0].offsetWidth;
            var num = Math.floor(w/oneWidth);
            main.style.width = num*oneWidth+'px';
 
            //瀑布流原理  left-下标*图片width top-上面图片高
            var hrr = [];
            for(var i=0;i<obox.length;i++){
                if(i<num){
                    hrr.push(obox[i].offsetHeight);
                }else{
                    var min = Math.min.apply(null,hrr);
                    var index = getindex(hrr,min);
                    obox[i].style.position = 'absolute';
                    obox[i].style.left = index*oneWidth+'px';
                    obox[i].style.top = min+'px';
                    hrr[index] += obox[i].offsetHeight;
                }
            }
            console.log(hrr);
        }
 
        //获取 数组内指定值的 序号
        function getindex(hrr,h){
            for(var i=0;i<hrr.length;i++){
                if(hrr[i]==h){
                    return i;
                }
            }
        }
 
        //统计所有指定class名称的元素
        function getClass(a){
            var doms = document.getElementsByTagName('*');
            var reg = new RegExp('\\b'+a+'\\b');
            var arr = [];
            for(var i=0;i<doms.length;i++){
                if(reg.test(doms[i].className)){
                    arr.push(doms[i]);
                }
            }
            return arr;
        }
 
    </script>

效果:

 

 

 4.利用jquery实现

其实juery和javascript实现差不多,但是比js简便多了,我这边就不写了。

结:

多一点学习多一点分享...

posted @ 2020-04-30 16:25  迷茫_D  阅读(412)  评论(0编辑  收藏  举报