当前位置:首页 > VUE

vue 瀑布流实现

2026-01-18 22:10:47VUE

实现 Vue 瀑布流布局

使用 CSS Grid 实现

CSS Grid 提供了一种简单的方式实现瀑布流布局,但需要手动设置行和列的跨度。

<template>
  <div class="masonry-grid">
    <div v-for="(item, index) in items" :key="index" class="masonry-item">
      <img :src="item.image" :alt="item.title">
      <h3>{{ item.title }}</h3>
    </div>
  </div>
</template>

<style>
.masonry-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  grid-auto-rows: 10px;
  gap: 15px;
}

.masonry-item {
  grid-row-end: span var(--row-span);
}
</style>

使用 CSS Columns 实现

CSS 多列布局可以自动创建瀑布流效果,但列的顺序是垂直排列的。

<template>
  <div class="masonry-columns">
    <div v-for="(item, index) in items" :key="index" class="masonry-item">
      <img :src="item.image" :alt="item.title">
      <h3>{{ item.title }}</h3>
    </div>
  </div>
</template>

<style>
.masonry-columns {
  column-count: 3;
  column-gap: 15px;
}

.masonry-item {
  break-inside: avoid;
  margin-bottom: 15px;
}
</style>

使用第三方库 vue-masonry

vue-masonry 是一个专门为 Vue 设计的瀑布流插件,使用起来更加方便。

vue 瀑布流实现

安装:

npm install vue-masonry --save

使用:

vue 瀑布流实现

import { VueMasonryPlugin } from 'vue-masonry';

Vue.use(VueMasonryPlugin);
<template>
  <div v-masonry transition-duration="0.3s" item-selector=".masonry-item">
    <div v-masonry-tile v-for="(item, index) in items" :key="index" class="masonry-item">
      <img :src="item.image" :alt="item.title">
      <h3>{{ item.title }}</h3>
    </div>
  </div>
</template>

动态计算高度实现

对于需要精确控制布局的场景,可以通过 JavaScript 动态计算每个项目的位置。

methods: {
  layoutMasonry() {
    const container = this.$el;
    const items = container.querySelectorAll('.masonry-item');
    const columnWidth = 250;
    const gap = 15;
    const containerWidth = container.offsetWidth;
    const columnCount = Math.floor(containerWidth / (columnWidth + gap));
    const columns = Array(columnCount).fill(0);

    items.forEach(item => {
      const minColumnIndex = columns.indexOf(Math.min(...columns));
      const left = minColumnIndex * (columnWidth + gap);
      const top = columns[minColumnIndex];

      item.style.position = 'absolute';
      item.style.left = `${left}px`;
      item.style.top = `${top}px`;
      item.style.width = `${columnWidth}px`;

      columns[minColumnIndex] += item.offsetHeight + gap;
    });

    container.style.height = `${Math.max(...columns)}px`;
  }
},
mounted() {
  this.layoutMasonry();
  window.addEventListener('resize', this.layoutMasonry);
},
beforeDestroy() {
  window.removeEventListener('resize', this.layoutMasonry);
}

响应式处理

为了使瀑布流布局在不同屏幕尺寸下都能良好显示,可以添加响应式处理。

data() {
  return {
    columnCount: 3
  }
},
created() {
  this.updateColumnCount();
  window.addEventListener('resize', this.updateColumnCount);
},
methods: {
  updateColumnCount() {
    const width = window.innerWidth;
    if (width < 768) {
      this.columnCount = 1;
    } else if (width < 1024) {
      this.columnCount = 2;
    } else {
      this.columnCount = 3;
    }
    this.layoutMasonry();
  }
}

以上方法提供了多种实现 Vue 瀑布流布局的方式,从简单的 CSS 方案到更复杂的 JavaScript 计算方案,可以根据项目需求选择最适合的方法。

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

相关文章

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue实现文字

vue实现文字

Vue 中实现文字显示的方法 在 Vue 中实现文字显示可以通过多种方式,包括插值表达式、指令、组件等。以下是几种常见的实现方法: 插值表达式 使用双大括号 {{ }} 进行文本插值,这是 Vue…

vue实现定位

vue实现定位

Vue 中实现定位的方法 在 Vue 中实现定位可以通过以下几种方式: 使用 CSS 定位 通过 CSS 的 position 属性实现定位,Vue 中可以直接在组件的 <style>…

vue实现flbook

vue实现flbook

Vue 实现类似 Flbook 的翻页效果 要实现类似 Flbook 的翻页效果,可以使用 Vue 结合 CSS 动画和 JavaScript 事件处理。以下是实现方法: 安装依赖 需要安装 vue…

vue实现cs程序

vue实现cs程序

Vue 实现 CS(客户端-服务器)程序 Vue 本身是一个前端框架,主要用于构建用户界面。要实现一个完整的 CS(客户端-服务器)程序,需要结合后端技术。以下是实现的基本思路和步骤: 前端部分(V…

vue实现搜索过滤

vue实现搜索过滤

Vue 实现搜索过滤 使用计算属性实现搜索过滤 在 Vue 中,计算属性(computed)是实现搜索过滤的常见方法。通过计算属性动态过滤数据,无需修改原始数据。 <template>…