javascript - 我正在尝试制作一个可折叠的菜单,一次只打开 1 个纯 JavaScript
问题描述
这是我的代码和 JSfiddle 代码,我现在遇到一个问题,如果打开一个并且您尝试再次关闭它,它不会关闭。
https://jsfiddle.net/k68z3aLv/
var coll = document.getElementsByClassName("collapsible");
var i;
for (i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function() {
var b;
for(b = 0; b < coll.length; b++) {
if(coll[b] != coll[i]) {
if(coll[b].getAttribute('id') == 'submenuopened')
{
coll[b].classList.remove("active");
coll[b].setAttribute("id",'');
var content3 = coll[b].nextElementSibling;
content3.style.display = "none";
// sleep(0);
}
}
}
this.classList.toggle("active");
if(this.getAttribute('id') == 'submenuopened') {
this.setAttribute("id",'ha');
} else { this.setAttribute("id", "submenuopened"); }
var content = this.nextElementSibling;
if (content.style.display == 'block'){
content.style.display = "none";
} else {
content.style.display = "block";
}
});
}
.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;
}
.content {
padding: 0 18px;
display: none;
overflow: hidden;
background-color: #f1f1f1;
}
<button type="button" class="collapsible">Open Section 1</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 type="button" class="collapsible">Open Section 2</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 type="button" class="collapsible">Open Section 3</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>
解决方案
我对您的代码jsfiddle进行了一些优化,id
因为active
类就足够了,所以将其删除,打开/关闭移至 CSS,因为这是一种更好的方法,删除了额外的代码以使其看起来更清晰
var coll = document.getElementsByClassName("collapsible");
for (let i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function() {
for(let n = 0; n < coll.length; n++) {
if(coll[n] == this) continue;
coll[n].classList.remove("active");
}
this.classList.toggle("active");
});
}
.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.active + .content {
display: block;
}
.content {
padding: 0 18px;
display: none;
overflow: hidden;
background-color: #f1f1f1;
}
<button type="button" class="collapsible">Open Section 1</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 type="button" class="collapsible">Open Section 2</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 type="button" class="collapsible">Open Section 3</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>
推荐阅读
- go - Go gqlgen command not found 发生
- nginx - 如何在 nginx 设置中上传大于 1MB 的照片
- java - 初学者问题,不兼容的类型:布尔到 int。没看到问题
- bash - 以 root 身份调用 bash 函数,但给出“文件意外结束”
- django - Django RedirectView.as_view 总是以小写形式返回参数
- node.js - 没有可用的包 nodejs。错误:无事可做。Elastic Beanstalk 上的 Rails 应用程序
- angular - 根据屏幕尺寸订购 mat-grid-tile
- javascript - 无法使用while循环制作计时器
- php - PHP sqlsrv PDOStatement::rowCount
- r - ggplot 中的美学给出了意想不到的结果