I'm trying to create a simple javascript accordion. All is good, except there is a slight jolt when one tab is open and you click to open another (in turn closing the previous one that was open).
I can't understand what is causing this issue. Feel like I'm going round in circles. If anyone can provide some assistance I'd be most grateful.
The issue is easier to see in this codepen
function initAcc(elem, option){
document.addEventListener('click', function (e) {
if (!e.target.matches(elem+' .accordion-toggle')) return;
else{
if(!e.target.parentElement.classList.contains('active')){
if(option==true){
var elementList = document.querySelectorAll(elem+' .accordion__container');
Array.prototype.forEach.call(elementList, function (e) {
e.classList.remove('active');
});
}
e.target.parentElement.classList.add('active');
}else{
e.target.parentElement.classList.remove('active');
}
}
});
}
initAcc('.accordion-wrapper', true);
.accordion-wrapper .accordion-toggle {
position: relative;
cursor: pointer;
padding: 20px 0;
margin: 0;
border-top: 1px solid; }
.accordion-wrapper .accordion-toggle .accordion-closed {
display: block; }
.accordion-wrapper .accordion-toggle .accordion-closed:after {
content: '+';}
.accordion-wrapper .accordion-toggle .accordion-open:after {
content: '-'; }
.accordion-wrapper .accordion-toggle .accordion-open {
display: none; }
.accordion-wrapper .accordion-toggle.border-top {
border-color: rgba(0,0,0,0.15); }
.accordion-wrapper .accordion-toggle span {
pointer-events: none; }
.accordion-wrapper .accordion__container.border-bottom {
border-bottom: 1px solid rgba(0,0,0,0.15); }
.accordion-wrapper .accordion__container.active .accordion-toggle .accordion-closed {
display: none; }
.accordion-wrapper .accordion__container.active .accordion-toggle .accordion-open {
display: block; }
.accordion-wrapper .accordion-toggle .accordion-open,
.accordion-wrapper .accordion-toggle .accordion-closed {
float: right; }
.accordion-wrapper .accordion-content {
position: relative;
transition: all 0.3s ease-in-out;
opacity: 0;
max-height: 0;
width: 100%;
opacity: 0;
height: auto;
max-height: 0;
overflow: hidden;}
.accordion-wrapper .accordion__container.active .accordion-content {
opacity: 1;
max-height: 600px; } }
<div class="accordion-wrapper">
<div class="accordion__container">
<p class="accordion-toggle border-top">Toggle 1
<span class="accordion-closed"></span>
<span class="accordion-open"></span>
</p>
<div class="accordion-content">
Content 1.
</div>
</div>
<div class="accordion__container">
<p class="accordion-toggle">Toggle 2
<span class="accordion-closed"></span>
<span class="accordion-open"></span>
</p>
<div class="accordion-content">
Content 2.
</div>
</div>
<div class="accordion__container">
<p class="accordion-toggle">Toggle 3
<span class="accordion-closed"></span>
<span class="accordion-open"></span>
</p>
<div class="accordion-content">
Content 3.
</div>
</div>
</div>