我用一个简单的JavaScript手风琴打开/关闭列表项目如下。是否有可能,以确保所有打开的列表项关闭时,一个新的打开(而不是留下每一个列表项开放直到手动关闭目前的方式)?
CODEPEN的位置:
https://codepen.io/anon/pen/zejJpJ
JS
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";
}
});
}
HTML
<ul class="track-listing">
<li>
<button class="accordion">TITLE</button>
<div class="panel">
<p>Panel content</p>
</div>
</li>
<li>
<button class="accordion">TITLE</button>
<div class="panel">
<p>Panel content</p>
</div>
</li>
<li>
<button class="accordion">TITLE</button>
<div class="panel">
<p>Panel content</p>
</div>
</li>
</ul>
是的,你可以通过打开一个新之前关闭所有其他手风琴:
for (var j = 0; j < acc.length; j++) {
var button = acc[j];
if (button === this) continue;
button.classList.remove("active");
var panel = button.nextElementSibling;
panel.style.maxHeight = null;
}
var acc = document.getElementsByClassName("accordion");
for (var i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
// Close all other accordions
for (var j = 0; j < acc.length; j++) {
var button = acc[j];
if (button === this) continue;
button.classList.remove("active");
var panel = button.nextElementSibling;
panel.style.maxHeight = null;
}
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.maxHeight) {
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
}
.accordion {
background-color: #1e1e1e;
color: #c0b9b4;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 1em;
transition: 0.4s;
margin: 0 0 2px 0;
}
ul.track-listing {
padding: 0;
margin: 0;
list-style-type: none;
}
.active,
.accordion:hover {
background-color: #c0b9b4;
color: #1e1e1e;
}
.accordion:after {
content: 'LYRICS \002B ';
color: #777;
float: right;
margin-left: 5px;
}
.active:after {
content: "\2212";
}
.panel {
padding: 0 18px;
background-color: #1e1e1e;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
color: #c0b9b4;
}
<ul class="track-listing">
<li>
<button class="accordion">TITLE</button>
<div class="panel">
<p>Panel content</p>
</div>
</li>
<li>
<button class="accordion">TITLE</button>
<div class="panel">
<p>Panel content</p>
</div>
</li>
<li>
<button class="accordion">TITLE</button>
<div class="panel">
<p>Panel content</p>
</div>
</li>
</ul>
是的,你可以通过acc
阵列再次迭代,并关闭不具备相同的索引封闭的手风琴。
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function () {
toggleAccordion(this);
if (this.classList.contains("active")) {
for (var j = 0; j < acc.length; j++) {
if (i != j) {
acc[j].nextElementSibling.style.maxHeight = null;
}
}
}
});
}
function toggleAccordion(button) {
button.classList.toggle("active");
var panel = button.nextElementSibling;
if (panel.style.maxHeight) {
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
}
您可以通过具有能够与特定闭合的状态下覆盖的切换功能做到这一点。这样,你只需切换之前关闭一切除了点击一个。这里是forked pen,用下面的代码。
var acc = document.getElementsByClassName("accordion")
const toggleAccordian = (acc, open = !acc.classList.contains('active')) => {
acc.classList.toggle('active', open)
const panel = acc.nextElementSibling
panel.style.maxHeight = open ? panel.scrollHeight + "px" : null
}
const elems = Array.from(acc)
elems.forEach(a => {
a.addEventListener('click', () => {
elems
.filter(e => e !== a)
.forEach(e => toggleAccordian(e, false))
toggleAccordian(a)
})
})