In this post, let's cover how we can create a simple Accordion component using VueJS and Boostrap styling library.
Here is the Vue Component
Vue.component('toggle-component',{
template: `<div class="toggle" :class="{ active: isActive }">
<div class="toggle-title border-bottom py-3 font-weight-bolder text-secondary" @click="toggleContent">
<slot name="title"></slot>
</div>
<transition name="fadeHeight" mode="out-in">
<div class="toggle-content py-3" v-if="isActive">
<slot name="content"></slot>
</div>
</transition>
</div>`,
data(){
return{
isActive: false
}
},
methods:{
toggleContent(){
this.isActive = !this.isActive
}
}
});
In the template named slot and used two sections in the template, one with class toggle-title
and one with toggle-content
.
In the javascript, we used a single data property that keeps track of if the content is visible, we toggle the property on the click of the title.
Here is the CSS
.toggle-title {
position: relative;
cursor: pointer;
}
.toggle-title:before {
content: " ";
position: absolute;
top: calc(50% + 1px);
right: 14px;
border-color: #ccc;
border-top: 1px solid;
border-right: 1px solid;
width: 8px;
height: 8px;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
transition: transform .3s,top .3s;
transform: rotate(-45deg) translate3d(0,-50%,0);
transform-origin: 35%;
}
.toggle.active>.toggle-title:before {
top: calc(50% - 8px);
transform: rotate(135deg);
}
.fadeHeight-enter-active,
.fadeHeight-leave-active {
transition: all 0.3s;
max-height: 230px;
}
.fadeHeight-enter,
.fadeHeight-leave-to
{
opacity: 0;
max-height: 0px;
}
Here is how you can use this component to create a collapse and expand style accordion
<div id="app">
<toggle-component>
<template v-slot:title>
This is a sample title 1
</template>
<template v-slot:content>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum, explicabo eaque rerum numquam error dolore autem dolor, esse consequatur voluptas necessitatibus rem. Minus nobis, atque mollitia aliquid repellat qui nulla!
</template>
</toggle-component>
<toggle-component>
<template v-slot:title>
This is a sample title 2
</template>
<template v-slot:content>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum, explicabo eaque rerum numquam error dolore autem dolor, esse consequatur voluptas necessitatibus rem. Minus nobis, atque mollitia aliquid repellat qui nulla!
</template>
</toggle-component>
<toggle-component>
<template v-slot:title>
This is a sample title 3
</template>
<template v-slot:content>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum, explicabo eaque rerum numquam error dolore autem dolor, esse consequatur voluptas necessitatibus rem. Minus nobis, atque mollitia aliquid repellat qui nulla!
</template>
</toggle-component>
</div>
[WP-Coder id="19"]
Comments