javascript - 如何编写 js Accordion 面板的紧密链接?

标签 javascript html css

我有很多内容,而且面板非常长。我希望可以选择通过该面板底部的关闭链接单独关闭每个面板。我正在使用来自以下位置的动画 Accordion 代码:

http://www.w3schools.com/howto/howto_js_accordion.asp

如何更改脚本/css 以使关闭链接正常工作?我不想为此使用 jQuery。

<!DOCTYPE html>
<html>
<head>
<style>
button.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;
}

button.accordion.active, button.accordion:hover {
    background-color: #ddd;
}

div.panel {
    padding: 0 18px;
    background-color: white;
    max-height: 0;
    overflow: hidden;
    transition: 0.6s ease-in-out;
    opacity: 0;
}

div.panel.show {
    opacity: 1;
    max-height: 500px;
}
</style>
</head>
<body>

<h2>Animated 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>
  <p><a href="#" class="close">Close</a></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>
  <p><a href="#" class="close">Close</a></p>
</div>

<button class="accordion">Section 3</button>
<div id="foo" 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>
  <p><a href="#" class="close">Close</a></p>
</div>

<script>
var acc = document.getElementsByClassName("accordion");
var i;

for (i = 0; i < acc.length; i++) {
    acc[i].onclick = function(){
        this.classList.toggle("active");
        this.nextElementSibling.classList.toggle("show");
  }
}
</script>

</body>
</html>

最佳答案

您必须获取具有 close 类的所有元素,然后将单击附加到每个元素,单击应该转到父面板并删除 active 类,我我认为您正在寻找:

var closes = document.getElementsByClassName("close");

for (var j = 0; j < closes.length; j++) {
    closes[j].onclick = function(){
        this.parentElement.parentElement.classList.remove("show");
    }
}

希望这有帮助。

var acc = document.getElementsByClassName("accordion");
var i;

for (i = 0; i < acc.length; i++) {
  acc[i].onclick = function(){
    this.classList.toggle("active");
    this.nextElementSibling.classList.toggle("show");
  }
}

var closes = document.getElementsByClassName("close");

for (var j = 0; j < closes.length; j++) {
  closes[j].onclick = function(){
    this.parentElement.parentElement.classList.remove("show");
    
    var section_title = this.parentElement.parentElement.previousSibling;
    section_title.previousElementSibling.classList.remove("active");
  }
}
button.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;
}

button.accordion.active, button.accordion:hover {
  background-color: #ddd;
}

div.panel {
  padding: 0 18px;
  background-color: white;
  max-height: 0;
  overflow: hidden;
  transition: 0.6s ease-in-out;
  opacity: 0;
}

div.panel.show {
  opacity: 1;
  max-height: 500px;
}
<h2>Animated 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>
  <p><a href="#" class="close">Close</a></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>
  <p><a href="#" class="close">Close</a></p>
</div>

<button class="accordion">Section 3</button>
<div id="foo" 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>
  <p><a href="#" class="close">Close</a></p>
</div>
<br><br><br>
<br><br><br>
<br><br><br>

关于javascript - 如何编写 js Accordion 面板的紧密链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271631/

相关文章:

javascript - Firefox 上的 HTTPS iFrame 出现安全错误

JQuery `.load()` 函数不执行加载页面中的 javascript

jquery - 使用 .hover() 时停止 setInterval() 函数?

html - 如何在我的面板标题的左侧和右侧添加文本?

html - IE7 和 z-index

javascript - 在 JavaScript 中,我可以获取包含脚本的节点吗?

javascript - 防止视频加载时重置 currentTime?

javascript - 为什么我不能更改已定义元素的 className

javascript - ngFor-Angular2 的问题

PHP/SQLite 接受不正确的发布值