If Users can't find what they want in a website in the First 3 Seconds, then they're Leaving.
In order to prevent this misfortune, we can organize our FAQ/contents in an Animated Accordion. Like this one below π
This Blog is About Building A FAQ Accordion in 2021 using CSS & JS. So, Let's start the Journey πͺ
Codepen π₯
You can find the full code on Codepen
Youtube Tutorial π₯
If this post is difficult for you then see Step by step Tutorial on Youtube π₯
Table Of Contents π₯
HTML :
We're gonna create 4 div inside a parent div with class name container. Let's start small with 1 item.
Like this π
<div class="container">
<h1>Frequently Asked Questions</h1>
<div class = "item-1"> </div>
</div>
Next up, setup 2 siblings with class-name .accordion & .panel inside .item-1 class
<div class="container">
<h1>Frequently Asked Questions</h1>
<div class = "item-1">
<div class="accordion"> </div>
<div class="panel"> </div>
</div>
</div>
Inside .accordion, create 2 siblings- .title & .icon
Inside .icon, write "+"
Inside .title, write your content, *anything u wish.
Inside .panel, set some dummy text.
<div class="container">
<h1>Frequently Asked Questions</h1>
<div class = "item-1">
<div class="accordion">
<div class="title">How to Install?</div>
<div class="icon">+</div>
</div>
<div class="panel">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit.
Rem commodi provident modi eligendi consequuntur esse
consequatur quis corrupti delectus quas.
</p>
</div>
</div>
</div>
Like this, create 4 sibling div, and end up the HTML Part.
<div class="container">
<h1>Frequently Asked Questions</h1>
<div class="item-1">
<div class="accordion">
<div class="title">How To Install ?</div>
<div class="icon">+</div>
</div>
<div class="panel">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit.
Rem commodi provident modi eligendi consequuntur esse
consequatur quis corrupti delectus quas.
</p>
</div>
</div>
<div class="item-2">
<div class="accordion">
<div class="title">How To Uninstall ?</div>
<div class="icon">+</div>
</div>
<div class="panel">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit.
Rem commodi provident modi eligendi consequuntur esse
consequatur quis corrupti delectus quas.
</p>
</div>
</div>
<div class="item-3">
<div class="accordion">
<div class="title">How To Upgrade ?</div>
<div class="icon">+</div>
</div>
<div class="panel">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit.
Rem commodi provident modi eligendi consequuntur esse
consequatur quis corrupti delectus quas.
</p>
</div>
</div>
<div class="item-4">
<div class="accordion">
<div class="title">Refund Policy ?</div>
<div class="icon">+</div>
</div>
<div class="panel">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit.
Rem commodi provident modi eligendi consequuntur esse
consequatur quis corrupti delectus quas.
</p>
</div>
</div>
</div>
Rules Setup :
In this part,
We're gonna pick "Poppins" as the font-family,
Create a template using a mixin,
Create some commonly used variables, and
Change default styles by the * selector.
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap');
//*** Template of the CSS Flexbox Model******
@mixin flex($jus,$ali){
display: flex;
justify-content:$jus;
align-items:$ali;
}
// Commonly used Values/colors as variables
$bgc: #000;
$color-1: #fff;
$color-2: red;
*{
margin:0px;
padding:0px;
box-sizing:border-box;
body{
@include flex(center,null);
width:100%;
min-height:100vh;
background-color: $bgc;
color: $color-1;
font-family: 'Poppins';
}
}
SCSS :
First, style the .container
.container{
width:80%;
//***Media Query to make the Accordion look good on larger screens.
@media (min-width: 800px){
width:45%;
}
h1{
text-align:center;
font-weight:300;
margin: 50px 0;
}
}
Then, style the .accordion
// Targetting & styling all .accordion classes
.accordion{
@include flex(space-between,null);
border-bottom: 2px solid $color-2;
font-size: 22px;
letter-spacing: 5px;
// text-transform: uppercase;
font-weight: 500;
cursor:pointer;
transition: all .3s ease;
&:hover{
color: $color-2;
}
}
Next up, style the .panel
// Targetting & styling all .panel classes
.panel{
max-height: 0px;
overflow:hidden;
transition: all 1s ease;
p{
margin: 10px 0px 10px 20px;
text-align:justify;
}
}
Finally, create an extra .open class to be used in JS
// This is an extra class. It will be used inside javascript.
// it's main task is to change color of accordion title from white to red.
.open{
color : $color-2;
}
JavaScript :
Explanation is given as comments on the code. If you don't understand this part, then scroll to top, and see the youtube tutorial.
// Targetting all the .accordion classes
let acc = document.getElementsByClassName('accordion')
// console.log(acc);
// Creating a loop to add eventListener to all .accordion classes
for(let i=0;i<acc.length;i++){
acc[i].addEventListener('click',function(){
//targetting sibling of every .accordion class named .panel class
let panel = this.nextElementSibling
//if panel is open, then this block will close it on mouse click
if(panel.style.maxHeight){
panel.style.maxHeight=null;
this.classList.remove('open')
this.getElementsByClassName('icon')[0].innerHTML ='+';
}
//if panel is closed, then this block will open it on mouse click
else{
//Removes everthing on previous accordion on new mouse click
//by this for loop
for(let x=0;x<acc.length; x++){
acc[x].classList.remove('open')
acc[x].nextElementSibling.style.maxHeight=null;
acc[x].getElementsByClassName('icon')[0].innerHTML ='+';
}
//if panel is closed, then these codes will open it on mouse click & set those specific rules mentioned below.
panel.style.maxHeight = panel.scrollHeight + 'px';
this.classList.toggle('open')
this.getElementsByClassName('icon')[0].innerHTML ='-'
}
})
}
Once Again, if this post is difficult for you then see Step by step Tutorial on Youtube π₯
Conclusion :
Congratulations ποΈ
We're done with the project. π₯
Let me Know your Thoughts on the Comment Box.
Suggestions & Criticisms are Highly Appreciated β€οΈοΈ
Youtube / Joy Shaheb
Twitter / JoyShaheb
Instagram / JoyShaheb
Top comments (0)