当前位置:首页 > 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 都提供现成的折叠面板组件:

Element UI Collapse

<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 实现:

vue动画实现折叠

<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实例并定义数据 new Vue({ el: '#app', data: { letters…

vue筛选实现

vue筛选实现

Vue 筛选实现方法 使用计算属性实现筛选 计算属性是 Vue 中实现数据筛选的常用方式。通过定义一个计算属性,可以根据输入的条件动态过滤数据。 <template> <div…

vue实现表白

vue实现表白

Vue 实现表白页面 使用 Vue 可以快速创建一个动态、交互式的表白页面。以下是一个简单的实现方案: 基础结构 创建一个 Vue 项目或单文件组件,包含以下核心部分: <template&…

vue tab实现

vue tab实现

Vue Tab 实现方法 使用动态组件实现 Tab 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现 Ta…

vue observer实现

vue observer实现

Vue Observer 实现原理 Vue 的响应式系统核心是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现的 Observer 模式。以下是关键实现细…

vue实现标题

vue实现标题

Vue 实现标题的方法 在Vue中实现标题可以通过多种方式,以下是几种常见的方法: 方法一:使用模板语法 在Vue组件的模板中直接使用HTML的<h1>到<h6>标签来定义…