当前位置:首页 > VUE

vue实现瀑布流

2026-03-30 11:21:47VUE

Vue 实现瀑布流的方法

使用 CSS 多列布局

CSS 的 column-countcolumn-gap 属性可以快速实现简单的瀑布流效果。这种方法适合静态内容,但动态加载时可能存在问题。

<template>
  <div class="waterfall">
    <div v-for="item in items" :key="item.id" class="item">
      <img :src="item.img" alt="">
    </div>
  </div>
</template>

<style>
.waterfall {
  column-count: 3;
  column-gap: 15px;
}
.item {
  break-inside: avoid;
  margin-bottom: 15px;
}
</style>

使用 Flexbox 布局

Flexbox 布局需要手动计算高度,适合动态加载的场景。

<template>
  <div class="waterfall">
    <div v-for="(column, index) in columns" :key="index" class="column">
      <div v-for="item in column" :key="item.id" class="item">
        <img :src="item.img" alt="">
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [], // 数据源
      columns: [[], [], []] // 三列
    }
  },
  mounted() {
    this.distributeItems();
  },
  methods: {
    distributeItems() {
      this.items.forEach(item => {
        const shortestColumn = this.getShortestColumn();
        shortestColumn.push(item);
      });
    },
    getShortestColumn() {
      return this.columns.reduce((prev, curr) => 
        curr.length < prev.length ? curr : prev
      );
    }
  }
}
</script>

<style>
.waterfall {
  display: flex;
  justify-content: space-between;
}
.column {
  flex: 1;
  margin: 0 10px;
}
.item {
  margin-bottom: 20px;
}
</style>

使用第三方库

Vue 社区提供了专门的瀑布流组件,如 vue-waterfallvue-masonry,可以简化实现过程。

安装 vue-waterfall

npm install vue-waterfall --save

使用示例:

<template>
  <waterfall :col="3" :data="items">
    <template>
      <div class="item" v-for="item in items" :key="item.id">
        <img :src="item.img" alt="">
      </div>
    </template>
  </waterfall>
</template>

<script>
import Waterfall from 'vue-waterfall';

export default {
  components: { Waterfall },
  data() {
    return {
      items: [] // 数据源
    }
  }
}
</script>

响应式处理

为了适应不同屏幕尺寸,可以监听窗口大小变化动态调整列数。

export default {
  data() {
    return {
      columnCount: 3
    }
  },
  mounted() {
    window.addEventListener('resize', this.handleResize);
    this.handleResize();
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.handleResize);
  },
  methods: {
    handleResize() {
      const width = window.innerWidth;
      this.columnCount = width < 600 ? 1 : width < 900 ? 2 : 3;
    }
  }
}

图片懒加载

结合 IntersectionObservervue-lazyload 实现图片懒加载,优化性能。

vue实现瀑布流

import VueLazyload from 'vue-lazyload';

Vue.use(VueLazyload, {
  preLoad: 1.3,
  loading: 'loading.gif',
  attempt: 1
});
<img v-lazy="item.img" alt="">

以上方法可以根据项目需求选择,CSS 多列布局适合简单场景,Flexbox 适合动态内容,第三方库能快速实现复杂需求。

标签: 瀑布vue
分享给朋友:

相关文章

vue 实现blog

vue 实现blog

Vue 实现博客的基本步骤 使用 Vue 实现博客可以分为前端和后端两部分,前端使用 Vue.js 框架,后端可以选择 Node.js、Python 或其他服务端语言。以下是一个基于 Vue 的博客实…

vue 实现筛选

vue 实现筛选

实现筛选功能的基本方法 在Vue中实现筛选功能通常涉及以下几个核心步骤: 数据绑定与筛选逻辑 使用v-model绑定筛选条件到Vue实例的数据属性,结合计算属性实现动态筛选: data() {…

vue实现mouseout

vue实现mouseout

Vue 实现 mouseout 事件的方法 在 Vue 中实现 mouseout 事件可以通过多种方式完成,以下是几种常见的方法: 使用 v-on 指令 Vue 提供了 v-on 指令(或简写为 @…

vue实现布局

vue实现布局

Vue 实现布局方法 Vue 提供了多种方式实现页面布局,可以通过组件化、CSS 框架或自定义样式完成。以下是几种常见方法: 使用 CSS Flexbox 或 Grid 通过 Vue 单文件组件结合…

vue实现tree

vue实现tree

Vue 实现 Tree 组件 使用 Vue 实现 Tree 组件可以通过递归组件的方式来实现层级结构展示。以下是一个完整的实现方法: 基础递归组件实现 创建 Tree 组件文件 Tree.vue,使…

vue实现openoffice

vue实现openoffice

Vue 中集成 OpenOffice 的实现方法 在 Vue 项目中集成 OpenOffice 通常需要通过后端服务或现有库实现文档的预览和编辑功能。以下是几种常见的实现方式: 使用 OnlyOff…