当前位置:首页 > VUE

vue动画实现折叠

2026-01-16 00:02:13VUE

使用 Vue Transition 实现折叠动画

在 Vue 中可以通过 <transition> 组件和 CSS 过渡实现折叠效果。核心原理是动态切换元素的 height 属性,配合 overflow: hidden 实现平滑的展开/折叠动画。

<template>
  <div>
    <button @click="isExpanded = !isExpanded">
      {{ isExpanded ? '折叠' : '展开' }}
    </button>

    <transition
      @before-enter="beforeEnter"
      @enter="enter"
      @after-enter="afterEnter"
      @before-leave="beforeLeave"
      @leave="leave"
    >
      <div v-show="isExpanded" class="content">
        这里是需要折叠/展开的内容
      </div>
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isExpanded: false
    }
  },
  methods: {
    beforeEnter(el) {
      el.style.height = '0'
    },
    enter(el) {
      el.style.height = `${el.scrollHeight}px`
    },
    afterEnter(el) {
      el.style.height = 'auto'
    },
    beforeLeave(el) {
      el.style.height = `${el.scrollHeight}px`
    },
    leave(el) {
      setTimeout(() => {
        el.style.height = '0'
      })
    }
  }
}
</script>

<style>
.content {
  overflow: hidden;
  transition: height 0.3s ease;
}
</style>

使用 Vue 组件库实现

主流 UI 库如 Element UI、Ant Design Vue 都提供现成的折叠面板组件:

vue动画实现折叠

Element UI Collapse

vue动画实现折叠

<el-collapse v-model="activeNames">
  <el-collapse-item title="标题" name="1">
    内容区域
  </el-collapse-item>
</el-collapse>

Ant Design Vue Collapse

<a-collapse v-model:activeKey="activeKey">
  <a-collapse-panel key="1" header="标题">
    内容区域
  </a-collapse-panel>
</a-collapse>

使用 CSS Grid 实现高级折叠

对于更复杂的布局,可以结合 CSS Grid 实现:

<template>
  <div class="grid-container" :style="{ gridTemplateRows: gridRows }">
    <div class="header" @click="toggle">标题</div>
    <div class="content">
      内容区域
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isExpanded: false
    }
  },
  computed: {
    gridRows() {
      return this.isExpanded ? 'auto 1fr' : 'auto 0fr'
    }
  },
  methods: {
    toggle() {
      this.isExpanded = !this.isExpanded
    }
  }
}
</script>

<style>
.grid-container {
  display: grid;
  transition: grid-template-rows 0.3s ease;
  overflow: hidden;
}
.content {
  overflow: hidden;
}
</style>

性能优化建议

对于内容较多的折叠区域,建议在折叠状态下使用 v-if 替代 v-show 减少 DOM 节点数。可以结合 <transition>mode="out-in" 属性避免内容闪烁。

标签: 动画vue
分享给朋友:

相关文章

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单的常见方法 基于路由配置生成菜单 Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统: // router/index.js const route…

vue实现一个系统

vue实现一个系统

Vue 系统实现步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目: npm init vue@latest my-system 选择需要的配置(Router、Pinia 等)。…

vue课程实现

vue课程实现

Vue 课程实现方案 课程内容设计 Vue课程应从基础到高级逐步展开,涵盖Vue核心概念、组件化开发、状态管理、路由、构建工具等。基础部分包括Vue实例、模板语法、计算属性和侦听器。中级部分深入组件通…

vue实现导入

vue实现导入

Vue 实现文件导入功能 使用 <input type="file"> 元素 在 Vue 模板中添加一个文件输入元素,绑定 change 事件处理函数。 <template>…

vue实现github

vue实现github

Vue 实现 GitHub 相关功能 创建 GitHub API 请求 在 Vue 项目中,可以使用 axios 或 fetch 与 GitHub API 进行交互。需要在 GitHub 上创建个人访…

vue实现翻页

vue实现翻页

Vue实现翻页功能 在Vue中实现翻页功能通常需要结合分页组件和数据请求逻辑。以下是常见的实现方法: 使用Element UI分页组件 安装Element UI后,可以直接使用其分页组件:…