0

0

0

修罗

站点介绍

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

js瀑布流

修罗 2020-11-20 1899 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)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

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

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

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