当前位置:首页 > 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 实现:

<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 实现搜索功能 在 Vue 中实现搜索功能通常涉及数据绑定、事件监听和过滤逻辑。以下是几种常见的实现方式: 使用计算属性过滤列表 <template> <div>…

vue双向实现

vue双向实现

Vue 双向数据绑定的实现原理 Vue 的双向数据绑定主要通过 v-model 指令实现,其核心是结合了数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。 数…

vue哪个组件实现动画

vue哪个组件实现动画

在Vue中实现动画效果可以通过多种方式,以下是常用的组件和方法: Vue内置过渡组件 Vue提供了<transition>和<transition-group>组件,用于处…

vue实现访问量

vue实现访问量

Vue 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return…

vue实现表格多行修改

vue实现表格多行修改

实现多行编辑表格 在Vue中实现表格的多行编辑功能,可以通过以下方法完成。这里以Element UI的表格组件为例,但思路适用于其他UI库或原生实现。 数据准备 定义表格数据和编辑状态管理变量:…

vue实现弹窗可切换

vue实现弹窗可切换

实现弹窗可切换的 Vue 方案 动态组件切换 通过 Vue 的 <component :is="currentComponent"> 动态加载不同弹窗组件,结合 v-if 控制显示状态。…