简体   繁体   English

手风琴菜单打开和关闭

[英]Accordion menu open and close

I am working on an accordion style menu with 5 section, each of which has a submenu. 我正在制作一个具有5个部分的手风琴样式菜单,每个菜单都有一个子菜单。 Section can be opened and closed by clicking on them. 单击部分可以打开和关闭部分。 The problem is that when a user clicks on a new section the previous section stays open. 问题是,当用户单击新部分时,上一个部分保持打开状态。 I am trying to figure out a way to get trigger a section to close automatically when the user clicks on a different section so only the latest section they click on stays open. 我试图找出一种方法来触发一个部分,当用户单击其他部分时,该部分会自动关闭,因此只有他们单击的最新部分保持打开状态。 MY code is below. 我的代码如下。

Code uploaded to Fiddle https://jsfiddle.net/brianmaddendesign/spacbe9y/ 代码上传到Fiddle https://jsfiddle.net/brianmaddendesign/spacbe9y/

 (function() { var d = document, accordionToggles = d.querySelectorAll('.js-accordionTrigger'), setAria, setAccordionAria, switchAccordion, touchSupported = ('ontouchstart' in window), pointerSupported = ('pointerdown' in window); skipClickDelay = function(e) { e.preventDefault(); e.target.click(); } setAriaAttr = function(el, ariaType, newProperty) { el.setAttribute(ariaType, newProperty); }; setAccordionAria = function(el1, el2, expanded) { switch (expanded) { case "true": setAriaAttr(el1, 'aria-expanded', 'true'); setAriaAttr(el2, 'aria-hidden', 'false'); break; case "false": setAriaAttr(el1, 'aria-expanded', 'false'); setAriaAttr(el2, 'aria-hidden', 'true'); break; default: break; } }; //function switchAccordion = function(e) { console.log("triggered"); e.preventDefault(); var thisAnswer = e.target.parentNode.nextElementSibling; var thisQuestion = e.target; if (thisAnswer.classList.contains('is-collapsed')) { setAccordionAria(thisQuestion, thisAnswer, 'true'); } else { setAccordionAria(thisQuestion, thisAnswer, 'false'); } thisQuestion.classList.toggle('is-collapsed'); thisQuestion.classList.toggle('is-expanded'); thisAnswer.classList.toggle('is-collapsed'); thisAnswer.classList.toggle('is-expanded'); thisAnswer.classList.toggle('animateIn'); }; for (var i = 0, len = accordionToggles.length; i < len; i++) { if (touchSupported) { accordionToggles[i].addEventListener('touchstart', skipClickDelay, false); } if (pointerSupported) { accordionToggles[i].addEventListener('pointerdown', skipClickDelay, false); } accordionToggles[i].addEventListener('click', switchAccordion, false); } })(); 

I added a little code to your fiddle . 我在您的小提琴中添加了一些代码。 Hope this is what you're looking for. 希望这是您想要的。

var menuTitle = document.querySelectorAll('.accordion-content'),
      menuCont = document.querySelectorAll('.accordion-title'),
    i = 0;

while(i < menuTitle.length) {
    if(!e.target.classList.contains('is-expanded')) {
        menuTitle[i].classList.remove('is-expanded', 'animateIn');
        menuTitle[i].classList.add('is-collapsed');
        menuCont[i].classList.remove('is-expanded', 'is-collapsed');
    };
    i++;
};

When you click a menu item, it checks to see if any menu element is expanded and closes that element before running your code. 当您单击菜单项时,它将在运行代码之前检查是否展开了任何菜单元素并关闭了该元素。

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

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