当前位置:首页 > VUE

vue 实现口风琴

2026-03-08 14:34:17VUE

实现口风琴效果的方法

在Vue中实现口风琴(Accordion)效果,可以通过组件化方式结合动态样式和事件处理来完成。以下是几种常见的实现方式:

使用v-for和v-show/v-if

通过循环渲染多个折叠面板,利用v-showv-if控制内容展开与折叠:

<template>
  <div class="accordion">
    <div 
      v-for="(item, index) in items" 
      :key="index" 
      class="accordion-item"
    >
      <div 
        class="accordion-header" 
        @click="toggle(index)"
      >
        {{ item.title }}
      </div>
      <div 
        class="accordion-content" 
        v-show="activeIndex === index"
      >
        {{ item.content }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      activeIndex: null,
      items: [
        { title: '标题1', content: '内容1' },
        { title: '标题2', content: '内容2' }
      ]
    }
  },
  methods: {
    toggle(index) {
      this.activeIndex = this.activeIndex === index ? null : index
    }
  }
}
</script>

<style>
.accordion-item {
  margin-bottom: 8px;
}
.accordion-header {
  padding: 12px;
  background: #f0f0f0;
  cursor: pointer;
}
.accordion-content {
  padding: 12px;
  border: 1px solid #ddd;
}
</style>

使用组件递归实现嵌套口风琴

对于需要嵌套结构的情况,可以创建递归组件:

<template>
  <accordion-item 
    v-for="item in items" 
    :item="item" 
    :key="item.id"
  />
</template>

<script>
import AccordionItem from './AccordionItem.vue'

export default {
  components: { AccordionItem },
  data() {
    return {
      items: [
        { 
          id: 1, 
          title: '父级1',
          children: [
            { id: 11, title: '子级1', content: '内容1' }
          ]
        }
      ]
    }
  }
}
</script>

使用第三方库

现成的Vue组件库如Element UI、Vuetify等已提供口风琴组件:

<template>
  <el-collapse v-model="activeNames">
    <el-collapse-item 
      v-for="item in items" 
      :title="item.title" 
      :name="item.id"
    >
      {{ item.content }}
    </el-collapse-item>
  </el-collapse>
</template>

<script>
export default {
  data() {
    return {
      activeNames: [],
      items: [
        { id: 1, title: '标题1', content: '内容1' }
      ]
    }
  }
}
</script>

添加过渡动画

通过Vue的<transition>组件实现平滑的展开/折叠动画:

<transition name="slide">
  <div 
    class="accordion-content" 
    v-show="activeIndex === index"
  >
    {{ item.content }}
  </div>
</transition>

<style>
.slide-enter-active, .slide-leave-active {
  transition: max-height 0.3s ease;
  overflow: hidden;
}
.slide-enter-from, .slide-leave-to {
  max-height: 0;
}
.slide-enter-to, .slide-leave-from {
  max-height: 500px;
}
</style>

可访问性优化

遵循WAI-ARIA标准增强可访问性:

vue 实现口风琴

<div 
  role="button" 
  :aria-expanded="activeIndex === index" 
  tabindex="0"
  @keydown.enter="toggle(index)"
>
  标题
</div>
<div 
  role="region" 
  :aria-hidden="activeIndex !== index"
>
  内容
</div>

以上方法可根据实际需求组合使用,构建功能完善的口风琴组件。

标签: 口风vue
分享给朋友:

相关文章

vue实现主页

vue实现主页

Vue 实现主页的基本步骤 创建一个 Vue 主页通常涉及以下几个关键步骤,从项目初始化到页面布局和功能实现。 初始化 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…

vue滚动实现

vue滚动实现

Vue 滚动实现方法 使用原生滚动 在 Vue 中可以通过 ref 获取 DOM 元素,调用原生滚动方法实现滚动效果。适用于简单场景。 <template> <div ref=…

vue实现编辑

vue实现编辑

Vue 实现编辑功能 在 Vue 中实现编辑功能通常涉及表单绑定、状态管理和事件处理。以下是一个常见的实现方法: 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定: <i…

甘特图vue实现

甘特图vue实现

甘特图 Vue 实现方法 使用开源库 vue-ganttastic 安装依赖: npm install vue-ganttastic 基础实现代码: <template> <…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…