javascript - 单击展开的部分时折叠并展开其他部分

标签 javascript

我已附上代码。当我们打开/展开其他部分时,该部分将折叠。但当我们单击打开的按钮时,该部分不会折叠。 我想在这两种情况下实现该部分的折叠: 单击打开的按钮以及单击其他部分时折叠

请帮忙解决这个问题。提前致谢

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

for (var i = 0; i < coll.length; i++) {
  coll[i].addEventListener("click", function() {
    // before opening the accordion, you close everything
    for (var j = 0; j < coll.length; j++) {
      coll[j].classList.remove("active");
      coll[j].nextElementSibling.style.maxHeight = null;
    }
    this.classList.toggle("active");
    var content = this.nextElementSibling;
    if (content.style.maxHeight) {
      content.style.maxHeight = null;
    } else {
      content.style.maxHeight = content.scrollHeight + "px";
    } 
  });
}
.centered {
  position: absolute;
  margin-top:30px;
  left: 13%;
  color:white;
  font-weight: bold;
  font-size:35px;
  height:auto;
  display:inline-block;
}

@media (max-width: 1030px) {
  .centered {
    float: none;
    display: block;
    text-align: left;
    }
  
 #container {
  display:flex;
  margin-left:50px;
  align-items: center;
}  
}

.column {
  padding: 30px;
  height: 200px; 
  margin: -20px;
  width: 430px;
  height: 120px;
  border-radius: 10px;
  display: inline-block;
  border: 2px #e6e6e6;
  padding-left: 48px;
 }
.collapsible {
  background-color: #777;
  color: white;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
  margin-top: 10px;
  height:55px;

}

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

.collapsible:after {
  content: '\002B';
  color: white;
  font-weight: bold;
  float: right;
  margin-left: 5px;
  margin-top: -30px;
}

.active:after {
  content: "\2212";
}

.content {
  padding: 0 40px;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.2s ease-out;
  background-color: #f1f1f1;
  margin:0px;
}

#container {
  display:flex;
  margin-left:10px;
  align-items: center;
  margin-top:-12px;
}
#container > * {
  margin-right: 15px;
}
.maincontainer{
  margin: auto;
  width: 90%;
  margin-top:-20px;
}
.card-heading{
  word-wrap: break-word;
  margin-left: 10px;
    margin-top: 11px;
}
h4{
 font-family: Verdana,sans-serif;
 font-size: 13px;
 line-height: 1.5;
}
h2{
 font-family: Verdana,sans-serif; 
 text-align:center;
 font-size:20px;
}
.sub-container{
  font-size: 20px; 
  font-family: 'Open Sans',sans-serif;

}
<div class="maincontainer">

<div class="collapsible">
  <span id="container">
      <img src="test.png" width="45" height="45" alt="">
      <span class="sub-container">Heading</span>
  </span>
</div>
<div class="content">
  <div class="sub-heading">
  <h2>Heading</h2>
</div>
 <div class="column">
    <div class="row">
    <div><img src="test.png" width="45" height="40" style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

    <div class="column">
    <div class="row">
    <div><img src="test.png" width="45" height="40" style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

   <div class="column">
    <div class="row">
    <div><img src="test.png" width="45" height="40" style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

   <div>
<div class="sub-heading">
  <h2>Heading</h2>
</div>
</div>
   <div class="column">
    <div class="row">
    <div><img src="test" width="40" height="40"  style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</div>
    </div>
   </div>

    <div class="column">
    <div class="row">
    <div><img src="test.png" width="40" height="40"  style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

    <div class="column">
    <div class="row">
    <div><img src="test.png" width="40" height="40"  style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

  

</div>

<div class="collapsible">
  <span id="container">
      <img src="test.png" width="45" height="45" alt="">
      <span class="sub-container">Heading</span>
  </span>
</div>
<div class="content">
 <div class="column">
    <div class="row">
    <div><img src="test.png" width="45" height="40" style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

    <div class="column">
    <div class="row">
    <div><img src="test.png" width="45" height="40" style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

   <div class="column">
    <div class="row">
    <div><img src="test.png" width="45" height="40" style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

   <div>
<div class="sub-heading">
  <h2>Heading</h2>
</div>
</div>
   <div class="column">
    <div class="row">
    <div><img src="test" width="40" height="40"  style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</div>
    </div>
   </div>

    <div class="column">
    <div class="row">
    <div><img src="test.png" width="40" height="40"  style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

    <div class="column">
    <div class="row">
    <div><img src="test.png" width="40" height="40"  style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

  
</div>
 


<div class="collapsible">
  <span id="container">
      <img src="test.png" width="45" height="45" alt="">
      <span class="sub-container">Heading</span>
  </span>
</div>

<div class="content">
  <div class="sub-heading">
  <h2>Heading</h2>
</div>

<div class="column">
    <div class="row">
    <div><img src="test.png" width="45" height="40" style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

    <div class="column">
    <div class="row">
    <div><img src="test.png" width="45" height="40" style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

   <div class="column">
    <div class="row">
    <div><img src="test.png" width="45" height="40" style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

   <div>
<div class="sub-heading">
  <h2>Heading</h2>
</div>
</div>
   <div class="column">
    <div class="row">
    <div><img src="test" width="40" height="40"  style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</div>
    </div>
   </div>

    <div class="column">
    <div class="row">
    <div><img src="test.png" width="40" height="40"  style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>

    <div class="column">
    <div class="row">
    <div><img src="test.png" width="40" height="40"  style="float: left;"/></div>
   <div class="card-heading"><h4>TEXT</h4></div>
    </div>
   </div>
