Как сделать так, чтобы в аккордеоне при открытии одной вкладке, закрывалась другая
Помогите закрыть вкладку при открытии другой. В идеале бы еще, чтобы средняя вкладка была открыта по умолчанию)
<section class="programms">
<h2 class="programms-title">Программы</h2>
<div class="FAQ-programms">
<button class="accordion">Английский язык для дошкольников<div class="arrow-background"></div></button>
<div class="panel">
<div class="panel-line"></div>
<p class="panel-text">Ответ на Вопрос 1...</p>
</div>
<button class="accordion">Английский язык для взрослых<div class="arrow-background"></div></button>
<div class="panel">
<div class="panel-line"></div>
<p class="panel-text">Школьники учатся писать первые диктанты, сочинения, создавать проекты и защищать их. На уроках проводится много игр на иностранном языке, что привлекает и вызывает интерес у ребенка к изучению языков больше, чем просто обычный школьный урок.</p>
<button class="button">Записаться</button>
<div class="button-line"></div>
</div>
<button class="accordion">Подготовка к государственным экзаменам<div class="arrow-background"></div></button>
<div class="panel">
<div class="panel-line"></div>
<p class="panel-text">Ответ на Вопрос 3 ...</p>
</div>
</div>
<section/>
.accordion {
background-color: #FFF;
color: #2D2D2D;
cursor: pointer;
padding-left: 32px;
width: 700px;
height: 96px;
border: none;
text-align: left;
outline: none;
font-size: 24px;
transition: 0.5s;
border-radius: 4px;
font-family: Merriweather;
line-height: 30px;
letter-spacing: 0.02em;
padding-top: 23px;
}
.active {
border-radius: 4px 4px 0px 0px;
transition: max-height 0.1s ease-out;
}
.accordion:after {
width: 8px;
height: 8px;
text-align: center;
content: " ";
transform: rotate(45deg);
transition: all 0.2s ease-in-out;
float: right;
border-right: 2px solid #6B6B6E;
border-bottom: 2px solid #6B6B6E;
margin-top: 9px;
}
.active:after {
width: 8px;
height: 8px;
text-align: center;
content: " ";
transform: rotate(-135deg);
transition: all 0.2s ease-in-out;
float: right;
border-right: 2px solid #6B6B6E;
border-bottom: 2px solid #6B6B6E;
margin-top: 14px;
}
.panel {
color: #6B6B6E;
background-color: #fff;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
margin-bottom: 8px;
width: 700px;
font-family: Open Sans;
font-size: 20px;
line-height: 32px;
border-radius: 0px 0px 4px 4px;
}
.panel-text {
text-align: left;
margin-left: 32px;
margin-right: 32px;
margin-bottom: 24px;
margin-top: 24px;
}
.arrow-background {
height: 48px;
width: 48px;
border-radius: 90px;
border: 3px solid #E1E1E8;
position: relative;
right: 32px;
bottom: 10px;
float: right;
display: flex;
}
.arrow-active {
height: 48px;
width: 48px;
background: #E1E1E8;
border-radius: 90px;
border: 3px solid #E1E1E8;
position: relative;
right: 32px;
bottom: 10px;
float: right;
display: flex;
}
.accordion:active .arrow-background {
height: 48px;
width: 48px;
background: #E1E1E8;
border-radius: 90px;
border: 3px solid #E1E1E8;
position: relative;
right: 32px;
bottom: 10px;
float: right;
display: flex;
}
.panel-line {
width: 636px;
height: 0px;
position: relative;
left: 32px;
border: 1px solid #E1E1E8;
}
/* кнопка Записаться */
.button {
margin-left: 32px;
margin-bottom: 24px;
height: 56px;
width: 157px;
border-radius: 3px;
font-family: Open Sans;
font-weight: 600;
font-size: 18px;
line-height: 24px;
background-color: #0F4C81;
color: #FFF;
border: none;
}
.button-line {
width: 157px;
height: 6px;
background-color: #D20004;
margin-left: 32px;
position: relative;
bottom: 30px;
border-radius: 0px 0px 4px 4px;
}
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.maxHeight){
panel.style.maxHeight = null;
}
else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
}
Ответы (2 шт):
Автор решения: highpassion
→ Ссылка
Можно у всех вкладок удалять класс .active перед присвоением этого класса активной вкладке
var acc = document.querySelectorAll(".accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", () => {
acc.forEach((n => n.classList.remove('active'))
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.maxHeight){
panel.style.maxHeight = null;
}
else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
}
Автор решения: ksa
→ Ссылка
Как сделать так, чтобы в аккордеоне при открытии одной вкладке, закрывалась другая
Такое можно реализовать вот таким образом... Скрипт мой и немного добавил в стиль селектора .accordion.
const clr = o => e => e !== o && e.classList.remove('active')
const act = e => {
const o = e.currentTarget
o.parentNode.querySelectorAll('.active').forEach(clr(o))
o.classList.toggle('active')
}
document.querySelectorAll('.accordion').forEach(o => o.addEventListener('click', act))
.accordion {
background-color: #FFF;
color: #2D2D2D;
cursor: pointer;
padding-left: 32px;
width: 700px;
height: 96px;
border: none;
text-align: left;
outline: none;
font-size: 24px;
transition: 0.5s;
border-radius: 4px;
font-family: Merriweather;
line-height: 30px;
letter-spacing: 0.02em;
padding-top: 23px;
&.active + .panel {
max-height: none ;
}
}
.active {
border-radius: 4px 4px 0px 0px;
transition: max-height 0.1s ease-out;
}
.accordion:after {
width: 8px;
height: 8px;
text-align: center;
content: " ";
transform: rotate(45deg);
transition: all 0.2s ease-in-out;
float: right;
border-right: 2px solid #6B6B6E;
border-bottom: 2px solid #6B6B6E;
margin-top: 9px;
}
.active:after {
width: 8px;
height: 8px;
text-align: center;
content: " ";
transform: rotate(-135deg);
transition: all 0.2s ease-in-out;
float: right;
border-right: 2px solid #6B6B6E;
border-bottom: 2px solid #6B6B6E;
margin-top: 14px;
}
.panel {
color: #6B6B6E;
background-color: #fff;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
margin-bottom: 8px;
width: 700px;
font-family: Open Sans;
font-size: 20px;
line-height: 32px;
border-radius: 0px 0px 4px 4px;
}
.panel-text {
text-align: left;
margin-left: 32px;
margin-right: 32px;
margin-bottom: 24px;
margin-top: 24px;
}
.arrow-background {
height: 48px;
width: 48px;
border-radius: 90px;
border: 3px solid #E1E1E8;
position: relative;
right: 32px;
bottom: 10px;
float: right;
display: flex;
}
.arrow-active {
height: 48px;
width: 48px;
background: #E1E1E8;
border-radius: 90px;
border: 3px solid #E1E1E8;
position: relative;
right: 32px;
bottom: 10px;
float: right;
display: flex;
}
.accordion:active .arrow-background {
height: 48px;
width: 48px;
background: #E1E1E8;
border-radius: 90px;
border: 3px solid #E1E1E8;
position: relative;
right: 32px;
bottom: 10px;
float: right;
display: flex;
}
.panel-line {
width: 636px;
height: 0px;
position: relative;
left: 32px;
border: 1px solid #E1E1E8;
}
/* кнопка Записаться */
.button {
margin-left: 32px;
margin-bottom: 24px;
height: 56px;
width: 157px;
border-radius: 3px;
font-family: Open Sans;
font-weight: 600;
font-size: 18px;
line-height: 24px;
background-color: #0F4C81;
color: #FFF;
border: none;
}
.button-line {
width: 157px;
height: 6px;
background-color: #D20004;
margin-left: 32px;
position: relative;
bottom: 30px;
border-radius: 0px 0px 4px 4px;
}
<section class="programms">
<h2 class="programms-title">Программы</h2>
<div class="FAQ-programms">
<button class="accordion">Английский язык для дошкольников<div class="arrow-background"></div></button>
<div class="panel">
<div class="panel-line"></div>
<p class="panel-text">Ответ на Вопрос 1...</p>
</div>
<button class="accordion">Английский язык для взрослых<div class="arrow-background"></div></button>
<div class="panel">
<div class="panel-line"></div>
<p class="panel-text">Школьники учатся писать первые диктанты, сочинения, создавать проекты и защищать их. На уроках проводится много игр на иностранном языке, что привлекает и вызывает интерес у ребенка к изучению языков больше, чем просто обычный школьный урок.</p>
<button class="button">Записаться</button>
<div class="button-line"></div>
</div>
<button class="accordion">Подготовка к государственным экзаменам<div class="arrow-background"></div></button>
<div class="panel">
<div class="panel-line"></div>
<p class="panel-text">Ответ на Вопрос 3 ...</p>
</div>
</div>
<section />