当前位置:首页 > VUE

vue实现grid动态布局

2026-02-23 12:01:33VUE

Vue 实现动态 Grid 布局

使用 CSS Grid 和动态数据绑定

通过 Vue 的 v-for 指令结合 CSS Grid 实现动态布局。在模板中定义 grid 容器,动态渲染子元素。

<template>
  <div class="grid-container">
    <div 
      v-for="(item, index) in gridItems" 
      :key="index" 
      class="grid-item"
      :style="{ 'grid-area': item.area }"
    >
      {{ item.content }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      gridItems: [
        { area: 'header', content: 'Header' },
        { area: 'sidebar', content: 'Sidebar' },
        { area: 'main', content: 'Main Content' },
        { area: 'footer', content: 'Footer' }
      ]
    };
  }
};
</script>

<style>
.grid-container {
  display: grid;
  grid-template-areas:
    "header header header"
    "sidebar main main"
    "footer footer footer";
  gap: 10px;
  padding: 10px;
}

.grid-item {
  background: #eee;
  padding: 20px;
  text-align: center;
}
</style>

响应式动态调整布局

通过监听窗口大小或使用 Vue 的计算属性动态修改 grid-template-columnsgrid-template-rows

<template>
  <div 
    class="responsive-grid" 
    :style="{ 'grid-template-columns': gridColumns }"
  >
    <div v-for="n in itemCount" :key="n" class="grid-item">
      Item {{ n }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      itemCount: 6,
      screenWidth: window.innerWidth
    };
  },
  mounted() {
    window.addEventListener('resize', this.handleResize);
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.handleResize);
  },
  methods: {
    handleResize() {
      this.screenWidth = window.innerWidth;
    }
  },
  computed: {
    gridColumns() {
      return this.screenWidth > 768 ? 'repeat(3, 1fr)' : 'repeat(2, 1fr)';
    }
  }
};
</script>

<style>
.responsive-grid {
  display: grid;
  gap: 10px;
  padding: 10px;
}

.grid-item {
  background: #ddd;
  padding: 15px;
  text-align: center;
}
</style>

使用第三方库实现复杂交互

对于需要拖拽排序、动态调整大小等高级功能,可以使用 vue-grid-layout 这类专门库。

安装依赖:

npm install vue-grid-layout

示例实现:

<template>
  <grid-layout
    :layout.sync="layout"
    :col-num="12"
    :row-height="30"
    :is-draggable="true"
    :is-resizable="true"
  >
    <grid-item
      v-for="item in layout"
      :key="item.i"
      :x="item.x"
      :y="item.y"
      :w="item.w"
      :h="item.h"
      :i="item.i"
    >
      {{ item.text }}
    </grid-item>
  </grid-layout>
</template>

<script>
import { GridLayout, GridItem } from 'vue-grid-layout';

export default {
  components: {
    GridLayout,
    GridItem
  },
  data() {
    return {
      layout: [
        { x: 0, y: 0, w: 2, h: 2, i: '0', text: 'Item 1' },
        { x: 2, y: 0, w: 2, h: 4, i: '1', text: 'Item 2' },
        { x: 4, y: 0, w: 2, h: 5, i: '2', text: 'Item 3' }
      ]
    };
  }
};
</script>

动态添加/删除网格项

结合 Vue 的响应式数据实现网格项的增删功能。

vue实现grid动态布局

<template>
  <div>
    <button @click="addItem">Add Item</button>
    <button @click="removeItem">Remove Item</button>
    <div class="dynamic-grid">
      <div v-for="(item, index) in items" :key="index" class="grid-cell">
        {{ item }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
      counter: 3
    };
  },
  methods: {
    addItem() {
      this.counter++;
      this.items.push(`Item ${this.counter}`);
    },
    removeItem() {
      if (this.items.length > 0) {
        this.items.pop();
        this.counter--;
      }
    }
  }
};
</script>

<style>
.dynamic-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  gap: 10px;
  margin-top: 20px;
}

.grid-cell {
  background: #f0f0f0;
  padding: 15px;
  text-align: center;
}
</style>

这些方法覆盖了从基础到高级的 Vue 动态网格布局实现,可根据具体需求选择适合的方案。CSS Grid 提供原生支持,而第三方库能快速实现复杂交互功能。

标签: 布局动态
分享给朋友:

相关文章

vue实现弹性布局

vue实现弹性布局

使用 Flexbox 实现弹性布局 在 Vue 中实现弹性布局可以借助 CSS Flexbox 特性,结合 Vue 的模板和样式绑定能力。Flexbox 是一种现代的布局模式,能够轻松实现响应式设计。…

vue实现布局组件

vue实现布局组件

Vue 实现布局组件的方法 基础布局组件结构 使用 Vue 的单文件组件(SFC)创建一个基础布局组件。布局组件通常包含头部、侧边栏、主体内容和页脚。 <template> <…

vue 实现动态表单

vue 实现动态表单

Vue 实现动态表单的方法 动态表单通常指表单字段可以动态增减或根据条件变化。以下是几种实现方式: 使用 v-for 动态渲染表单字段 通过数组存储表单字段数据,利用 v-for 动态渲染: da…

vue 实现动态菜单

vue 实现动态菜单

动态菜单的实现思路 在Vue中实现动态菜单通常涉及从后端API获取菜单数据,根据用户权限或角色动态渲染菜单项。核心思路是将菜单数据与组件分离,通过数据驱动视图。 数据准备与API交互 创建菜单数据模…

vue实现动态表头

vue实现动态表头

实现动态表头的方案 在Vue中实现动态表头通常需要结合数据驱动和组件化思想。以下是几种常见方法: 基于v-for渲染表头 通过v-for指令循环渲染表头列,数据源可以是数组或对象: <tem…

vue实现动态组件

vue实现动态组件

动态组件的基本概念 在Vue中,动态组件允许根据条件或用户交互切换不同的组件,无需重复编写模板逻辑。核心是通过<component>标签的is属性绑定组件名或组件对象。 使用is属性切换…