vue实现瀑布流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<template>
  <div id="app">
    <ul>
      <li
        ref='waterfallItem'
        v-for="(item,index) in waterfallArr"
        :key="index"
      >
        <img :src="item.img"> 第{{index+1}}张
        <span>原价 {{item.price}}</span>
        </li>
    </ul>
  </div>
</template>

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<script>
export default {
  data() {
    return {
      waterfallArr: [
        {
          id: 1,
          img: require("./assets/images/1.jpg"),
          price: "50",
        },
        {
          id: 2,
          img: require("./assets/images/2.jpg"),
          price: "50",
        },
        {
          id: 3,
          img: require("./assets/images/3.jpg"),
          price: "50",
        },
        {
          id: 4,
          img: require("./assets/images/4.jpg"),
          price: "50",
        },
        {
          id: 5,
          img: require("./assets/images/5.jpg"),
          price: "50",
        },
        {
          id: 6,
          img: require("./assets/images/6.jpg"),
          price: "50",
        },
        {
          id: 7,
          img: require("./assets/images/5.jpg"),
          price: "50",
        },
        {
          id: 8,
          img: require("./assets/images/6.jpg"),
          price: "50",
        },
      ],
      array: [] //定义空数组存储元素高度
    };
  },
  mounted() {
   setTimeout(() => { // 防止图片高度没有加载出来
      this.getWaterfall();
   },100)
  },
  methods: {
    getWaterfall() {
      let columns = 2; //定义布局的列数为2
      let item = this.$refs.waterfallItem; //获取每个子元素的DOM
      console.log("item",item)
      for (let i = 0; i < item.length; i++) {
        //遍历整个子元素的DOM集合
        if (i < columns) {
          //小于columns的子元素作为第一行
          item[i].style.top = 20 + 'px';
          item[i].style.left = item[0].clientWidth * i + "px";
          console.log("offsetWidth", item[0].clientHeight)
          this.array.push(item[i].clientHeight); //遍历结束时,数组this.array保存的是第一行子元素的元素高度
          console.log("this.array",this.array)
        } else {
          //大于等于columns的子元素将作其他行
          let minHeight = Math.min(...this.array); //  找到第一列的最小高度
          let index = this.array.findIndex(item => item === minHeight) // 找到最小高度的索引
          //设置当前子元素项的位置
          item[i].style.top = this.array[index] +25+ "px";
          item[i].style.left = item[index].offsetLeft + "px";
          //重新定义数组最小项的高度 进行累加
          this.array[index]+= item[i].clientHeight
          console.log("this.array[index]",this.array[index])
        }
      }
    },
  },
};
</script>

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<style lang="scss" scoped>
#app {
  width: 750px;
  height: 100vh;
  background-color: #0f0;
  color: #333;
  text-align: center;
  font-size: 20px;
  ul {
    width: 750px;
    height: 100%;
    list-style: none;
    box-sizing: border-box;
    background-color: #fff;
    overflow: hidden;
    li {
      width: 50%;
      height: auto;
      padding: 10px;
      font-size: 14px;
      position: absolute;
      box-sizing: border-box;
      margin: 0 0 10px 0;
      overflow: hidden;
      img {
        width: 100%;
        display: block;
        height: auto;
      }
      span {
        text-decoration: line-through;
        line-height: 2;
        margin-left: 10px;
      }
    }
  }
}
</style>

  

posted @   枫若  阅读(274)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示