</div>
 </div>

最佳答案

var col1 = document.getElementsByClassName('collapsible');
let lastClick;
let content;

[...col1].forEach(col => {
  col.addEventListener('click', function() {
    // Check if last clicked ele is same as current and it has 'active' class
    if (this == lastClick && this.classList.contains('active')) {
      this.classList.remove('active');
      content.style.maxHeight = null;
      return;
    }
    // Remove active class from all elements along with maxheight to null
    [...col1].forEach(col => {
      col.classList.remove('active')
      col.nextElementSibling.style.maxHeight = null;
    });
    
    // Add active to clicked element and apply the height to the next element sibling.
    this.classList.add('active');
    content = this.nextElementSibling;
    content.style.maxHeight = content.scrollHeight + "px";
    lastClick = this;
  });
})
.centered {
  position: absolute;
  margin-top: 30px;
  left: 13%;
  color: white;
  font-weight: bold;
  font-size: 35px;
  height: auto;
  display: inline-block;
}

@media (max-width: 1030px) {
  .centered {
    float: none;
    display: block;
    text-align: left;
  }
  #container {
    display: flex;
    margin-left: 50px;
    align-items: center;
  }
}

.column {
  padding: 30px;
  height: 200px;
  margin: -20px;
  width: 430px;
  height: 120px;
  border-radius: 10px;
  display: inline-block;
  border: 2px #e6e6e6;
  padding-left: 48px;
}

.collapsible {
  background-color: #777;
  color: white;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
  margin-top: 10px;
  height: 55px;
}

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

.collapsible:after {
  content: '\002B';
  color: white;
  font-weight: bold;
  float: right;
  margin-left: 5px;
  margin-top: -30px;
}

.active:after {
  content: "\2212";
}

.content {
  padding: 0 40px;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.2s ease-out;
  background-color: #f1f1f1;
  margin: 0px;
}

#container {
  display: flex;
  margin-left: 10px;
  align-items: center;
  margin-top: -12px;
}

#container>* {
  margin-right: 15px;
}

.maincontainer {
  margin: auto;
  width: 90%;
  margin-top: -20px;
}

.card-heading {
  word-wrap: break-word;
  margin-left: 10px;
  margin-top: 11px;
}

h4 {
  font-family: Verdana, sans-serif;
  font-size: 13px;
  line-height: 1.5;
}

h2 {
  font-family: Verdana, sans-serif;
  text-align: center;
  font-size: 20px;
}

.sub-container {
  font-size: 20px;
  font-family: 'Open Sans', sans-serif;
}
<div class="maincontainer">

  <div class="collapsible">
    <span id="container">
                <img src="test.png" width="45" height="45" alt="">
                <span class="sub-container">Heading</span>
    </span>
  </div>
  <div class="content">
    <div class="sub-heading">
      <h2>Heading</h2>
    </div>
    <div class="column">
      <div class="row">
        <div><img src="test.png" width="45" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="45" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="45" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div>
      <div class="sub-heading">
        <h2>Heading</h2>
      </div>
    </div>
    <div class="column">
      <div class="row">
        <div><img src="test" width="40" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="40" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="40" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>



  </div>

  <div class="collapsible">
    <span id="container">
                <img src="test.png" width="45" height="45" alt="">
                <span class="sub-container">Heading</span>
    </span>
  </div>
  <div class="content">
    <div class="column">
      <div class="row">
        <div><img src="test.png" width="45" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="45" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="45" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div>
      <div class="sub-heading">
        <h2>Heading</h2>
      </div>
    </div>
    <div class="column">
      <div class="row">
        <div><img src="test" width="40" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="40" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="40" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>


  </div>



  <div class="collapsible">
    <span id="container">
                <img src="test.png" width="45" height="45" alt="">
                <span class="sub-container">Heading</span>
    </span>
  </div>

  <div class="content">
    <div class="sub-heading">
      <h2>Heading</h2>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="45" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="45" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="45" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div>
      <div class="sub-heading">
        <h2>Heading</h2>
      </div>
    </div>
    <div class="column">
      <div class="row">
        <div><img src="test" width="40" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="40" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>

    <div class="column">
      <div class="row">
        <div><img src="test.png" width="40" height="40" style="float: left;" /></div>
        <div class="card-heading">
          <h4>TEXT</h4>
        </div>
      </div>
    </div>
  </div>
</div>

关于javascript - 单击展开的部分时折叠并展开其他部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57834552/

相关文章:

javascript - 安装特定版本的winston包

javascript - OData Uri 批量返回 404,而如果我转到提供的 url,它就可以工作。为什么?

javascript - jQuery 中的 Closest() 在同一级别时不起作用

javascript - 单击时更改 css 字体粗细

javascript - 使用 AJAX 的函数抛出 "Unexpected Token }",Chrome 控制台

javascript - django 模板无法调用 javascript

javascript - javascript问题动​​态创建对象

javascript - 使用 btn 对表单进行 HTML5 验证,触发 JS 函数发送 php 邮件并在成功时显示模式

javascript - 将文本插入文本框并模拟单击 Bot Framework Web Chat 中的按钮

javascript - Google App Script 将多个工作表合并为一个母版