HTML 手风琴 - 同时打开所有行

  • 本文关键字:手风琴 HTML javascript html
  • 更新时间 :
  • 英文 :


这个非常基本的手风琴工作得很好,你可以打开和关闭每一行,同时打开多行.

如何提供一个按钮操作,该操作将同时打开所有行,以及同时关闭所有行?

工作代码!!

var acc = document.getElementsByClassName("accordion");
var panel = document.getElementsByClassName("panel");
var len = panel.length;
var i, k;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.display === "block") {
panel.style.display = "none";
} else {
panel.style.display = "block";
}
});
}

function handleToggle() {
var open = 0, close = 0;
for (k = 0; k < len; k++) {
panel[k].style.display === "block" ? open++ : close++;
}
if(open && close && (open !== len || close !== len)) {
for (k = 0; k < len; k++) {
panel[k].style.display = "block";
}
}
if(open === len || close === len) {
for (k = 0; k < len; k++) {
if (panel[k].style.display === "block") {
panel[k].style.display = "none";
} else {
panel[k].style.display = "block";
}
}
}
}
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
.panel {
padding: 0 18px;
display: none;
background-color: white;
overflow: hidden;
}
<button onclick="handleToggle()">Toggle Accordian</button>
<h2>Accordion</h2>
<button class="accordion">Section 1</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 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>

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
.active, .accordion:hover {
background-color: #ccc; 
}
.panel {
padding: 0 18px;
display: none;
background-color: white;
overflow: hidden;
}
</style>
</head>
<body>
<button onclick="toggleAll()">Toggle</button>
<h2>Accordion</h2>
<button class="accordion">Section 1</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 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>
<script>
function toggleAll(){
var acc = document.getElementsByClassName("accordion");
var count = acc.length
var open = 0;
for (let i=0; i<count; i++){
open+=1 ? acc[i].nextElementSibling.style.display=="block":0
}
for (var i = 0; i < acc.length; i++) {
var panel = acc[i].nextElementSibling;
if (open==count) {
if(acc[i].classList.contains("active"))
acc[i].classList.toggle("active");
panel.style.display = "none";
} else {
if(!acc[i].classList.contains("active"))
acc[i].classList.toggle("active");
panel.style.display = "block";
}
}
}
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.display === "block") {
panel.style.display = "none";
} else {
panel.style.display = "block";
}
});
}
</script>
</body>
</html>

编辑:我已经更改了代码以关闭和打开所有行。请注意,此解决方案不考虑任何行的当前状态。

var acc = document.getElementsByClassName("accordion");
var btn = document.getElementById('toggle-all'); // store ref to button
var open = true;
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.display === "block") {
panel.style.display = "none";
} else {
panel.style.display = "block";
}
});
}
// add click event listener to new button
btn.addEventListener('click', () => {
const panels = document.querySelectorAll('.accordion');// select all headings
open = !open
// iterate over heading elements
panels.forEach(panel => {
const display = panel.nextElementSibling.style.display;// get current text of paragraph
panel.classList.toggle('active');// toggle active class
panel.nextElementSibling.style.display = open ? 'none' : 'block';// toggle paragraph display
})
})
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
.active, .accordion:hover {
background-color: #ccc; 
}
.panel {
padding: 0 18px;
display: none;
background-color: white;
overflow: hidden;
}
<button id='toggle-all'>Toggle All</button>
<h2>Accordion</h2>
<button class="accordion">Section 1</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 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>

</body>
</html>

最新更新