当前位置:首页 > VUE

vue动画实现折叠

2026-02-17 01:18:37VUE

使用 Vue Transition 实现折叠动画

在 Vue 中可以通过 <transition> 组件和 CSS 过渡实现折叠效果。核心思路是动态切换元素的高度,从 0 到 auto 或反之。

<template>
  <div>
    <button @click="isOpen = !isOpen">Toggle</button>
    <transition name="fold">
      <div v-show="isOpen" class="content">
        <!-- 内容区域 -->
      </div>
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isOpen: false
    }
  }
}
</script>

<style>
.fold-enter-active, .fold-leave-active {
  transition: all 0.3s ease;
  overflow: hidden;
}

.fold-enter-from, .fold-leave-to {
  height: 0;
  opacity: 0;
}

.fold-enter-to, .fold-leave-from {
  height: auto;
  opacity: 1;
}
</style>

使用 CSS Grid 实现平滑过渡

当内容高度不确定时,可以使用 CSS grid 布局实现更平滑的折叠动画:

vue动画实现折叠

.fold-enter-active, .fold-leave-active {
  display: grid;
  grid-template-rows: 1fr;
  transition: grid-template-rows 0.3s ease;
}

.fold-enter-from, .fold-leave-to {
  grid-template-rows: 0fr;
}

.content {
  overflow: hidden;
}

使用 VueUse 的 useTransition 实现

对于更复杂的动画控制,可以使用 VueUse 库的 useTransition

<template>
  <div :style="{ height: `${height}px` }" class="transition-all overflow-hidden">
    <!-- 内容 -->
  </div>
</template>

<script setup>
import { useTransition } from '@vueuse/core'

const isOpen = ref(false)
const contentRef = ref(null)

const height = useTransition(
  isOpen,
  {
    duration: 300,
    transition: [0.25, 0.1, 0.25, 1]
  }
)
</script>

使用 Collapse 组件库

现有 UI 库如 Element Plus 提供了现成的 Collapse 组件:

vue动画实现折叠

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

<script setup>
const activeNames = ref(['1'])
</script>

性能优化建议

避免在折叠动画中使用 height: auto,这会导致浏览器重排影响性能。推荐测量实际内容高度后使用固定值过渡。

使用 will-change: transform 可以提示浏览器优化动画性能。

对于移动端,考虑减少动画持续时间到 200-250ms 以获得更快的响应感。

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

相关文章

vue实现效果

vue实现效果

以下是Vue实现常见效果的几种典型方法,分为不同场景说明: 数据绑定与响应式更新 使用v-model实现表单双向绑定: <template> <input v-model="…

vue权限实现

vue权限实现

Vue 权限实现方案 基于路由的权限控制 通过路由守卫实现权限验证,在路由配置中添加meta字段标记权限要求。在router.beforeEach中检查用户权限与路由要求的匹配情况。 // rout…

vue router 实现

vue router 实现

Vue Router 的实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的核心实现方式。 安装 Vue Router 通过…

vue实现水印

vue实现水印

Vue 实现水印的方法 使用 CSS 背景图 通过 CSS 的 background-image 和 background-repeat 属性实现水印效果。创建一个包含水印文本的 Canvas,将其转…

vue实现树

vue实现树

Vue 实现树形结构的方法 使用递归组件实现树形结构 递归组件是Vue中实现树形结构的常见方式。通过组件调用自身,可以轻松构建多层嵌套的树形数据。 <template> <ul…

vue实现webapp

vue实现webapp

Vue 实现 WebApp 的基本步骤 环境准备 确保已安装 Node.js 和 npm/yarn。通过 Vue CLI 或 Vite 创建项目: npm install -g @vue/cli v…