简单瀑布流

简介: 简单瀑布流

瀑布流

什么是瀑布流

又称为瀑布流布局,是一种比较经典的网站布局方式,尤其多见于图片较多的页面。常见有两种瀑布流方式。分别为

  1. 定宽不定高
  2. 定高不定宽

定宽不定高

定高不定宽

IU~X(C1XH(%9E4N{E3OUQ_F.png

定宽不定高-思路

  1. 动态生成 1000 个 li 标签,设置统一的宽度 设置透明度 (实际开发中,只需要获取 1000 个图片对应的高度即可)
  2. 开启定时器,每一行只放 3 个 li 标签 ,三个 li 标签,按照正常顺序依次摆放即可,后面的 li 标签切换逻辑
  3. 每显示一个 li 标签,就需要自己维护好一个数组 [第 1 列的 li 标签高度集合,第 2 列的 li 标签高度集合,第 3 列的 li 标签高度集合]
  4. 统计出那一列 最低 和 对应的下标(0,1,2)
  5. 将下一个 li 标签 放在对应下标的位置,同时计算出下标对应列的高度总和,设置为 即将显示的 li 标签的 top

代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      li {
        width: 33.33%;
        border: 1px solid #000;
        font-size: 30px;
        text-align: center;
        position: absolute;
        top: 0;
        left: 0;
        list-style: none;
      }
    </style>
  </head>
  <body>
    <ul></ul>
    <script>
      init();
      function init() {
        const ul = document.querySelector("ul");
        for (let index = 0; index < 1000; index++) {
          const li = document.createElement("li");
          li.innerText = index;
          li.style.backgroundColor = getRandomColor();
          li.style.height =
            Math.floor(Math.random() * (200 - 50 + 1) + 50) + "px";
          li.style.opacity = "0";
          ul.appendChild(li);
        }
        function getRandomColor() {
          const color1 = Math.floor(Math.random() * 256);
          const color2 = Math.floor(Math.random() * 256);
          const color3 = Math.floor(Math.random() * 256);
          return `rgb(${color1},${color2},${color3})`;
        }
        setWaterFall();
        function setWaterFall() {
          const lis = [...document.querySelectorAll("li")];
          let index = 0;
          const heightList = [[], [], []];
          const timeId = setInterval(() => {
            const li = lis.shift();
            if (!li) {
              clearInterval(timeId);
              return;
            }
            if (index < 3) {
              const left = index * li.clientWidth + "px";
              li.style.left = left;
              heightList[index].push(li.clientHeight);
            } else {
              // 计算出3个列分别对应的高度 [1,2,3]
              const sumHeightList = heightList.reduce(
                (sumColumnHeight, columnList) => [
                  ...sumColumnHeight,
                  columnList.reduce((a, b) => a + b, 0),
                ],
                []
              );
              const { minIndex, minHeight } = getMinIndex(sumHeightList);
              const left = minIndex * li.clientWidth + "px";
              const top = minHeight + "px";
              li.style.left = left;
              li.style.top = top;
              heightList[minIndex].push(li.clientHeight);
            }
            li.style.opacity = "1";
            index++;
          }, 500);
        }
        function getMinIndex(arr) {
          let minIndex = 0;
          let minHeight = arr[0];
          for (let index = 0; index < arr.length; index++) {
            const element = arr[index];
            if (minHeight > element) {
              minHeight = element;
              minIndex = index;
            }
          }
          return { minIndex, minHeight };
        }
      }
    </script>
  </body>
</html>

效果


目录
相关文章
|
5月前
|
JavaScript
uniapp实现瀑布流
uniapp实现瀑布流
|
2月前
瀑布流布局
瀑布流布局
28 0
图文混排
3.7 图文混排 3.7.1 插入图片和剪贴画 1、插入图片 1嵌入式对象: 只能放置到有文档插入点的位置。 不能与其他对象同时选择,不能与其他对象组合。 可以与正文一起排版,但不能实现环绕。 2浮动式对象: 可以放置到页面的任意位置。 可以同时选择多个对象,并允许与其他对象组合。 还可以与正文实现多种形式的环绕。 嵌入式对象 浮动式对象 位置 插入点位置 任意位置 同时选择、组合 不能 能 与正文排版 能 能 环绕 不能 能 默认 图片、剪贴画 形状、艺术字、文本框 非嵌入式(浮动式)对象的环绕方式: 四周型 上下型 紧密型 浮于文字上方 穿越型 衬于文字下方 三种插入
|
5月前
uniapp实现瀑布流?
uniapp实现瀑布流?
|
JavaScript
jquery插件-瀑布流-52
jquery插件-瀑布流-52
92 0
jquery插件-瀑布流-52
|
容器
利用CustomScrollView实现更有趣的滑动效果
本篇介绍了 CustomScrollView 的基本用法以及 SliverAppBar 的使用,通过 SliverAppBar 可以让导航栏的滑动更有趣。
801 0
利用CustomScrollView实现更有趣的滑动效果
|
数据安全/隐私保护
瀑布流的实现
瀑布流的实现
181 0
瀑布流的实现
|
Android开发
Android图片选择器,仿微信的图片选择器的样式和效果。支持图片预览和图片切换
Android图片选择器,仿微信的图片选择器的样式和效果。支持图片的单选、限数量的多选和不限数量的多选。支持图片预览和图片文件夹的切换。支持图片单选并剪裁。 先上效果图: 1、引入依赖 在Project的build.gradle在添加以下代码 allprojects { repositories { ... maven { url 'https://jitpack.io' } // 如果你使用的是1.4.0或更早的版本,这句可以不用。
6028 0
|
Android开发 Kotlin 数据格式
ScrollView滑动—仿微博主页标题栏渐变悬浮及Fragment实现多个内容页面切换
作为一名热爱学习的Android开发工程si,刷微博的时候居然还想着技术呢,觉得自己也是够够了........哈哈哈 image.png 进入今天的正题,微博主页大家肯定是看过的,先看一下微博的效果。
2005 0