vue实现瀑布流

  1. 每个色块宽度一致,高度自适应
html 复制代码
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="renderer" content="webkit">
  <meta name="viewport" content="user-scalable=0">
  <title>Vertical Line</title>
  <link rel="stylesheet" href="./common/css/style.css">
  <style>
    .item-move {
      transition: all .5s cubic-bezier(.55, 0, .1, 1);
      -webkit-transition: all .5s cubic-bezier(.55, 0, .1, 1);
    }
  </style>
</head>

<body>
  <div id="app">
    <waterfall :align="align" :line-gap="200" :min-line-gap="100" :max-line-gap="220" :single-max-width="300"
      :watch="items" @reflowed="reflowed" ref="waterfall">
      <!-- each component is wrapped by a waterfall slot -->
      <waterfall-slot v-for="(item, index) in items" :width="item.width" :height="item.height" :order="index"
        :key="item.index" move-class="item-move">
        <div class="item" :style="item.style" :index="item.index"></div>
      </waterfall-slot>
    </waterfall>
  </div>
  <script src="https://cdn.jsdelivr.net/vue/2.2.6/vue.min.js"></script>
  <script src="http://app.moptym.com/cdn/vue-waterfall/vue-waterfall.min.js"></script>
  <script src="./common/js/item-factory.js"></script>
  <script>

    var app = new Vue({
      el: '#app',
      components: {
        'waterfall': Waterfall.waterfall,
        'waterfall-slot': Waterfall.waterfallSlot
      },
      data: {
        align: 'center',
        items: ItemFactory.get(100),
        isBusy: false
      },
      methods: {
        addItems: function () {
          if (!this.isBusy && this.items.length < 500) {
            this.isBusy = true
            this.items.push.apply(this.items, ItemFactory.get(50))
          }
        },
        shuffle: function () {
          this.items.sort(function () {
            return Math.random() - 0.5
          })
        },
        reflowed: function () {
          this.isBusy = false
        }
      }
    })

    document.body.addEventListener('click', function () {
      app.shuffle()
      // app.$refs.waterfall.$emit('reflow') // manually trigger reflow action
    }, false)

    window.addEventListener('scroll', function () {
      var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
      if (scrollTop + window.innerHeight >= document.body.clientHeight) {
        app.addItems()
      }
    })

  </script>
</body>

</html>

如图所示:

  1. 每个色块高度一致,宽度自适应
html 复制代码
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="renderer" content="webkit">
  <meta name="viewport" content="user-scalable=0">
  <title>Horizontal Line</title>
  <link rel="stylesheet" href="./common/css/style.css">
  <style>
    .item-move {
      transition: all .5s cubic-bezier(.55, 0, .1, 1);
      -webkit-transition: all .5s cubic-bezier(.55, 0, .1, 1);
    }
  </style>
</head>

<body>
  <div id="app">
    <waterfall :line="line" :line-gap="200" :min-line-gap="180" :max-line-gap="220" :watch="items" @reflowed="reflowed"
      ref="waterfall">
      <!-- each component is wrapped by a waterfall slot -->
      <waterfall-slot v-for="(item, index) in items" :width="item.width" :height="item.height" :order="index"
        :key="item.index" move-class="item-move">
        <div class="item" :style="item.style" :index="item.index"></div>
      </waterfall-slot>
    </waterfall>
  </div>
  <script src="https://cdn.jsdelivr.net/vue/2.2.6/vue.min.js"></script>
  <script src="http://app.moptym.com/cdn/vue-waterfall/vue-waterfall.min.js"></script>
  <script src="./common/js/item-factory.js"></script>
  <script>

    var app = new Vue({
      el: '#app',
      components: {
        'waterfall': Waterfall.waterfall,
        'waterfall-slot': Waterfall.waterfallSlot
      },
      data: {
        line: 'h',
        items: ItemFactory.get(100),
        isBusy: false
      },
      methods: {
        addItems: function () {
          if (!this.isBusy && this.items.length < 500) {
            this.isBusy = true
            this.items.push.apply(this.items, ItemFactory.get(50))
          }
        },
        shuffle: function () {
          this.items.sort(function () {
            return Math.random() - 0.5
          })
        },
        reflowed: function () {
          this.isBusy = false
        }
      }
    })

    document.body.addEventListener('click', function () {
      app.shuffle()
      // app.$refs.waterfall.$emit('reflow') // manually trigger reflow action
    }, false)

    window.addEventListener('scroll', function () {
      var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
      if (scrollTop + window.innerHeight >= document.body.clientHeight) {
        app.addItems()
      }
    })

  </script>
