简体   繁体   English

Javascript手风琴-选择一项时折叠其他部分

[英]Javascript Accordion - collapse other sections when one selected

I have the following vanilla Javacscript accordion working well. 我的以下香草Javacscript手风琴运行良好。 I am now trying to adapt my toggle function so that the sections other than the one selected in the accordion collapse. 我现在尝试调整我的toggle功能,以使除手风琴中选定的部分以外的其他部分都折叠起来。 This is what I have so far - you will see that the sections remain open unless they are clicked to be closed: 这是我到目前为止的内容-您将看到这些部分保持打开状态,除非单击它们将其关闭:

https://codepen.io/mikehdesign/pen/KmeZgG https://codepen.io/mikehdesign/pen/KmeZgG

HTML 的HTML

<div class="accordion">
  <h4 class="accordion-header">Accordion 1</h4>
  <div class="accordion-content">
    <p>Cras malesuada ultrices augue molestie risus.</p>
  </div>
  <h4 class="accordion-header">Accordion 2</h4>
  <div class="accordion-content">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Recusandae at placeat nesciunt nostrum accusamus debitis fuga similique quisquam, rerum temporibus, quod asperiores nulla, eveniet libero earum eaque harum inventore minima ipsum saepe omnis. Officia, est, maiores. Reprehenderit odio perspiciatis voluptates commodi ex at praesentium laborum deleniti libero, architecto sit optio repellat est molestiae beatae, magnam qui voluptatibus. Ducimus mollitia dignissimos minus sapiente quidem, animi adipisci laboriosam aliquam asperiores facere. Repellat recusandae doloribus incidunt voluptatibus quibusdam rem delectus inventore nisi, laudantium. Doloribus eum vero, consequuntur nisi enim quam non odio dignissimos praesentium nostrum magnam consequatur totam reprehenderit quaerat. Saepe, blanditiis fugit?</p>
  </div>
  <h4 class="accordion-header">Accordion 3</h4>
  <div class="accordion-content">
    <p>Vivamus facilisisnibh scelerisque laoreet.</p>
  </div>
</div>

<div class="accordion">
  <h4 class="accordion-header">Accordion 1</h4>
  <div class="accordion-content">
    <p>Cras malesuada ultrices augue molestie risus.</p>
  </div>
  <h4 class="accordion-header">Accordion 2</h4>
  <div class="accordion-content">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Recusandae at placeat nesciunt nostrum accusamus debitis fuga similique quisquam, rerum temporibus, quod asperiores nulla, eveniet libero earum eaque harum inventore minima ipsum saepe omnis. Officia, est, maiores. Reprehenderit odio perspiciatis voluptates commodi ex at praesentium laborum deleniti libero, architecto sit optio repellat est molestiae beatae, magnam qui voluptatibus. Ducimus mollitia dignissimos minus sapiente quidem, animi adipisci laboriosam aliquam asperiores facere. Repellat recusandae doloribus incidunt voluptatibus quibusdam rem delectus inventore nisi, laudantium. Doloribus eum vero, consequuntur nisi enim quam non odio dignissimos praesentium nostrum magnam consequatur totam reprehenderit quaerat. Saepe, blanditiis fugit?</p>
  </div>
  <h4 class="accordion-header">Accordion 3</h4>
  <div class="accordion-content">
    <p>Vivamus facilisisnibh scelerisque laoreet.</p>
  </div>
</div>

JAVASCRIPT JAVASCRIPT

document.addEventListener('DOMContentLoaded', function() {

  function toggle() {
    if (this.nextElementSibling.classList.contains('active')) {
      this.nextElementSibling.removeAttribute('style');
    } else {
      var elementHeight = this.nextElementSibling.scrollHeight;
      this.nextElementSibling.style.maxHeight = elementHeight + 'px';
    }

    // Toggle `active` class
    this.nextElementSibling.classList.toggle('active');
    this.classList.toggle('active');
  }

  var accordion = document.querySelectorAll('div.accordion .accordion-header');
  for (var i = 0, len = accordion.length; i < len; i++) {
    accordion[i].addEventListener('click', toggle);
  }

});

SCSS SCSS

div.accordion {
  .accordion-header {
    cursor: pointer;
    &.active {

    }
  }
  .accordion-content {
    max-height: 0px;
    overflow: hidden;
    transition: max-height 400ms;
    &.active {
      overflow: auto;
    }
  }
}

