Properties
Property | Type | Default Value |
---|---|---|
id Required | String | |
is-nav | Boolean | false |
accordion | String | |
visible | Boolean | false |
tag | String | div |
v-model
Prop | Event |
---|---|
visible | input |
Easily toggle visibility of almost any content on your pages. Includes support for making accordions.
<div>
<b-button v-b-toggle.collapse-1 variant="primary">Toggle Collapse</b-button>
<b-collapse id="collapse-1" class="mt-2">
<b-card>
<p class="card-text">Collapse contents Here</p>
<b-button v-b-toggle.collapse-1-inner size="sm">Toggle Inner Collapse</b-button>
<b-collapse id="collapse-1-inner" class="mt-2">
<b-card>Hello!</b-card>
</b-collapse>
</b-card>
</b-collapse>
</div>
<!-- b-collapse.vue -->
Other elements can easily toggle <b-collapse>
components using the v-b-toggle
directive.
<div>
<!-- Using modifiers -->
<b-button v-b-toggle.collapse-2 class="m-1">Toggle Collapse</b-button>
<!-- Using value -->
<b-button v-b-toggle="'collapse-2'" class="m-1">Toggle Collapse</b-button>
<!-- Element to collapse -->
<b-collapse id="collapse-2">
<b-card>I am collapsible content!</b-card>
</b-collapse>
</div>
<!-- b-collapse-usage.vue -->
To make the <b-collapse>
show initially, set the visible
prop:
<div>
<b-button v-b-toggle.collapse-3 class="m-1">Toggle Collapse</b-button>
<b-collapse visible id="collapse-3">
<b-card>I should start open!</b-card>
</b-collapse>
</div>
<!-- b-collapse-visible.vue -->
v-model
supportThe component's collapsed (visible) state can also be set with v-model
which binds internally to
the visible
prop.
Note, when using v-model
to control <b-collapse>
, the aria-*
attributes and class collapsed
are not automatically placed on the trigger button (as is the case when using the v-b-toggle
directive). In this example we must control them ourselves.
<template>
<div>
<b-button
:class="showCollapse ? 'collapsed' : null"
:aria-expanded="showCollapse ? 'true' : 'false'"
aria-controls="collapse-4"
@click="showCollapse = !showCollapse"
>
Toggle Collapse
</b-button>
<b-collapse id="collapse-4" v-model="showCollapse" class="mt-2">
<b-card>I should start open!</b-card>
</b-collapse>
</div>
</template>
<script>
export default {
data() {
return {
showCollapse: true
}
}
}
</script>
<!-- b-collapse-v-model.vue -->
You can even collapse multiple <b-collapse>
components via a single v-b-toggle
by providing
multiple target IDs using modifiers:
<div>
<!-- Single button triggers two "<b-collapse>" components -->
<b-button v-b-toggle.collapse-a.collapse-b>Toggle Both Collapse A and B</b-button>
<!-- Elements to collapse -->
<b-collapse id="collapse-a" class="mt-2">
<b-card>I am collapsible content A!</b-card>
</b-collapse>
<b-collapse id="collapse-b" class="mt-2">
<b-card>I am collapsible content B!</b-card>
</b-collapse>
</div>
<!-- b-collapse-trigger-multiple.vue -->
Turn a group of <b-collapse>
components into an accordion by supplying an accordion group
identifier via the accordion
prop:
<template>
<div role="tablist">
<b-card no-body class="mb-1">
<b-card-header header-tag="header" class="p-1" role="tab">
<b-button block href="#" v-b-toggle.accordion-1 variant="info">Accordion 1</b-button>
</b-card-header>
<b-collapse id="accordion-1" visible accordion="my-accordion" role="tabpanel">
<b-card-body>
<b-card-text>I start opened because <code>visible</code> is <code>true</code></b-card-text>
<b-card-text>{{ text }}</b-card-text>
</b-card-body>
</b-collapse>
</b-card>
<b-card no-body class="mb-1">
<b-card-header header-tag="header" class="p-1" role="tab">
<b-button block href="#" v-b-toggle.accordion-2 variant="info">Accordion 2</b-button>
</b-card-header>
<b-collapse id="accordion-2" accordion="my-accordion" role="tabpanel">
<b-card-body>
<b-card-text>{{ text }}</b-card-text>
</b-card-body>
</b-collapse>
</b-card>
<b-card no-body class="mb-1">
<b-card-header header-tag="header" class="p-1" role="tab">
<b-button block href="#" v-b-toggle.accordion-3 variant="info">Accordion 3</b-button>
</b-card-header>
<b-collapse id="accordion-3" accordion="my-accordion" role="tabpanel">
<b-card-body>
<b-card-text>{{ text }}</b-card-text>
</b-card-body>
</b-collapse>
</b-card>
</div>
</template>
<script>
export default {
data() {
return {
text: `
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry
richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor
brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon
tempor, sunt aliqua put a bird on it squid single-origin coffee nulla
assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore
wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher
vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic
synth nesciunt you probably haven't heard of them accusamus labore VHS.
`
}
}
}
</script>
<!-- b-accordion.vue -->
Notes:
<b-collapse>
components
inside an element with role="tablist"
and set role="tab"
on each trigger element's container
(each trigger element should be wrapped) in order to help screen reader users navigate the
accordion group.v-model
feature of <b-collapse>
in accordion mode, do not bind the v-model
or
visible
prop of all the collapses in the accordion group to the same variable!<b-collapse>
in the accordion group has the visible
prop and/or
v-model
set to true
.When using the v-b-toggle
directive, the class collapsed
will automatically be placed on the
trigger element when the collapse is closed, and removed when open. You can use this class to
display or hide content within the toggle via custom CSS:
Example HTML markup:
<div>
<b-button v-b-toggle.my-collapse>
<span class="when-opened">Close</span> <span class="when-closed">Open</span> My Collapse
</b-button>
<b-collapse id="my-collapse">
<!-- Content here -->
</b-collapse>
</div>
Example Custom CSS:
.collapsed > .when-opened,
:not(.collapsed) > .when-closed {
display: none;
}
Using $root
instance it is possible to emit and listen events somewhere out of a component, where
<b-collapse>
is used. In short, $root
behaves like a global event emitters and listener. Details
about $root
instance can be found in
the official Vue docs.
To listen to any collapse state changes, use:
export default {
mounted() {
this.$root.$on('bv::collapse::state', (collapseId, isJustShown) => {
console.log('collapseId:', collapseId)
console.log('isJustShown:', isJustShown)
})
}
}
where collapseId
is collapse id which changed its state; isJustShown
is true/false, i.e.
shown/hidden collapse.
To toggle (open/close) a specific collapse, pass the collapse id
:
this.$root.$emit('bv::toggle::collapse', 'my-collapse-id')
The v-b-toggle
directive will automatically add the ARIA attributes aria-controls
and
aria-expanded
to the component that the directive appears on (as well as add the class collapsed
when not expanded). aria-expanded
will reflect the state of the target <b-collapse>
component,
while aria-controls
will be set to the ID(s) of the target <b-collapse>
component(s).
If using v-model
to set the visible state instead of the directive v-b-toggle
, you will be
required to, on the toggle element, add the aria-controls
and other appropriate attributes and
classes yourself.
While the v-b-toggle
directive can be placed on almost any HTML element or Vue component, it is
recommended to use a button or link (or similar component) to act as your toggler. Otherwise your
trigger elements may be inaccessible to keyboard or screen reader users. If you do place them on
something other than a button or link (or similar component), you should add the attributes
tabindex="0"
and role="button"
to allow users of assistive technology to reach your trigger
element.
When using accordion mode, make sure you place the trigger elements and <b-collapse>
components
inside an element with role="tablist"
and set role="tab"
on each trigger element's container in
order to help screen reader users navigate the accordion group. Unfortunately, BootstrapVue cannot
apply those roles for you automatically, as it depends on your final document markup.
Property | Type | Default Value |
---|---|---|
id Required | String | |
is-nav | Boolean | false |
accordion | String | |
visible | Boolean | false |
tag | String | div |
Prop | Event |
---|---|
visible | input |
Event | Arguments | Description |
---|---|---|
show | Emitted when collapse has started to open | |
shown | Emitted when collapse has finished opening | |
hide | Emitted when collapse has started to close | |
hidden | Emitted when collapse has finished closing | |
bv::collapse::state | id - changed state collapse idstate - true/false, i.e. opened/closed | Emitted on $root when collapse has changed its state |
You can control <b-collapse>
by emitting the following events on
$root:
Event | Arguments | Description |
---|---|---|
bv::toggle::collapse | id - collapse id to toggle | Toggles visible state of collapse with specified id when this event is emitted on $root |
CHANGED in 2.0.0-rc.22 You can import individual components into your project via the following named exports:
Component | Named Export | Import Path |
---|---|---|
<b-collapse> | BCollapse | bootstrap-vue |
Example:
import { BCollapse } from 'bootstrap-vue' Vue.component('b-collapse', BCollapse)
CHANGED in 2.0.0-rc.22 You can import individual directives into your project via the following named exports:
Directive | Named Export | Import Path |
---|---|---|
v-b-toggle | VBToggle | bootstrap-vue |
Example:
import { VBToggle } from 'bootstrap-vue' // Note: Vue automatically prefixes the directive name with 'v-' Vue.directive('b-toggle', VBToggle)
CHANGED in 2.0.0-rc.22 Importing plugins has been simplified.
This plugin includes all of the above listed individual components and directives. Plugins also include any component aliases.
Named Export | Import Path |
---|---|
CollapsePlugin PREFERRED | bootstrap-vue |
CollapsePlugin DEPRECATED | bootstrap-vue/es/components |
default DEPRECATED | bootstrap-vue/es/components/collapse |
Example:
// Importing the named export import { CollapsePlugin } from 'bootstrap-vue' Vue.use(CollapsePlugin)