当前位置:首页 > VUE

vue 实现口风琴

2026-02-17 02:33:40VUE

实现口风琴效果的方法

使用Vue实现口风琴(Accordion)效果可以通过动态绑定v-forv-showv-if来控制内容的展开与折叠。以下是两种常见的实现方式:

基础实现(使用v-show)

通过v-show控制每个项目的展开状态,点击时切换当前项的isOpen属性。

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

<script>
export default {
  data() {
    return {
      items: [
        { title: '标题1', content: '内容1', isOpen: false },
        { title: '标题2', content: '内容2', isOpen: false },
        { title: '标题3', content: '内容3', isOpen: false }
      ]
    };
  },
  methods: {
    toggleItem(index) {
      this.items[index].isOpen = !this.items[index].isOpen;
    }
  }
};
</script>

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

进阶实现(仅展开一项)

通过维护一个activeIndex变量,确保每次仅有一项展开,其他项自动折叠。

<template>
  <div class="accordion">
    <div 
      v-for="(item, index) in items" 
      :key="index" 
      class="accordion-item"
    >
      <div 
        class="accordion-header" 
        @click="setActiveIndex(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' },
        { title: '标题3', content: '内容3' }
      ]
    };
  },
  methods: {
    setActiveIndex(index) {
      this.activeIndex = this.activeIndex === index ? null : index;
    }
  }
};
</script>

使用过渡动画

通过Vue的<transition>组件为展开/折叠添加平滑动画效果。

vue 实现口风琴

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

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

关键点说明

  • 数据驱动:通过修改isOpenactiveIndex触发视图更新。
  • 性能优化v-show通过CSS控制显示/隐藏,适合频繁切换的场景;v-if会销毁/重建DOM,适合初始渲染成本高的内容。
  • 扩展性:可通过插槽(Slot)支持自定义标题和内容模板。

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

相关文章

vue实现冰墩墩

vue实现冰墩墩

使用 Vue 实现冰墩墩动画 通过 Vue 的动画特性和 SVG 技术,可以动态渲染冰墩墩的形象。以下是具体实现方法: 准备 SVG 素材 冰墩墩的形象通常由多个 SVG 路径组成,包括身体轮廓、面…

vue实现换肤

vue实现换肤

使用 CSS 变量实现换肤 在 Vue 项目中,可以通过 CSS 变量(Custom Properties)动态切换主题色。CSS 变量可以在运行时修改,适合实现换肤功能。 定义全局 CSS 变量:…

vue实现通讯

vue实现通讯

Vue 组件通讯方法 父子组件通讯 父组件向子组件传递数据通过 props,子组件向父组件传递数据通过 $emit 事件。 父组件模板: <child-component :message=…

vue实现列表

vue实现列表

Vue 实现列表的方法 在 Vue 中实现列表渲染通常使用 v-for 指令,可以动态生成多个元素。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 遍历数组,生成列表项。v-for 需要…

vue实现计数

vue实现计数

Vue 实现计数功能 在 Vue 中实现计数功能可以通过多种方式完成,以下是几种常见的方法: 使用 Vue 数据绑定和事件监听 通过 Vue 的数据绑定和事件监听,可以轻松实现计数功能。以下是一个简…

vue怎么实现直播

vue怎么实现直播

Vue实现直播的方法 使用Vue实现直播功能通常需要结合第三方直播服务或WebRTC技术。以下是几种常见的实现方式: 使用第三方直播服务 集成如腾讯云、阿里云或七牛云等提供的直播SDK,通过他们的A…