Any help with this would be greatly appreciated - I am not using jQuery for this project. 对此的任何帮助将不胜感激-我不在此项目中使用jQuery。

We can collapse all sections firstly before open the clicked one. 我们可以先折叠所有部分,然后再打开单击的部分。

just add this loop at the first of toggle function: 只需在切换功能的第一个添加此循环:

var x = document.getElementsByClassName('active');
var i;
for (i = 0; i < x.length; i++) {
  if( x[i]==this ){ break; }
  x[i].nextElementSibling.removeAttribute('style');
  x[i].nextElementSibling.classList.toggle('active');
  x[i].classList.toggle('active');
}

Updated CodePEN 更新的CodePEN

 div.accordion .accordion-header { cursor: pointer; } div.accordion .accordion-content { max-height: 0px; overflow: hidden; -webkit-transition: max-height 400ms; transition: max-height 400ms; } div.accordion .accordion-content.active { overflow: auto; } 
 <div class="accordion"> <h4 class="accordion-header">Accordion 1</h4> <div class="accordion-content"> <p>Cras malesuada ultrices augue molestie risus.</p> </div> <h4 class="accordion-header">Accordion 2</h4> <div class="accordion-content"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Recusandae at placeat nesciunt nostrum accusamus debitis fuga similique quisquam, rerum temporibus, quod asperiores nulla, eveniet libero earum eaque harum inventore minima ipsum saepe omnis. Officia, est, maiores. Reprehenderit odio perspiciatis voluptates commodi ex at praesentium laborum deleniti libero, architecto sit optio repellat est molestiae beatae, magnam qui voluptatibus. Ducimus mollitia dignissimos minus sapiente quidem, animi adipisci laboriosam aliquam asperiores facere. Repellat recusandae doloribus incidunt voluptatibus quibusdam rem delectus inventore nisi, laudantium. Doloribus eum vero, consequuntur nisi enim quam non odio dignissimos praesentium nostrum magnam consequatur totam reprehenderit quaerat. Saepe, blanditiis fugit?</p> </div> <h4 class="accordion-header">Accordion 3</h4> <div class="accordion-content"> <p>Vivamus facilisisnibh scelerisque laoreet.</p> </div> </div> <div class="accordion"> <h4 class="accordion-header">Accordion 1</h4> <div class="accordion-content"> <p>Cras malesuada ultrices augue molestie risus.</p> </div> <h4 class="accordion-header">Accordion 2</h4> <div class="accordion-content"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Recusandae at placeat nesciunt nostrum accusamus debitis fuga similique quisquam, rerum temporibus, quod asperiores nulla, eveniet libero earum eaque harum inventore minima ipsum saepe omnis. Officia, est, maiores. Reprehenderit odio perspiciatis voluptates commodi ex at praesentium laborum deleniti libero, architecto sit optio repellat est molestiae beatae, magnam qui voluptatibus. Ducimus mollitia dignissimos minus sapiente quidem, animi adipisci laboriosam aliquam asperiores facere. Repellat recusandae doloribus incidunt voluptatibus quibusdam rem delectus inventore nisi, laudantium. Doloribus eum vero, consequuntur nisi enim quam non odio dignissimos praesentium nostrum magnam consequatur totam reprehenderit quaerat. Saepe, blanditiis fugit?</p> </div> <h4 class="accordion-header">Accordion 3</h4> <div class="accordion-content"> <p>Vivamus facilisisnibh scelerisque laoreet.</p> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { function toggle() { var x = document.getElementsByClassName('active'); var i; for (i = 0; i < x.length; i++) { if( x[i]==this ){ break; } x[i].nextElementSibling.removeAttribute('style'); x[i].nextElementSibling.classList.toggle('active'); x[i].classList.toggle('active'); } if (this.nextElementSibling.classList.contains('active')) { this.nextElementSibling.removeAttribute('style'); } else { var elementHeight = this.nextElementSibling.scrollHeight; this.nextElementSibling.style.maxHeight = elementHeight + 'px'; } // Toggle `active` class this.nextElementSibling.classList.toggle('active'); this.classList.toggle('active'); } var accordion = document.querySelectorAll('div.accordion .accordion-header'); for (var i = 0, len = accordion.length; i < len; i++) { accordion[i].addEventListener('click', toggle); } }); </script> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM