简体   繁体   English

保持手风琴的特定面板打开

[英]Keep specific panel of accordion open

I'm using basic JS for an accordion/collapsible which works well, except now I want to have one panel within a group open at start.我将基本 JS 用于手风琴/可折叠装置,效果很好,除了现在我想在开始时打开一个组中的一个面板。

I then tried using JQueryUI for this since it does keep one panel open to start, but then it does not permit multiple panels open at the same time.然后我尝试为此使用 JQueryUI,因为它确实保持一个面板打开以启动,但它不允许同时打开多个面板。 I read through the documentation and I don't see where/if that's configurable.我通读了文档,但看不到在哪里/是否可以配置。

So I'm wondering if there's a way to either modify the below that I had originally or, alternatively, if I'm missing something with JQueryUI.所以我想知道是否有一种方法可以修改我最初拥有的以下内容,或者,如果我遗漏了 JQueryUI 的某些内容。

  <script>
      var acc = document.getElementsByClassName(" ols-accordion");
      var i;
      for (i = 0; i < acc.length; i++) {
          acc[i].addEventListener("click", function () {
              this.classList.toggle("active");
              var
                  olsPanel = this.nextElementSibling;
              if (olsPanel.style.maxHeight) {
                  olsPanel.style.maxHeight = null;
              } else {
                  olsPanel.style.maxHeight = olsPanel.scrollHeight + "px";
              }
          });
      }
  </script>
      .ols-accordion {
          background-color: #fff;
          color: #1e1e1e;
          cursor: pointer;
          padding: 18px;
          width: 85%;
          box-sizing: border-box;
          border: 1px solid #eaeaea;
          border-bottom: 0;
          text-align: left;
          font-size: 18px;
          line-height: 24px;
          transition: 0.4s;
      }
      .olsPanel {
          width: 85%;
          box-sizing: border-box;
          padding: 0 18px;
          margin-bottom: 10px;
          background-color: #fff;
          border: 1px solid #eaeaea;
          border-top: 0;
          max-height: 0;
          overflow: hidden;
          transition: max-height 0.2s ease-out;
      }

Would I need to first add a class or ID to a panel that I want to stay open and then write something separately that assigns the maxHeight to that element equal to the scrollHeight ?我是否需要先将 class 或 ID 添加到我想保持打开状态的面板,然后单独编写一些内容,将maxHeight分配给等于scrollHeight的元素? Almost like the inverse of what I have above?几乎就像我上面的相反?

Here is an example using event.target , passing the event into the event listeners function and then using the actual element being pressed to toggle a class to apply CSS to that element.这是一个使用event.target的示例,将事件传递给事件侦听器 function,然后使用实际按下的元素来切换 class 以将 CSS 应用于该元素。

EDIT: If you want one of your elements to be open on the page load, simply add the show class to that elements HTML and it will be open when the page loads.编辑:如果您希望在页面加载时打开其中一个元素,只需将show class 添加到该元素 HTML 中,它就会在页面加载时打开。

 //--> Return a node list of all element with the.acc class selector const acc = document.querySelectorAll('.acc') //--> run the event (e) into a function and get the //--> nextElementSibling and toggle a class using //--> classList.toggle() function showPanel(e) { e.target.nextElementSibling.classList.toggle('show') e.target.classList.toggle('btnBG') } //--> forEach loop that will iterate over each element within the //--> node list, assign the variable el, to each matching node within that //--> node list and then assign an eventListener listening for a click //--> we run the function that toggles the class on our sibling element acc.forEach(el => { el.addEventListener("click", showPanel) })
 .flex-item { display: flex; flex-direction: column; justify-content: start; align-items: start; width: 100%; }.acc { flex: 0; line-height: 1.5rem; padding: .5rem; border-bottom: 1px solid #DDD; }.acc:nth-of-type(1) { border-top: 1px solid #DDD; }.panel { display: none; }.show { display: inline-block; }.btnBG { background-color: lightgreen; }
 <div class="flex-item"> <div class="acc btnBG">Section 1</div> <div class="panel show"> <p>Lorem ipsum...1</p> </div> <div class="acc">Section 2</div> <div class="panel"> <p>Lorem ipsum...2</p> </div> <div class="acc">Section 3</div> <div class="panel"> <p>Lorem ipsum...3</p> </div> </div>

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

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