Начиная с кода, найденного в https://www.w3schools.com/howto/howto_js_collapsible.asp, я хотел бы создать сворачиваемое меню, которое также работало бы для вложенного содержимого.
var coll = document.getElementsByClassName("collapsible");
var i;
for (i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function() {
this.classList.toggle("active");
var content = this.nextElementSibling;
if (content.style.maxHeight){
content.style.maxHeight = null;
} else {
content.style.maxHeight = content.scrollHeight + "px";
}
});
}
.collapsible {
background-color: #777;
color: white;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
}
.active, .collapsible:hover {
background-color: #555;
}
.collapsible:after {
content: '\002B';
color: white;
font-weight: bold;
float: right;
margin-left: 5px;
}
.active:after {
content: "\2212";
}
.content {
padding: 0 18px;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
background-color: #f1f1f1;
}
<button class="collapsible">Open Collapsible</button>
<div class="content">
<button class="collapsible">Open Collapsible</button>
<div class="content">
<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="collapsible">Open Collapsible</button>
<div class="content">
<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>
</div>
Приведенный выше код работает для первого (root) сворачиваемого объекта.
Однако, когда дочерний сворачиваемый объект раскрывается, недостаточно места для просмотра их содержимого.
Только если они остаются открытыми, закрытие root сворачиваемого объекта и его повторное открытие покажет дочерний контент правильно.
Я знаю, что проблема в в том, что, когда складной элемент root раскрывается, его содержимое maxHeight
устанавливается на scrollHeight + "px";
, и это будет высота дочернего элемента, который все еще закрыт.
Как я могу сделать maxHeight
сворачиваемых элементов динамически изменяются при расширении их дочерних элементов?