【问题标题】:How to close collapsible div when opening new one打开新div时如何关闭可折叠div
【发布时间】:2020-07-27 17:29:30
【问题描述】:

我正在尝试设置可折叠的 div。它们工作正常,但是当我打开另一个可折叠 div 时,打开的不会关闭,除非我一个一个手动关闭它们。

如何在打开不同的div时自动制作一个打开的可折叠div?

HTML

<html>
  <button type="button" class="collapsible">BUTTON</button>
  <div class="content">
    <p style="padding: 20px 0;">CONTENT</p>
  </div>
  <button type="button" class="collapsible">BUTTON</button>
  <div class="content">
    <p style="padding: 20px 0;">CONTENT</p>
  </div>
  <button type="button" class="collapsible">BUTTON</button>
  <div class="content">
    <p style="padding: 20px 0;">CONTENT</p>
  </div>
</html>

JS

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";
    }
  });
}

【问题讨论】:

  • 请包含您的 html。您的 ID 或课程应该有问题

标签: javascript html css collapse


【解决方案1】:

在打开折叠的 div 之前,您的代码必须关闭所有打开的 div。

// toggle collapse of specified content
function toggleContent(content) {
  if (content.style.maxHeight) {
    content.style.maxHeight = null;
  } else {
    content.style.maxHeight = content.scrollHeight + 'px';
  }
}

// collapse all open content
function collapseAllOpenContent() {
  const colls = document.getElementsByClassName('collapsible');
  for (const coll of colls) {
    if (coll.classList.contains('active')) {
      coll.classList.remove('active');
      toggleContent(coll.nextElementSibling);
    }
  }
}

工作示例:

// toggle collapse of specified content
function toggleContent(content) {
  if (content.style.maxHeight) {
    content.style.maxHeight = null;
  } else {
    content.style.maxHeight = content.scrollHeight + 'px';
  }
}

// collapse all open content
function collapseAllOpenContent() {
  const colls = document.getElementsByClassName('collapsible');
  for (const coll of colls) {
    if (coll.classList.contains('active')) {
      coll.classList.remove('active');
      toggleContent(coll.nextElementSibling);
    }
  }
}

const colls = document.getElementsByClassName('collapsible');
for (const coll of colls) {
  coll.addEventListener('click', function() {
    if (!this.classList.contains('active')) {
      collapseAllOpenContent();
    }
    this.classList.toggle('active');
    toggleContent(this.nextElementSibling);
  });
}
.collapsible {
  background-color: #fff;
  color: #555;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
}

.active,
.collapsible:hover {
  background-color: #fff;
}

.collapsible:after {
  content: '\002B';
  color: #555;
  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: #fff;
}
<button type="button" class="collapsible">BUTTON</button>
<div class="content">
  <p style="padding: 20px 0;">CONTENT</p>
</div>
<button type="button" class="collapsible">BUTTON</button>
<div class="content">
  <p style="padding: 20px 0;">CONTENT</p>
</div>
<button type="button" class="collapsible">BUTTON</button>
<div class="content">
  <p style="padding: 20px 0;">CONTENT</p>
</div>

【讨论】:

  • 我放弃了导致崩溃的部分,现在已修复。请参阅工作示例。
  • 最后一件事:在你的例子中,打开的 div 不能再关闭了;它会保持打开状态。如果它可以像添加之前那样关闭就完美了
  • 好的,它现在允许手动关闭打开的 div。我还清理了一些代码。
  • 这简直太棒了!再一次,我希望我知道所有这些东西。我根本不是开发人员,我只是用基本的 html 和 css 知识运行自己的网站。所以当我遇到这种困难时,我完全被它阻止了......偶尔我可以自己解决它,但正如你所看到的,这次我无法解决。谢谢哥们,你今天对我很有帮助,我非常感谢你的时间和耐心:)
  • 您已经创建了所谓的手风琴,这是 Bootstrap 的内置功能。使用 Bootstrap 可以节省大量 JavaScript 编码。这是一个手风琴示例:tutorialrepublic.com/…,这是 Bootstrap 主页:getbootstrap.com
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 2012-06-20
  • 1970-01-01
  • 2013-01-09
  • 2023-04-07
  • 2013-04-20
  • 2022-01-16
  • 2017-02-12
相关资源
最近更新 更多