简体   繁体   English

在负载下折叠手风琴

[英]Collapse accordion on load

I'm trying to get my accordion items to not be visible on page load. 我正在尝试使我的手风琴项目在页面加载时不可见。 I would like them to only be visible when they are clicked on, and would like the item to disappear when a different item is clicked on. 我希望它们仅在单击时才可见,并且希望在单击其他项时该项消失。 I have tried a few different options and can't seem to get it to work. 我尝试了几种不同的选择,但似乎无法使其正常工作。 Please see my code below.. 请在下面查看我的代码。

 var acc = document.getElementsByClassName("accordion"); var i; for (i = 0; i < acc.length; i++) { acc[i].onclick = function() { this.classList.toggle("active"); var panel = this.nextElementSibling; if (panel.style.display === "none") { panel.style.display = "block"; } else { panel.style.display = "none"; } } } 
 <div id="header"> <h1>Fox Valley Runners Club</h1> </div> <div id="main"></div> <div id="pics" class="panel"> <div class="race_box"> <img src="images/run1.jpg" id="5kpic" /><br /> <figcaption>5k/10k Events</figcaption> <div class="races" id="5k"> <h3>5k/10 Events</h3> <ul> <li class="accordion">Mini Sprint</li> <div class="panel"> <p>10/30/17, Memorial Park, Appleton</p> </div> <li class="accordion">Iron Horse</li> <div class="panel"> <p>11/6/17, Bay Beach Park, Green Bay</p> </div> <li class="accordion">Twilight Trail</li> <div class="panel"> <p>11/13/17, River's Edge Park, Wrightstown</p> </div> </ul> </div> </div> <div class="race_box"> <img src="images/run2.jpg" id="halfpic" /></button><br /> <figcaption>Half Marathon Events</figcaption> <div class="races" id="half"> <h3>Half Marathon Events</h3> <ul> <li class="accordion">Fox River Marathon</li> <div class="panel"> <p>10/15/17, Pierce Park, Appleton</p> </div> <li class="accordion">NEW Half Marathon</li> <div class="panel"> <p>10/29/17, Bay Beach Park, Green Bay</p> </div> <li class="accordion">Winnebago Run</li> <div class="panel"> <p>11/27/17, Menominee Park, Oshkosh</p> </div> </ul> </div> </div> <div class="race_box"> <img src="images/run3.jpg" id="fullpic" /><br /> <figcaption>Full Marathon Events</figcaption> <div class="races" id="full"> <h3>Full Marathon Events</h3> <ul> <li class="accordion">Cheesehead Marathon</li> <div class="panel"> <p>9/24/17, Pamperin Park, Green Bay</p> </div> <li class="accordion">Chain O'Lakes Marathon</li> <div class="panel"> <p>10/29/17, Bay Beach Park, Green Bay</p> </div> <li class="accordion">Fox Cities Marathon</li> <div class="panel"> <p>11/12/17, Menominee Park, Oshkosh</p> </div> </ul> </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

Simply keep display:none initially like this 只需保持display:none最初display:none这样的display:none

.panel{
display:none;
}

