javascript - 如何实现嵌套的可折叠?

标签 javascript html css

我在这个链接上使用动画可折叠代码:

https://www.w3schools.com/howto/howto_js_collapsible.asp

HTML:

<button type="button" class="collapsible">Open Collapsible</button>
<div class="content">
  <p>Lorem ipsum...</p>
</div>

CSS:

/* Style the button that is used to open and close the collapsible content 

*/
.collapsible {
  background-color: #eee;
  color: #444;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
}

/* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */
.active, .collapsible:hover {
  background-color: #ccc;
}

/* Style the collapsible content. Note: hidden by default */
.content {
  padding: 0 18px;
  display: none;
  overflow: hidden;
  background-color: #f1f1f1;
}

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.display === "block") {
      content.style.display = "none";
    } else {
      content.style.display = "block";
    }
  });
}

我想在第一个可折叠下拉菜单中实现另一个可折叠按钮。截至目前,当我单击 + 图标时,除了更改为 - 之外,我的嵌套按钮什么都不做。这是我的 html:

<button type="button" class="collapsible">Options:</button>
<div class="content">
    <button class="collapsible">Check</button>
    <div id="content"> 
        TEST 
    </div>
</div>

CSS 和 JS 与链接中相同。

最佳答案

我创建了第一个循环来计算所有类 content 的高度,以便能够将此数字用作主容器的 max-height。您可以改用 css display blocknone,但我这样做是为了创建动画。

var allHeights = 0;
var contents = document.getElementsByClassName("content");
var j;

for (j = 0; j < contents.length; j++) {
  var h = document.getElementsByClassName("content")[j].scrollHeight;
  allHeights += h;
}

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 == allHeights + "px"){
      content.style.maxHeight = "0px";
    } else {
      content.style.maxHeight = allHeights + "px";
    }
  });
}
.collapsible {
  background-color: #eee;
  color: #444;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
}

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

.content {
  padding: 0 18px;
  background-color: white;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.2s ease-out;
}

.collapsible:after {
  content: '\02795'; /* Unicode character for "plus" sign (+) */
  font-size: 13px;
  color: white;
  float: right;
  margin-left: 5px;
}

.active:after {
  content: "\2796"; /* Unicode character for "minus" sign (-) */
}
<button type="button" class="collapsible">First Collapsible</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>
  
  <button type="button" class="collapsible">Second Collapsible</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">Third Collapsible</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>
  
</div>

关于javascript - 如何实现嵌套的可折叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59428035/

相关文章:

javascript - jQuery - 跨窗口通信(弹出窗口选择文件,无服务器端)

html - 多个表格中的 CSS 定位

javascript - 为什么 <div> 内的文本不应该改变,而它显然应该改变?

javascript - 如何制作自定义验证错误消息?

jquery - html页面加载后文本消失

javascript - 如何在所有国家/地区仅显示阿联酋标准时间、月份、年份

javascript - 我的 jquery 中出现 NaN 错误

javascript - 动态地将 CSS 应用于单个字符?

javascript - parent 的 jQuery parent

html - 如何将 IFRAME 移动到 DIV 中?