### CSS瀑布流布局

最终效果描述

图片应该是等宽的,且上下之间衔接很完美的,依照从左到右,由上至下的规则排列,是有序的而不是无序的。

代码部分

html:

  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    .container {
      display: flex;
      flex-wrap: wrap;
      width: 100%;
    }
    .container .item {
      position: relative;
      width: 400px;
      padding: 2px;
      counter-increment: imgcount;
      align-self: flex-start;
    }
    .container .item img {
      display: block;
      width: 100%;
    }
    .item::after {
      content: counter(imgcount);
      position: absolute;
      display: inline-block;
      top: 2px;
      left: 2px;
      width: 20px;
      line-height: 20px;
      text-align: center;
      color: #fff;
      background-color: rgba(0, 0, 0, 0.6);
    }
  </style>
  <body>
    <div class="container">
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg3.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/p2.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg5.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg9.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg6.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg7.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg8.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg7.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg6.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg3.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/p4.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg5.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg9.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg8.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg8.jpeg"
          alt=""
        />
      </div>
      <div class="item">
        <img
          src="https://qlbb-1302868537.cos.ap-beijing.myqcloud.com/prettyGirl/pg8.jpeg"
          alt=""
        />
      </div>
    </div>
  </body>

js:
我的思路是给定照片一个固定的宽度,但是我想让在不知道盒子的宽度大小的情况下,然后依然充满这个盒子,然后在高度的处理上,我们先算出一列有多少个元素,然后根据列数设定一个高度记录数组column_num_yArr ,这个数组用来记录每遍历一层时候的每一列的高度,这样我们遍历下一层的时候就可以根据这个高度数组进行定位操作。

    let waterfall_layoutf = function () {
      let container_dom = document.querySelector(".container");
      let container_width = container_dom.offsetWidth;
      let imgItem_dom_list = Array.from(document.querySelectorAll(".item"));
      // 计算出每行列数
      let column_count = Math.floor(
        container_width / imgItem_dom_list[0].offsetWidth
      );
      // 计算出每列应该缩放多大才能撑满
      let extral_width =
        container_width - imgItem_dom_list[0].offsetWidth * column_count;
      let newWidth = (
        extral_width / 3 +
        imgItem_dom_list[0].offsetWidth
      ).toFixed(3);
      let proportion = (newWidth / imgItem_dom_list[0].offsetWidth).toFixed(3);
      let column_num = 0;
      let column_num_yArr = new Array(column_count).fill(0);
      imgItem_dom_list.forEach((ele, index) => {
        ele.style.width = newWidth + "px";
        if (column_num % column_count === 0) {
          // 说明到新的一行 列要重新编排位置 主要是高度要重新编排
          column_num = 0;
        }
        let offsetTop = (ele.offsetTop - column_num_yArr[column_num]) * -1;
        ele.style.top = offsetTop + "px";
        /* ele.style.top =
          (ele.offsetTop - column_num_yArr[column_num]) * -1 + "px";
          console.log(column_num_yArr[column_num]); */
        column_num_yArr[column_num++] += ele.offsetHeight;
      });
    };
    window.onload = function () {
      waterfall_layoutf();
      // 计算列数 平均缩放至撑满宽度
      // 获取第一列高度  从第一个元素开始放 主要是要获取每个元素的height值
      // 这个时候得用一个循环每个元素从左到右按顺序排放
      window.addEventListener("resize", waterfall_layoutf);
    };

改进

以上代码在屏幕宽度变化的时候就不起作用了,因此我决定再声明一个全局变量originWidth记录item的初始宽度。let originWidth = originWidth = document.querySelector(“.item”).offsetWidth; 这样的时候缩放也有效果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值