and remove class="panel" from main div with id="pics" 并从id="pics"主div中删除class="panel" id="pics"

 var acc = document.getElementsByClassName("accordion"); var i; for (i = 0; i < acc.length; i++) { acc[i].onclick = function() { this.classList.toggle("active"); var panel = this.nextElementSibling; if (panel.style.display === "block") { panel.style.display = "none"; } else { panel.style.display = "block"; } } } 
 .panel{ display:none; } 
 <div id="header"> <h1>Fox Valley Runners Club</h1> </div> <div id="main"></div> <div id="pics"> <div class="race_box"> <img src="images/run1.jpg" id="5kpic" /><br /> <figcaption>5k/10k Events</figcaption> <div class="races" id="5k"> <h3>5k/10 Events</h3> <ul> <li class="accordion">Mini Sprint</li> <div class="panel"> <p>10/30/17, Memorial Park, Appleton</p> </div> <li class="accordion">Iron Horse</li> <div class="panel"> <p>11/6/17, Bay Beach Park, Green Bay</p> </div> <li class="accordion">Twilight Trail</li> <div class="panel"> <p>11/13/17, River's Edge Park, Wrightstown</p> </div> </ul> </div> </div> <div class="race_box"> <img src="images/run2.jpg" id="halfpic" /></button><br /> <figcaption>Half Marathon Events</figcaption> <div class="races" id="half"> <h3>Half Marathon Events</h3> <ul> <li class="accordion">Fox River Marathon</li> <div class="panel"> <p>10/15/17, Pierce Park, Appleton</p> </div> <li class="accordion">NEW Half Marathon</li> <div class="panel"> <p>10/29/17, Bay Beach Park, Green Bay</p> </div> <li class="accordion">Winnebago Run</li> <div class="panel"> <p>11/27/17, Menominee Park, Oshkosh</p> </div> </ul> </div> </div> <div class="race_box"> <img src="images/run3.jpg" id="fullpic" /><br /> <figcaption>Full Marathon Events</figcaption> <div class="races" id="full"> <h3>Full Marathon Events</h3> <ul> <li class="accordion">Cheesehead Marathon</li> <div class="panel"> <p>9/24/17, Pamperin Park, Green Bay</p> </div> <li class="accordion">Chain O'Lakes Marathon</li> <div class="panel"> <p>10/29/17, Bay Beach Park, Green Bay</p> </div> <li class="accordion">Fox Cities Marathon</li> <div class="panel"> <p>11/12/17, Menominee Park, Oshkosh</p> </div> </ul> </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

You could (like George Campbell said) use CSS instead of inline styles. 您可以(如George Campbell所说)使用CSS代替内联样式。 For this you should add classes to your accordion elements instead of the styles. 为此,您应该在手风琴元素中添加类而不是样式。 For example, you have the following structure: 例如,您具有以下结构:

   <ul>
      <li class="accordion">Fox River Marathon</li>
      <div class="panel">
        <p>10/15/17, Pierce Park, Appleton</p>
      </div>
   </ul>

The related CSS could be this: 相关的CSS可能是这样的:

.accordion + .panel:not(.active) {
  display: none;
}

Now you can toggle the class "active" like you already done in your code: 现在,您可以像在代码中已经完成的那样切换“活动”类:

this.classList.toggle("active");

This ensures all your elements will initially be hidden. 这样可以确保您所有的元素最初都将被隐藏。 If you want to close all other elements after you triggered an accordion you could simply traverse through all accordion elements and check if the element you just clicked matches the current element in your loop, if not you can remove the "active" class from it. 如果要在触发手风琴后关闭所有其他元素,则可以遍历所有手风琴元素,并检查刚单击的元素是否与循环中的当前元素匹配,否则,可以从中删除“活动”类。

As already said, make the panels invisible on default via css. 如前所述,默认情况下通过css使面板不可见。

When a title is clicked, check if got the class. 单击标题后,检查是否获得课程。 If yes, remove it. 如果是,请将其删除。 If not, remove the class from every panel and then explicitly set it on the panel. 如果不是,请从每个面板中删除该类,然后在面板上显式设置它。

Some Example (not the best solution, but it will show you the idea): 一些示例(不是最好的解决方案,但会告诉您想法):

var acc = document.getElementsByClassName("accordion");
var i
var panels = document.getElementsByClassName("panel");
var j;

for (i = 0; i < acc.length; i++) {
    acc[i].onclick = function() {
        var panel = this.nextElementSibling;

        if (panel.classList.contains("active")) {
            panel.classList.remove("active");
        } else {
            for (j = 0; j < panels.length; j++) {
                panels[j].classList.remove("active");
            }

            panel.classList.add("active");
        }
    }
}

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

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