vue 瀑布流

废话不多说直接上代码,代码中都有注解

<template>
  <div class="waterfall-wrap">
    <div id="con" class="waterfall">
      <div
        class="category item"
        v-for="(category, categoryIndex) in cardList"
        :key="categoryIndex"
      >
        <div class="item-wrap">
          <div class="text-wrap">
            <h3 ref="carditem">
              <i class="myicon" :class="[classArray[categoryIndex]]"></i
              >{{ category.title }}
            </h3>
            <div
              class="text"
              v-for="(item, itemIndex) in category.child"
              :key="itemIndex"
              :class="{ active: currentIndex === item.id }"
              @mouseenter="mouseenter(item)"
              @mouseleave="mouseenter('')"
            >
              <span>{{ item.subTitle }}</span>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      currentIndex: "",
      items: [], // 项目数据
      cardList: [
        // 卡片列表数据
        // 每个卡片包含标题和子项
        {
          title: "工具器材",
          id: "1717808578252296192",
          child: [
            {
              subTitle: "2.5P手锤1把",
              id: "1717808578252296192-1717808601870422016",
            },
            {
              subTitle: "矿用照明灯",
              id: "1717808578252296192-1717808612670754816",
            },
            {
              subTitle: "一字螺丝刀(2×75毫米)",
              id: "1717808578252296192-1717808623865352192",
            },
            {
              subTitle: "一字螺丝刀(6×200毫米)",
              id: "1717808578252296192-1717808655331020800",
            },
            {
              subTitle: "十字螺丝刀(2×75毫米)",
              id: "1717808578252296192-1717808655331020801",
            },
            {
              subTitle: "十字螺丝刀(6×200毫米)",
              id: "1717808578252296192-1717808655331020802",
            },
            {
              subTitle: "活动扳手",
              id: "1717808578252296192-1717808655331020803",
            },
            {
              subTitle: "美工刀",
              id: "1717808578252296192-1717808655331020804",
            },
            {
              subTitle: "9件加长内六角扳手组套",
              id: "1717808578252296192-1717808655331020805",
            },
            {
              subTitle: "剥线钳",
              id: "1717808578252296192-1717808655331020806",
            },
            {
              subTitle: "钢丝钳",
              id: "1717808578252296192-1717808655331020807",
            },
            {
              subTitle: "斜嘴钳",
              id: "1717808578252296192-1717808655331020808",
            },
            {
              subTitle: "尖嘴钳",
              id: "1717808578252296192-1717808655331020809",
            },
            {
              subTitle: "三用网线钳",
              id: "1717808578252296192-1717808655331020810",
            },
            {
              subTitle: "水泵钳",
              id: "1717808578252296192-1717808655331020811",
            },
            {
              subTitle: "三叉套筒扳手",
              id: "1717808578252296192-1717808655331020812",
            },
            {
              subTitle: "卷尺",
              id: "1717808578252296192-1717808655331020813",
            },
            {
              subTitle: "膨胀螺丝(M12)",
              id: "1717808578252296192-1717808655331020814",
            },
            {
              subTitle: "膨胀螺丝(M10)",
              id: "1717808578252296192-1717808655331020815",
            },
            {
              subTitle: "防爆风钻",
              id: "1717808578252296192-1717808655331020816",
            },
            {
              subTitle: "断线钳(12寸 300mm)",
              id: "1717808578252296192-1717808655331020817",
            },
            {
              subTitle: "铝合金人字梯(3M)",
              id: "1717808578252296192-1717808655331020818",
            },
            {
              subTitle: "铝合金人字梯(2M)",
              id: "1717808578252296192-1717808655331020819",
            },
            {
              subTitle: "扁铲",
              id: "1717808578252296192-1717808655331020820",
            },
            {
              subTitle: "撬棍",
              id: "1717808578252296192-1717808655331020821",
            },
            {
              subTitle: "吊装带",
              id: "1717808578252296192-1717808655331020822",
            },
            {
              subTitle: "设备架",
              id: "1717808578252296192-1717808655331020823",
            },
            {
              subTitle: "电缆走向牌",
              id: "1717808578252296192-1717808655331020824",
            },
            {
              subTitle: "红光笔",
              id: "1717808578252296192-1717808655331020825",
            },
            {
              subTitle: "光缆转接头",
              id: "1717808578252296192-1717808655331020826",
            },
            {
              subTitle: "挂线架",
              id: "1717808578252296192-1717808655331020827",
            },
            {
              subTitle: "架线架",
              id: "1717808578252296192-1717808655331020828",
            },
          ],
        },
        {
          title: "材料",
          id: "1717808655331020829",
          child: [
            {
              subTitle: "螺栓松动剂",
              id: "1717808655331020829-1717808655331020830",
            },
            {
              subTitle: "绑扎带(8*300mm)",
              id: "1717808655331020829-1717808655331020831",
            },
            {
              subTitle: "绑扎带(10*650mm)",
              id: "1717808655331020829-1717808655331020832",
            },
            {
              subTitle: "煤矿用层绞式单模阻燃通信光缆",
              id: "1717808655331020829-1717808655331020833",
            },
            {
              subTitle: "矿用通信电缆 MHYVP 10×2×1/0.97",
              id: "1717808655331020829-1717808655331020834",
            },
            {
              subTitle: "矿用通信电缆 MHYVP 5×2×1/0.97 ",
              id: "1717808655331020829-1717808655331020835",
            },
            {
              subTitle: "矿用通信电缆 MHYVP 1×4×1/0.97 ",
              id: "1717808655331020829-1717808655331020836",
            },
            {
              subTitle: "矿用通信电缆 MHYVP 1×2×7/0.43",
              id: "1717808655331020829-1717808655331020837",
            },
            {
              subTitle: "煤矿用层绞式单模阻燃通信光缆 MGTSV 24B",
              id: "1717808655331020829-1717808655331020838",
            },
            {
              subTitle: "煤矿用层绞式单模阻燃通信光缆 MGTSV 48B",
              id: "1717808655331020829-1717808655331020839",
            },
            {
              subTitle: "煤矿用层绞式单模阻燃通信光缆 MGTSV 12B",
              id: "1717808655331020829-1717808655331020840",
            },
            {
              subTitle: "矿用控制电缆 MKVVR 450/750 3×2.5mm2",
              id: "1717808655331020829-1717808655331020841",
            },
            {
              subTitle: "矿用控制电缆 MHYV4 4×2×0.5mm3",
              id: "1717808655331020829-1717808655331020842",
            },
            {
              subTitle: "矿用本安电路用接线盒",
              id: "1717808655331020829-1717808655331020843",
            },
            {
              subTitle: "隔爆接线盒",
              id: "1717808655331020829-1717808655331020844",
            },
            {
              subTitle: "尾纤 FC-SC类型",
              id: "1717808655331020829-1717808655331020845",
            },
            {
              subTitle: "尾纤 FC-FC类型",
              id: "1717808655331020829-1717808655331020846",
            },
            {
              subTitle: "尾纤 SC-SC类型",
              id: "1717808655331020829-1717808655331020847",
            },
            {
              subTitle: "尾纤 SC-LC类型",
              id: "1717808655331020829-1717808655331020848",
            },
            {
              subTitle: "尾纤 LC-LC类型",
              id: "1717808655331020829-1717808655331020849",
            },
            {
              subTitle: "防爆密封圈",
              id: "1717808655331020829-1717808655331020850",
            },
            {
              subTitle: "电话线专用水晶头(五类)",
              id: "1717808655331020829-1717808655331020851",
            },
            {
              subTitle: "电话线专用水晶头(六类)",
              id: "1717808655331020829-1717808655331020852",
            },
            {
              subTitle: "网线专用水晶头(超五类)",
              id: "1717808655331020829-1717808655331020853",
            },
            {
              subTitle: "网线专用水晶头(六类)",
              id: "1717808655331020829-1717808655331020854",
            },
            {
              subTitle: "扁铜线",
              id: "1717808655331020829-1717808655331020855",
            },
            {
              subTitle: "润滑剂",
              id: "1717808655331020829-1717808655331020856",
            },
            {
              subTitle: "干燥剂",
              id: "1717808655331020829-1717808655331020857",
            },
            {
              subTitle: "光缆接续盒",
              id: "1717808655331020829-1717808655331020858",
            },
            {
              subTitle: "挡圈/挡板",
              id: "1717808655331020829-1717808655331020859",
            },
            {
              subTitle: "防爆尾纤",
              id: "1717808655331020829-1717808655331020860",
            },
            {
              subTitle: "法兰",
              id: "1717808655331020829-1717808655331020861",
            },
          ],
        },
        {
          title: "调试或测试工具",
          id: "1717808655331020862",
          child: [
            {
              subTitle: "光纤熔接机",
              id: "1717808655331020862-1717808655331020863",
            },
            {
              subTitle: "线鼻",
              id: "1717808655331020862-1717808655331020864",
            },
            {
              subTitle: "查话机",
              id: "1717808655331020862-1717808655331020865",
            },
            {
              subTitle: "工程宝",
              id: "1717808655331020862-1717808655331020866",
            },
            {
              subTitle: "光功率计",
              id: "1717808655331020862-1717808655331020867",
            },
            {
              subTitle: "数字万用表",
              id: "1717808655331020862-1717808655331020868",
            },
          ],
        },
        {
          title: "车辆",
          id: "1717808655331020869",
          child: [
            {
              subTitle: "矿用防爆无轨胶轮车",
              id: "1717808655331020869-1717808655331020870",
            },
            {
              subTitle: "特种防爆车",
              id: "1717808655331020869-1717808655331020871",
            },
            {
              subTitle: "防爆工具车",
              id: "1717808655331020869-1717808655331020872",
            },
          ],
        },
        {
          title: "防护用品",
          id: "1717808655331020873",
          child: [
            {
              subTitle: "工作服",
              id: "1717808655331020873-1717808655331020874",
            },
            {
              subTitle: "安全帽",
              id: "1717808655331020873-1717808655331020875",
            },
            {
              subTitle: "自救灯",
              id: "1717808655331020873-1717808655331020876",
            },
            {
              subTitle: "矿灯",
              id: "1717808655331020873-1717808655331020877",
            },
            {
              subTitle: "防尘口罩",
              id: "1717808655331020873-1717808655331020878",
            },
            {
              subTitle: "手套",
              id: "1717808655331020873-1717808655331020879",
            },
            {
              subTitle: "五点式安全绳",
              id: "1717808655331020873-1717808655331020880",
            },
            {
              subTitle: "安全警示灯",
              id: "1717808655331020873-1717808655331020881",
            },
            {
              subTitle: "防砸鞋",
              id: "1717808655331020873-1717808655331020882",
            },
          ],
        },
        {
          title: "人员配备",
          id: "1717808655331020883",
          child: [
            {
              subTitle: "安装回撤工",
              id: "1717808655331020883-1717808655331020884",
            },
            {
              subTitle: "双排车司机",
              id: "1717808655331020883-1717808655331020885",
            },
            {
              subTitle: "运维工程师",
              id: "1717808655331020883-1717808655331020886",
            },
            {
              subTitle: "电工",
              id: "1717808655331020883-1717808655331020887",
            },
            {
              subTitle: "钻孔工",
              id: "1717808655331020883-1717808655331020888",
            },
            {
              subTitle: "焊工",
              id: "1717808655331020883-1717808655331020889",
            },
            {
              subTitle: "普工",
              id: "1717808655331020883-1717808655331020890",
            },
          ],
        },
        {
          title: "设备",
          id: "1717808655331020891",
          child: [
            {
              subTitle: "4G基站",
              id: "1717808655331020891-1717808655331020892",
            },
            {
              subTitle: "5G基站",
              id: "1717808655331020891-1717808655331020893",
            },
            {
              subTitle: "调度电话",
              id: "1717808655331020891-1717808655331020894",
            },
            {
              subTitle: "AI智能摄像头",
              id: "1717808655331020891-1717808655331020895",
            },
            {
              subTitle: "工作面智控中心",
              id: "1717808655331020891-1717808655331020896",
            },
            {
              subTitle: "煤机中继",
              id: "1717808655331020891-1717808655331020897",
            },
            {
              subTitle: "矿用本安型摄像仪",
              id: "1717808655331020891-1717808655331020898",
            },
            {
              subTitle: "工作面网络通讯设备",
              id: "1717808655331020891-1717808655331020899",
            },
          ],
        },
        {
          title: "系统",
          id: "1717808655331020900",
          child: [
            {
              subTitle: "工作面应急广播系统",
              id: "1717808655331020900-1717808655331020901",
            },
            {
              subTitle: "工作面有线通讯系统",
              id: "1717808655331020900-1717808655331020902",
            },
            {
              subTitle: "工作面无线通讯系统",
              id: "1717808655331020900-1717808655331020903",
            },
            {
              subTitle: "工作面智能控制系统",
              id: "1717808655331020900-1717808655331020904",
            },
            {
              subTitle: "工作面视频监控系统",
              id: "1717808655331020900-1717808655331020905",
            },
            {
              subTitle: "工作面人员定位系统",
              id: "1717808655331020900-1717808655331020906",
            },
          ],
        },
        {
          title: "通用运维工具包",
          id: "1717808655331020907",
          child: [
            {
              subTitle: "一字螺丝刀(2×75毫米)",
              id: "1717808655331020907-1717808655331020908",
            },
            {
              subTitle: "一字螺丝刀(6×200毫米)",
              id: "1717808655331020907-1717808655331020909",
            },
            {
              subTitle: "十字螺丝刀(2×75毫米)",
              id: "1717808655331020907-1717808655331020910",
            },
            {
              subTitle: "十字螺丝刀(6×200毫米)",
              id: "1717808655331020907-1717808655331020911",
            },
            {
              subTitle: "活动扳手",
              id: "1717808655331020907-1717808655331020912",
            },
            {
              subTitle: "美工刀",
              id: "1717808655331020907-1717808655331020913",
            },
            {
              subTitle: "9件加长内六角扳手组套",
              id: "1717808655331020907-1717808655331020914",
            },
            {
              subTitle: "剥线钳",
              id: "1717808655331020907-1717808655331020915",
            },
            {
              subTitle: "斜嘴钳",
              id: "1717808655331020907-1717808655331020916",
            },
            {
              subTitle: "三用网线钳",
              id: "1717808655331020907-1717808655331020917",
            },
            {
              subTitle: "水泵钳",
              id: "1717808655331020907-1717808655331020918",
            },
            {
              subTitle: "三叉套筒扳手",
              id: "1717808655331020907-1717808655331020919",
            },
            {
              subTitle: "绑扎带(8*300mm)",
              id: "1717808655331020907-1717808655331020920",
            },
            {
              subTitle: "绑扎带(10*650mm)",
              id: "1717808655331020907-1717808655331020921",
            },
            {
              subTitle: "防爆密封圈",
              id: "1717808655331020907-1717808655331020922",
            },
            {
              subTitle: "网线专用水晶头",
              id: "1717808655331020907-1717808655331020923",
            },
            {
              subTitle: "挡圈/挡板",
              id: "1717808655331020907-1717808655331020924",
            },
            {
              subTitle: "螺栓松动剂",
              id: "1717808655331020907-1717808655331020925",
            },
          ],
        },
        {
          title: "通用劳保套件",
          id: "1717808655331020926",
          child: [
            {
              subTitle: "工作服",
              id: "1717808655331020926-1717808655331020927",
            },
            {
              subTitle: "安全帽",
              id: "1717808655331020926-1717808655331020928",
            },
            {
              subTitle: "自救器",
              id: "1717808655331020926-1717808655331020929",
            },
            {
              subTitle: "矿灯",
              id: "1717808655331020926-1717808655331020930",
            },
            {
              subTitle: "防尘口罩",
              id: "1717808655331020926-1717808655331020931",
            },
            {
              subTitle: "手套",
              id: "1717808655331020926-1717808655331020932",
            },
            {
              subTitle: "安全警示灯",
              id: "1717808655331020926-1717808655331020933",
            },
            {
              subTitle: "防砸鞋",
              id: "1717808655331020926-1717808655331020934",
            },
          ],
        },
      ],
      classArray: [
        // 图标样式类数组
        "el-icon-paperclip",
        "el-icon-reading",
        "el-icon-news",
        "el-icon-cpu",
        "el-icon-present",
        "el-icon-paperclip",
        "el-icon-reading",
        "el-icon-news",
        "el-icon-cpu",
        "el-icon-present",
      ],
    };
  },
  mounted() {
    // 动态生成颜色
    let Elements = this.$refs.carditem; // 获取名为 "carditem" 的引用元素并存储在 Elements 中
    this.random(Elements); // 调用 random 方法,将 Elements 传递为参数

    this.$nextTick(() => {
      window.addEventListener("resize", this.waterFall); // 在下一个 DOM 渲染周期后,监听窗口的大小变化事件,并调用 waterFall 方法
      this.waterFall(); // 调用 waterFall 方法,用于处理瀑布流布局
    });
  },
  methods: {
    // 动态生成颜色
    random(Elements) {
      // 随机设置元素的颜色
      let arr = [
        "#0d79f3",
        "#0bafff",
        "#0fd464",
        "#ffe203",
        "#ff754e",
        "#10d4ff",
        "#8971f5",
        "#c229f7",
        "#00d0b7",
        "#76d400",
      ]; // 颜色数组
      let arrs = [
        "#333",
        "#333",
        "#333",
        "#333",
        "#333",
        "#333",
        "#333",
        "#333",
        "#333",
        "#333",
      ]; // 文本颜色数组
      let num = 0; // 初始化颜色数组的索引

      for (let index = 0; index < Elements.length; index++) {
        let colorArr = arr[num]; // 获取背景颜色
        let colorArrs = arrs[num]; // 获取文本颜色
        let r = Math.round(Math.random() * 255); // 随机生成红色分量
        let g = Math.round(Math.random() * 255); // 随机生成绿色分量
        let b = Math.round(Math.random() * 255); // 随机生成蓝色分量
        let element = Elements[index]; // 获取当前元素
        element.style.color = colorArrs; // 设置文本颜色
        element.style.borderTopColor = colorArr; // 设置元素顶部边框颜色
        num++;
        num = num > 9 ? 0 : num; // 循环使用颜色数组
      }
    },
    mouseenter(items) {
      // 鼠标移入
      this.currentIndex = items.id;
    },
    waterFall() {
      // 核心计算瀑布流布局
      let container = document.getElementById("con"); // 获取瀑布流容器
      let itemElements = container.querySelectorAll(".item"); // 获取所有子元素
      let width = itemElements[0].offsetWidth; // 获取第一个子元素的宽度
      let clientWidth = document.documentElement.clientWidth; // 获取可见区域的宽度
      let columnCount = Math.floor(clientWidth / width); // 计算列数
      container.style.width = columnCount * width + "px"; // 设置容器的宽度,以适应列数

      let columnHeights = new Array(columnCount).fill(0); // 创建一个数组来存储每列的高度

      for (let i = 0; i < itemElements.length; i++) {
        if (i < columnCount) {
          // 如果是第一行
          itemElements[i].style.top = "0px"; // 设置top值为0
          itemElements[i].style.left = i * width + "px"; // 设置left值为列的偏移
          columnHeights[i] = itemElements[i].offsetHeight; // 更新第一行每列的高度
        } else {
          // 如果不是第一行
          let minColumnHeight = Math.min(...columnHeights); // 找到最小的列高度
          let columnIndex = columnHeights.indexOf(minColumnHeight); // 找到最小高度列的索引
          itemElements[i].style.top = minColumnHeight + "px"; // 设置top值为最小列的高度
          itemElements[i].style.left = columnIndex * width + "px"; // 设置left值为最小列的偏移
          columnHeights[columnIndex] += itemElements[i].offsetHeight; // 更新最小列的高度
        }
      }
    },
  },
};
</script>
<style lang="scss">
.waterfall-wrap {
  padding: 10px; /* 设置内边距为 10 像素 */
  height: calc(100% - 20px); /* 高度为父容器高度减去 20 像素 */
  padding-right: 0; /* 右内边距为 0 */
  width: calc(
    100% - 10px
  ) !important; /* 宽度为父容器宽度减去 10 像素,使用 !important 来覆盖其他样式 */
  overflow-y: auto; /* 垂直方向出现滚动条时显示滚动条 */
  overflow-x: hidden; /* 隐藏水平方向的滚动条 */
}

