Search code examples
cssvue.jsbootstrap-4bootstrap-vue

Bootstrap-vue Collapse: show state with arrow


I'm using Bootstrap-vue, and have a simple collapse component such that I can toggle the visibility of the content. I'm looking for a way to include an arrow icon in the toggle button that indicates the collapse state: arrow pointing down if content is opened, arrow pointing sideways if closed.

I have looked at the solution here Bootstrap 4 Collapse show state with Font Awesome icon. However, while this works for Bootstrap 4, I can't make it work with Bootstrap-vue because the markup elements are different. So, given my markup below, how can I achieve the collapse state arrow?

<div>
  <b-btn v-b-toggle.collapse3 class="m-1">Toggle Collapse</b-btn>
  <b-collapse visible id="collapse3">
     <b-card> some content </b-card>
  </b-collapse>
</div>

Solution

  • This was my solution in the end, based on Riddhi's answer:

    <b-btn block href="#" v-b-toggle.accordion1 variant="secondary">
       Time Period
         <span class="when-opened">
             <font-awesome-icon icon="chevron-down" />
         </span>
         <span class="when-closed">
             <font-awesome-icon icon="chevron-right" />
         </span>
    </b-btn>
    
    <b-collapse id="accordion1" role="tabpanel">
       <!-- some content -->
    </b-collapse>
    

    With additional CSS:

    <style scoped>
    ...
        .collapsed > .when-opened,
        :not(.collapsed) > .when-closed {
            display: none;
        }
    
    ...
    </style>
    

    I installed and imported the Font Awesome packages, as described here https://fontawesome.com/how-to-use/on-the-web/using-with/vuejs and https://origin.fontawesome.com/how-to-use/with-the-api/setup/importing-icons. The import code, in my main.js file, lookes like this:

    import Vue from 'vue'
    ...
    import { library } from '@fortawesome/fontawesome-svg-core'
    import { faChevronRight, faChevronDown } from '@fortawesome/free-solid-svg-icons'
    import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
    
    library.add(faChevronRight, faChevronDown);
    
    Vue.component('font-awesome-icon', FontAwesomeIcon);
    ...