</body>

</html>

如图所示:

  1. 宽高不限制,每个色块顺着排
html 复制代码
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="renderer" content="webkit">
  <meta name="viewport" content="user-scalable=0">
  <title>Vertical Line With Grow</title>
  <link rel="stylesheet" href="./common/css/style.css">
  <style>
    .item-move {
      transition: all .5s cubic-bezier(.55, 0, .1, 1);
      -webkit-transition: all .5s cubic-bezier(.55, 0, .1, 1);
    }
  </style>
</head>

<body>
  <div id="app">
    <waterfall :grow="grow" :watch="items" @reflowed="reflowed" ref="waterfall">
      <!-- each component is wrapped by a waterfall slot -->
      <waterfall-slot v-for="(item, index) in items" :width="item.width" :height="item.height" :order="index"
        :key="item.index" move-class="item-move">
        <div class="item" :style="item.style" :index="item.index"></div>
      </waterfall-slot>
    </waterfall>
  </div>
  <script src="https://cdn.jsdelivr.net/vue/2.2.6/vue.min.js"></script>
  <script src="http://app.moptym.com/cdn/vue-waterfall/vue-waterfall.min.js"></script>
  <script src="./common/js/item-factory.js"></script>
  <script>

    var app = new Vue({
      el: '#app',
      components: {
        'waterfall': Waterfall.waterfall,
        'waterfall-slot': Waterfall.waterfallSlot
      },
      data: {
        grow: [3, 2, 1, 2],
        items: ItemFactory.get(100),
        isBusy: false
      },
      methods: {
        addItems: function () {
          if (!this.isBusy && this.items.length < 500) {
            this.isBusy = true
            this.items.push.apply(this.items, ItemFactory.get(50))
          }
        },
        shuffle: function () {
          this.items.sort(function () {
            return Math.random() - 0.5
          })
        },
        reflowed: function () {
          this.isBusy = false
        }
      }
    })

    document.body.addEventListener('click', function () {
      app.shuffle()
      // app.$refs.waterfall.$emit('reflow') // manually trigger reflow action
    }, false)

    window.addEventListener('scroll', function () {
      var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
      if (scrollTop + window.innerHeight >= document.body.clientHeight) {
        app.addItems()
      }
    })

  </script>
</body>

</html>

如图所示:

相关推荐
禅思院1 小时前
AI对话前端从入门到崩溃:一个长对话引发的五层优化战争【引子】
前端·面试·架构
TrisighT1 小时前
Electron 鸿蒙 PC 上点外链唤醒应用,我试了 6 种写法只有 1 种能跑
前端·electron·harmonyos
天才熊猫君2 小时前
配置与数据分离:一种可视化搭建的属性编辑方案
前端·javascript
林希_Rachel_傻希希3 小时前
web性能之相关路径——AI总结
前端·javascript·面试
竹林8183 小时前
用 wagmi v2 踩坑两天,我终于搞懂了多链钱包切换在 DeFi 前端中的正确姿势
前端·javascript
用户2136610035723 小时前
Vue项目搜索功能与面包屑导航
前端·javascript
星栈3 小时前
LiveView 的实时通信,爽是爽,但 PubSub 和广播也最容易把自己绕晕
前端·前端框架·elixir
用户2930750976693 小时前
告别关键词匹配,拥抱向量语义 —— RAG 搜索从零到一
前端
独孤留白3 小时前
从C到Rust:告别 C 的"指针 + 长度"手动模式
前端·rust
掘金安东尼4 小时前
中小厂前端候选人简历面试拆解:从 HR 面、技术面到主管面的双赢提问法
前端·面试