JS—实现瀑布流效果

JS—实现瀑布流效果

实现效果

在这里插入图片描述

实现思路:通过页面判断宽度来构造数组的长度,寻找数组的最小值下标,来插入图片

代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>瀑布流布局</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      body {
        background: url("./images/1.jpg");
        background-attachment: fixed;
        background-size: cover;
      }
      .contain {
        margin: 0 auto;
        width: 768px;
        position: relative;
      }
      img {
        position: absolute;
        width: 200px;
      }
    </style>
  </head>
  <body>
    <div class="contain">
      <img src="./images/5.jpg" alt="" srcset="" />
      <img src="./images/6.jpg" alt="" srcset="" />
      <img src="./images/1.jpg" alt="" srcset="" />
      <img src="./images/2.jpg" alt="" srcset="" />
      <img src="./images/111.jpg" alt="" srcset="" />
      <img src="./images/5.jpg" alt="" srcset="" />
      <img src="./images/333.jpg" alt="" srcset="" />
      <img src="./images/4.jpg" alt="" />
      <img src="./images/222.jpeg" alt="" srcset="" />
      <img src="./images/444.jpeg" alt="" srcset="" />
      <img src="./images/333.jpg" alt="" srcset="" />
      <img src="./images/555.jpeg" alt="" srcset="" />
    </div>
    <script>
      window.addEventListener("load", () => {
        let imgWidthKI = 8; // 页面宽度与图片宽度的比列
        setInterval(() => {
          let t = document
            .querySelector(".contain")
            .getBoundingClientRect().width;
          let imgWidth = Math.floor(
            document.documentElement.clientWidth / imgWidthKI
          );
          waterfall(t, imgWidth);
        }, 1000);

        function startArrayValue(array) {
          // 对创建的数组设置初始值
          for (let index = 0; index < array.length; index++) {
            array[index] = 0;
          }
        }
        function getArrayIndex(array) {
          // 求出当前数组中的最小位置索引
          const minIndex = array.indexOf(Math.min(...array));
          return minIndex;
        }
        function waterfall(divWidth, imgWidth) {
          let containWidth = divWidth;
          let imgList = document.querySelectorAll("img");
          let imgElementWidth = imgList[0].clientWidth; // 获取每一个Img 标签的宽度
          const col = Math.floor(containWidth / imgElementWidth); // 获取当前应该多少列
          let DivContain = new Array(col);
          startArrayValue(DivContain);
          let interval = Number(
            ((containWidth % imgElementWidth) / (col + 1)).toFixed(3)
          ); // 对间隔的值进行保留三位小数
          // 设置每一个元素的位置,且间隔的值为多少
          for (let index = 0; index < imgList.length; index++) {
            const element = imgList[index];
            const insertIndex = getArrayIndex(DivContain);
            element.style.width = `${imgWidth}px`;
            element.style.left = `${
              interval * (insertIndex + 1) + imgElementWidth * insertIndex
            }px`;
            element.style.top = `${DivContain[insertIndex] + 20}px`;
            // 同时,将高度,添加到数组里面
            DivContain[insertIndex] += element.clientHeight + 20;
          }
        }
      });
    </script>
  </body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值