Я пытаюсь поместить переход от display: none к display: block в div.
Но переход не работает ...
var acc = document.getElementsByClassName("accordion");
var i;
var allpanel = document.getElementsByClassName("panel");
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
for (j = 0; j < allpanel.length; j++) {
allpanel[j].classList.remove("hasactive");
}
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.display === "block") {
// panel.style.display = "none";
panel.classList.remove("hasactive");
} else {
// panel.style.display = "block";
panel.classList.toggle("active");
}
});
}.accordion {
background-color: #00827D;
color: White;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
}
.active,
.accordion:hover {
background-color: #00827D;
}
.panel {
padding: 0 18px;
display: none;
background-color: white;
overflow: hidden;
}
.panel.active {
display: block;
transition: all 3s ease;
}<h2>Accordion</h2>
<div class = "accordion">Section 1</div>
<div class = "panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class = "accordion">Section 2</button>
<div class = "panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class = "accordion">Section 3</button>
<div class = "panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Взяв уловку от Как я могу перейти на высоту: 0; по высоте: авто; используя CSS?:
var acc = document.getElementsByClassName("accordion");
for (var i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
panel.classList.toggle("active");
});
}.accordion {
background-color: #00827D;
color: White;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
}
.active,
.accordion:hover {
background-color: #00827D;
}
.panel {
padding: 0 18px;
max-height: 0;
background-color: white;
overflow: hidden;
transition: all 3s ease;
}
.panel.active {
max-height: 100vh;
}<h2>Accordion</h2>
<div class = "accordion">Section 1</div>
<div class = "panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class = "accordion">Section 2</button>
<div class = "panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class = "accordion">Section 3</button>
<div class = "panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>Уловка заключается в замене max-height, а не display, потому что это обеспечивает плавный переход. Невозможно плавно перейти от занимающего место (display: block) к исчезновению (display: none) или наоборот.
именно то, что я искал. Спасибо
@Tyvain Я рад, что смог помочь!
Вы не можете анимировать / перемещать свойство отображения. Вы можете изменить непрозрачность / высоту / положение, чтобы имитировать это. Отображение представляет собой двоичное отображение или скрытие без перехода между двумя состояниями.