Accordion
Vue Accordion component
Responsive accordion built with the latest Bootstrap 5 and Vue 3. Accordion is a vertically collapsing element to show and hide content via class changes.
Build vertically collapsing accordions in combination with our Collapse JavaScript plugin.
How it works
The accordion uses collapse internally to make it collapsible.
Basic example
Click the accordions below to expand/collapse the accordion content.
MDBAccordionItem, though the transition does limit overflow. MDBAccordionItem, though the transition does limit overflow. MDBAccordionItem, though the transition does limit overflow. <template> <MDBAccordion v-model="activeItem"> <MDBAccordionItem headerTitle="Accordion Item #1" collapseId="collapseOne" > <strong>This is the first item's accordion body.</strong> It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem headerTitle="Accordion Item #2" collapseId="collapseTwo" > <strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem headerTitle="Accordion Item #3" collapseId="collapseThree" > <strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> </MDBAccordion> </template> <script> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; export default { components: { MDBAccordion, MDBAccordionItem }, setup(){ const activeItem = ref('collapseOne'); return { activeItem } } }; </script> <script setup lang="ts"> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; const activeItem = ref('collapseOne'); </script> Flush
Add flush to remove the default background-color, some borders, and some rounded corners to render accordions edge-to-edge with their parent container.
<template> <MDBAccordion v-model="activeItem" flush> <MDBAccordionItem headerTitle="Accordion Item #1" collapseId="flush-collapseOne" > <strong>This is the first item's accordion body.</strong> It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem headerTitle="Accordion Item #2" collapseId="flush-collapseTwo" > <strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem headerTitle="Accordion Item #3" collapseId="flush-collapseThree" > <strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> </MDBAccordion> </template> <script> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; export default { components: { MDBAccordion, MDBAccordionItem }, setup(){ const activeItem = ref('flush-collapseOne'); return { activeItem } } }; </script> <script setup lang="ts"> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; const activeItem = ref('flush-collapseOne'); </script> Borderless
Add .accordion-borderless to remove all the borders and add a background color to the active item.
.accordion-flush class. This is the first item's accordion body. .accordion-flush class. This is the second item's accordion body. Let's imagine this being filled with some actual content. .accordion-flush class. This is the third item's accordion body. Nothing more exciting happening here in terms of content, but just filling up the space to make it look, at least at first glance, a bit more representative of how this would look in a real-world application. <template> <MDBAccordion v-model="activeItem" borderless> <MDBAccordionItem headerTitle="Accordion Item #1" collapseId="collapseOne" > <strong>This is the first item's accordion body.</strong> It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem headerTitle="Accordion Item #2" collapseId="collapseTwo" > <strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem headerTitle="Accordion Item #3" collapseId="collapseThree" > <strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> </MDBAccordion> </template> <script> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; export default { components: { MDBAccordion, MDBAccordionItem }, setup(){ const activeItem = ref('collapseOne'); return { activeItem } } }; </script> <script> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; const activeItem = ref('collapseOne'); </script> With icons
You can easily add icons to the header of the accordion. Read icons docs to see all the available icons.
.accordion-body, though the transition does limit overflow. .accordion-body, though the transition does limit overflow. .accordion-body, though the transition does limit overflow. <template> <MDBAccordion v-model="activeItem"> <MDBAccordionItem icon="fas fa-question-circle fa-sm me-2 opacity-70" headerTitle="Accordion Item #1" collapseId="collapseOne" > <strong>This is the first item's accordion body.</strong> It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem icon="fas fa-question-circle fa-sm me-2 opacity-70" headerTitle="Accordion Item #2" collapseId="collapseTwo" > <strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem icon="fas fa-question-circle fa-sm me-2 opacity-70" headerTitle="Accordion Item #3" collapseId="collapseThree" > <strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> </MDBAccordion> </template> <script> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; export default { components: { MDBAccordion, MDBAccordionItem }, setup(){ const activeItem = ref('collapseOne'); return { activeItem } } }; </script> <script> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; const activeItem = ref('collapseOne'); </script> Always open
To make accordion items stay open when another item is opened add stayOpen property to the MDBAccordion component.
MDBAccordionItem, though the transition does limit overflow. MDBAccordionItem, though the transition does limit overflow. MDBAccordionItem, though the transition does limit overflow. <template> <MDBAccordion v-model="activeItem" stayOpen> <MDBAccordionItem headerTitle="Accordion Item #1" collapseId="stayOpen-collapseOne" > <strong>This is the first item's accordion body.</strong> It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem headerTitle="Accordion Item #2" collapseId="stayOpen-collapseTwo" > <strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> <MDBAccordionItem headerTitle="Accordion Item #3" collapseId="stayOpen-collapseThree" > <strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the MDBAccordionItem, though the transition does limit overflow. </MDBAccordionItem> </MDBAccordion> </template> <script> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; export default { components: { MDBAccordion, MDBAccordionItem }, setup(){ const activeItem = ref('stayOpen-collapseOne'); return { activeItem } } }; </script> <script setup lang="ts"> import { MDBAccordion, MDBAccordionItem } from "mdb-vue-ui-kit"; import { ref } from "vue"; const activeItem = ref('stayOpen-collapseOne'); </script> Accessibility
Please read the collapse accessibility section for more information.
Accordion - API
Import
<script> import { MDBAccordion, MDBAccordionItem } from 'mdb-vue-ui-kit'; </script> Properties
MDBAccordion
| Name | Type | Default | Description |
|---|---|---|---|
tag | String | 'div' | Defines tag of the MDBAccordion element |
flush | Boolean | false | Removes the default background-color, some borders, and some rounded corners from the accordion items |
stayOpen | Boolean | false | Makes accordion items stay open when another item is opened |
classes | String | | Allows for custom classes for the element wrapper |
v-model | String | | Sets accordion item with given id active |
MDBAccordionItem
| Name | Type | Default | Description | Example |
|---|---|---|---|---|
tag | String | 'div' | Defines tag of the MDBAccordionItem element | |
collapseId | String | | Defines item id of the MDBAccordionItem element. Property is required | |
headerTitle | String | | Defines header title of the element | |
headerClasses | String | | Allows for custom classes for the header title element | |
bodyClasses | String | | Allows for custom classes for the body element of the item | |
itemClasses | String | | Allows for custom classes for the item wrapper |
CSS variables
As part of MDB’s evolving CSS variables approach, accordion now uses local CSS variables on .accordion for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.
// .accordion --#{$prefix}accordion-color: #{$accordion-color}; --#{$prefix}accordion-bg: #{$accordion-bg}; --#{$prefix}accordion-transition: #{$accordion-transition}; --#{$prefix}accordion-border-color: #{$accordion-border-color}; --#{$prefix}accordion-border-width: #{$accordion-border-width}; --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; --#{$prefix}accordion-btn-color: #{$accordion-button-color}; --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; --#{$prefix}accordion-btn-focus-border-color: #{$accordion-button-focus-border-color}; --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; // .accordion-flush --#{$prefix}accordion-flush-btn-box-shadow: #{$accordion-flush-button-box-shadow}; --#{$prefix}accordion-flush-border-bottom: #{$accordion-flush-item-border-bottom}; // .accordion-borderless --#{$prefix}accordion-borderless-btn-border-radius: #{$accordion-borderless-button-border-radius}; --#{$prefix}accordion-borderless-btn-bg: #{$accordion-borderless-button-bgc}; --#{$prefix}accordion-borderless-btn-color: #{$accordion-borderless-button-color}; SCSS variables
$accordion-padding-y: 1.15rem; $accordion-padding-x: 1.5rem; $accordion-color: var(--#{$prefix}surface-color); $accordion-bg: var(--#{$prefix}body-bg); $accordion-border-width: var(--#{$prefix}border-width); $accordion-border-color: var(--#{$prefix}border-color); $accordion-border-radius: $border-radius-lg; $accordion-inner-border-radius: subtract( $accordion-border-radius, $accordion-border-width ); $accordion-body-padding-y: $accordion-padding-y; $accordion-body-padding-x: $accordion-padding-x; $accordion-button-padding-y: $accordion-padding-y; $accordion-button-padding-x: $accordion-padding-x; $accordion-button-color: var(--#{$prefix}surface-color); $accordion-button-bg: var(--#{$prefix}accordion-bg); $accordion-transition: $btn-transition, border-radius 0.15s ease; $accordion-button-active-bg: var(--#{$prefix}surface-bg); $accordion-button-active-color: $primary; $accordion-button-focus-border-color: $input-focus-border-color; $accordion-button-focus-box-shadow: inset 0 -1px 0 var(--#{$prefix}border-color); $accordion-icon-width: 1.25rem; $accordion-icon-color: $surface-color;; $accordion-icon-active-color: $primary; $accordion-icon-transition: transform 0.2s ease-in-out; $accordion-icon-transform: rotate(-180deg); $accordion-button-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-color}' stroke-linecap='round' stroke-linejoin='round'><path d='M2 5L8 11L14 5'/></svg>"); $accordion-button-active-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-active-color}' stroke-linecap='round' stroke-linejoin='round'><path d='M2 5L8 11L14 5'/></svg>"); $accordion-flush-button-box-shadow: inset 0 -2px 0 var(--#{$prefix}divider-color); $accordion-flush-item-border-bottom: 2px solid var(--#{$prefix}divider-color); $accordion-borderless-button-border-radius: 0.5rem; $accordion-borderless-button-bgc: var(--#{$prefix}primary-bg-subtle); $accordion-borderless-button-color: var(--#{$prefix}primary-text-emphasis);