.active {
  color: #0d79f3; /* 设置文本颜色为 #0d79f3 */
  .del-wrap {
    display: block; /* 显示 .del-wrap 元素 */
  }
}

.waterfall {
  position: relative; /* 设置相对定位 */
  height: 100%; /* 高度为父容器高度的百分之百 */
}

.item {
  width: calc(100% / 5); /* 宽度为父容器宽度的五分之一 */
  height: auto; /* 高度自适应内容 */
  position: absolute; /* 设置绝对定位 */

  .item-wrap {
    width: calc(100% - 0px); /* 宽度为父容器宽度减去 0 像素 */

    .text-wrap {
      background: #fff; /* 设置背景颜色为白色 */
      box-shadow: 0px 0px 4px rgba(67, 84, 95, 0.45); /* 添加阴影效果 */
      margin: 5px; /* 设置外边距为 5 像素 */
      box-sizing: border-box; /* 设置盒子模型为边框盒模型 */
      border-radius: 6px; /* 设置边框圆角为 6 像素 */

      div:last-child {
        padding-bottom: 10px; /* 设置最后一个子元素的下内边距为 10 像素 */
      }
    }

    h3 {
      border-top: 3px solid red; /* 设置上边框为 3 像素宽的红色边框 */
      padding: 10px 0 0 10px; /* 设置内边距 */
      border-radius: 6px; /* 设置边框圆角为 6 像素 */

      i {
        margin-right: 10px; /* 设置右外边距为 10 像素 */
      }
    }

    .text {
      padding-left: 10px; /* 设置左内边距为 10 像素 */
      width: calc(100% - 10px); /* 宽度为父容器宽度减去 10 像素 */
      cursor: pointer; /* 设置光标为手型 */
      margin-top: 10px; /* 设置上外边距为 10 像素 */
      position: initial; /* 恢复默认定位属性 */
      height: auto; /* 高度自适应内容 */
    }
  }
}
</style>

效果展示
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值