vue实现折叠面板
Vue 实现折叠面板的方法
使用 v-show 或 v-if 控制显示
通过 Vue 的指令 v-show 或 v-if 结合点击事件切换面板的展开与折叠状态。v-show 通过 CSS 的 display 属性控制,适合频繁切换的场景;v-if 会销毁和重建 DOM,适合条件较少变化的场景。

<template>
<div>
<button @click="isOpen = !isOpen">Toggle Panel</button>
<div v-show="isOpen">折叠面板内容</div>
</div>
</template>
<script>
export default {
data() {
return {
isOpen: false
};
}
};
</script>
使用 transition 添加动画效果
Vue 的 <transition> 组件可以为折叠面板添加平滑的动画效果,提升用户体验。通过定义 CSS 过渡类名实现展开/折叠的动画。

<template>
<div>
<button @click="isOpen = !isOpen">Toggle Panel</button>
<transition name="fade">
<div v-show="isOpen">带有动画的折叠面板内容</div>
</transition>
</div>
</template>
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s, max-height 0.5s;
overflow: hidden;
}
.fade-enter, .fade-leave-to {
opacity: 0;
max-height: 0;
}
.fade-enter-to, .fade-leave {
opacity: 1;
max-height: 500px;
}
</style>
封装可复用的折叠面板组件
将折叠面板逻辑封装为组件,便于复用。通过插槽(slot)支持自定义面板内容和标题。
<template>
<div class="collapse-panel">
<div class="header" @click="toggle">
<slot name="header">默认标题</slot>
</div>
<transition name="slide">
<div class="content" v-show="isOpen">
<slot name="content">默认内容</slot>
</div>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
isOpen: false
};
},
methods: {
toggle() {
this.isOpen = !this.isOpen;
}
}
};
</script>
<style>
.slide-enter-active, .slide-leave-active {
transition: max-height 0.3s ease;
overflow: hidden;
}
.slide-enter, .slide-leave-to {
max-height: 0;
}
.slide-enter-to, .slide-leave {
max-height: 1000px;
}
</style>
使用第三方库(如 Element UI)
如果需要快速实现功能丰富的折叠面板,可以使用 Vue 生态的 UI 库(如 Element UI、Ant Design Vue 等)。这些库提供了现成的折叠面板组件,支持手风琴模式、自定义图标等功能。
<template>
<el-collapse v-model="activePanel">
<el-collapse-item title="面板1" name="1">
<div>面板1内容</div>
</el-collapse-item>
<el-collapse-item title="面板2" name="2">
<div>面板2内容</div>
</el-collapse-item>
</el-collapse>
</template>
<script>
export default {
data() {
return {
activePanel: ['1']
};
}
};
</script>
注意事项
- 性能优化:如果面板内容复杂,使用
v-show代替v-if避免重复渲染。 - 无障碍支持:为按钮添加
aria-expanded属性,提升可访问性。 - 动态高度:使用
max-height过渡时,需设置一个足够大的值以容纳内容。






