js 编写页面瀑布流布局

页面宽度,图片大小高度不同。如何在网页上呈现出更为美观的布局。
有些网站的主体内容需要用户自己上传图片内容。用户上传什么样的图片,
内容无法确定。页面为了美观需要按照一定的审美来排列。
如何实现瀑布流布局如下:

<style>
        .cont{margin: 0 auto;position: relative;}
        .box{float: left;padding: 4px;}
        .imgbox{border: solid 1px black;padding: 4px;border-radius: 4px;}
        .imgbox img{width: 200px;display: block;}
    </style>
    <script>
        // 最后加载。
        onload=function(){
            var wf =new WaterF()
            wf.init();
        }

        class WaterF{
             constructor(){
                引入元素
               this.clientW=document.documentElement.clientWidth;
               this.abox=document.querySelectorAll(".box");
               this.cont=document.querySelector(".cont");
             }
             init(){
                // 初始化样式。计算出瀑布流。最大DIV的宽度。和每一行要放的个数。
              this.maxNum=parseInt(this.clientW/this.abox[0].offsetWidth);
              this.cont.style.width=this.maxNum*this.abox[0].offsetWidth+"px";
              执行第一行
              this.firstLine();
              this.otherLine();
             }
            //  瀑布流第一行。需要拿到第一行每一个元素的高度。
            //  以方便下一行获取到第一行的每一个元素的高度。
             firstLine(){
            //  将第一行每一个元素的高度放在一个数组中。
                 this.heightArr=[];
                 for(var i=0;i<this.maxNum;i++){
                     this.heightArr.push(this.abox[i].offsetHeight);
                 }
             }
            //  除了第一行以外的,以下行数。
             otherLine(){
                // 遍历除第一行,以外的每一行的每一个元素。
                  for(var i=this.maxNum;i<this.abox.length;i++){
                    // 上一行元素高度的最小值。
                      var min=getMin(this.heightArr);
                    //   上一行最高度最小的。索引。
                      var minIndex=this.heightArr.indexOf(min);
                    //   将每一个当前行元素加上定位。
                      this.abox[i].style.position = "absolute";
                    //   优先定位到上一行高度最小的。图片下
                      this.abox[i].style.top = min + "px";
                    //   按照索引。找到上一行高度值最小的图片位置。
                      this.abox[i].style.left = minIndex * this.abox[0].offsetWidth + "px";
                    //   配合循环。每次向高度最小。只放入一个元素时,
                    //  都需要加上被放入的那个元素高度值。
                    //   将这两个元素的高度也同时纳入。高度计算中,
                      this.heightArr[minIndex] = this.heightArr[minIndex] + this.abox[i].offsetHeight;
                }
            }
        }
        // 封装函数拿到最小值。
        function getMin(arr){
            var myarr = [];
            for(var j=0;j<arr.length;j++){
                myarr.push(arr[j]);
            }
            return myarr.sort((a,b)=>a-b)[0];
        }
    </script>
</head>
<body>
    <div class="cont">
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
        <div class="box">
            <div class="imgbox">
                <img src="引入的图片" alt="">
            </div>
        </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值