当前位置:首页 > 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 中实现网页切换通常可以通过以下几种方式完成,具体取决于项目需求和路由管理方式。 使用 Vue Router Vue Router 是 Vue.js 官方提供…

vue搜索过后实现分页

vue搜索过后实现分页

Vue 实现搜索后分页功能 数据绑定与搜索逻辑 在 Vue 组件中定义必要的数据属性: data() { return { searchQuery: '', currentPag…

vue哪个组件实现动画

vue哪个组件实现动画

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

vue实现录音文件播放

vue实现录音文件播放

使用 Vue 实现录音文件播放 准备工作 确保项目中已安装必要的依赖,如 vue-audio-recorder 或原生 Web Audio API。录音文件播放通常涉及录音、存储和播放三个核心环节。…

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登…

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…