Javascript 子级展开时,嵌套可折叠文件不能正确显示其内容

Javascript 子级展开时,嵌套可折叠文件不能正确显示其内容,javascript,html,css,Javascript,Html,Css,从中找到的代码开始,我想创建一个可折叠菜单,它也适用于嵌套内容 var coll=document.getelementsbyclassname可折叠; var i; 对于i=0;i

从中找到的代码开始,我想创建一个可折叠菜单,它也适用于嵌套内容

var coll=document.getelementsbyclassname可折叠; var i; 对于i=0;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";
    }
    // from last to first to recalculate parent height after child
    for (var j = coll.length - 1; j >= 0;  j--) {
      if (coll[j].classList.contains('active')) {
        console.log(j, coll[j].classList);
        var c2 = coll[j].nextElementSibling;
        console.log(c2);
        c2.style.maxHeight = null;
        c2.style.maxHeight = c2.scrollHeight + "px";
      }
    }
  });
}
但若css转换被禁用,上面的代码将起作用,因为js在转换完成之前立即触发

所以,如果需要转换,您可以在转换结束后添加超时来检查修改。大概是这样的:

var coll = document.getElementsByClassName("collapsible");
var i;

var checkCollapsible = function() {
  for (var j = coll.length - 1; j >= 0;  j--) {
      if (coll[j].classList.contains('active')) {
        console.log(j, coll[j].classList);
        var c2 = coll[j].nextElementSibling;
        console.log(c2);
        c2.style.maxHeight = null;
        c2.style.maxHeight = c2.scrollHeight + "px";
      }
    }
};

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";
    } 
    window.setTimeout(checkCollapsible, 200);
  });
}
还有一些transitionend事件可用。所以对于webkit,您可以使用类似于部分代码的东西

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";
    }
   content.addEventListener('webkitTransitionEnd', checkCollapsible);
  });
}

例如。

谢谢。但是,对我来说,效果似乎有点难看过渡不是平滑的,滞后是相当大的。我正在考虑使用maxHeight属性遍历并更新父级。。。