0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

js瀑布流

修罗 2020-11-20 1695 0条评论 JS

首页 / 正文

js瀑布流

代码:https://gitee.com/huiyani/js20/tree/master/12.waterfall

编写结构

1605802678676.png

浮动布局显示

注意:确定每张图片设置等宽

1605802788266.png

js编写

1、定义一些变量

// container盒子
let oParent = document.getElementById("container");
// 所有图片外层box
let boxArr = oParent.querySelectorAll("#container > .box");
// 初始为第一行图片的offsetHeight数组
let heightArr = [];
// 图片宽度,定宽
let imgWidth = 0;

2、瀑布流算法

分析:

  • 当前视口宽度/图片宽度,得到一行显示图片张数,再计算(图片张数*图片宽度)父容器宽度,此时容器的margin 0 auto可以使容器在浏览器视口居中。
  • 通过定位设置图片位置,第一行图片不用定位,将第一行图片高度放在heightArr数组中,拿到数组中最小高度的索引,即确定了此最小高度图片的位置,将后面图片定位在此图片下面。
// 布局
function imgLocation() {
  // 一张图片宽度
  imgWidth = boxArr[0].offsetWidth;
  // 当前视口/图片宽度 = 一排显示图片列数。
  var num = Math.floor(document.documentElement.clientWidth / imgWidth);
  // 动态计算父级的宽度以居中(一张图片时父级容器width也是一张图片的宽度)
  oParent.style.cssText = `width: ${imgWidth * num}px`;
  // 计算图片的高度
  heightArr = [];
  boxArr.forEach((v, i) => {
    // 计算当前每列高度
    if (i < num) {
      heightArr.push(v.offsetHeight);
      // 超出列数的序列号,进行内容归位
    } else {
      appendImg(v);
    }
  });
  // console.log(heightArr);
}

3、第一行图片之后的图片定位

// 图片归位
function appendImg(ele) {
  // 获取最小高度
  let minHeight = Math.min(...heightArr);
  // 最小高度的索引
  let index = heightArr.indexOf(minHeight);
  // 数组最小高度再加上当前ele的高度,后面如果有图片就定位在ele下面
  heightArr[index] = minHeight + ele.offsetHeight;
  // 定位
  ele.style.position = "absolute";
  ele.style.top = minHeight + "px";
  // v.style.left = boxArr[index].offsetLeft + "px";
  ele.style.left = index * imgWidth + "px";
}

4、调用

// 因为图片是异步加载,必须等所有资源加载完毕再执行,否则可能获取不到图片信息,如高度
window.addEventListener("load", imgLocation);

上拉加载

// 模拟加载图片
window.addEventListener("scroll", function () {
  let {
    clientHeight,
    scrollHeight,
    scrollTop,
  } = document.documentElement;
  if (scrollTop + clientHeight > scrollHeight - 10) {
    // 模拟加载
    let old = oParent.innerHTML;
    // console.log(old);
    oParent.innerHTML =
      old +
      `<div class="box">
        <div class="box-img">
          <img src="images/8.jpg" alt="" />
        </div>
      </div>`;
    appendImg(document.querySelector(".box:last-child"));
  }
});

1605803924549.png

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis