简体   繁体   English

Javascript 手风琴在新标签打开时折叠

[英]Javascript accordion collapse on new tab open

I'm new to programming and I have a fairly simple problem for which I'm struggling to find the solution.我是编程新手,我有一个相当简单的问题,我正在努力寻找解决方案。 I'm attempting to build an accordion and I'm trying to make the open tab close when I click on a new tab.我正在尝试构建手风琴,并且在单击新选项卡时尝试关闭打开的选项卡。 For example, if I were to click the first question the first content would expand.例如,如果我单击第一个问题,第一个内容会展开。 If I were to open the second Question the second content would expand and the first content would collapse.如果我打开第二个问题,第二个内容会展开,第一个内容会折叠。 If someone could help it would be much appreciated!如果有人可以提供帮助,将不胜感激!

HTML HTML

          <dl>
           <dt>
            <p class="accordion-title accordionTitle js-accordionTrigger">
               Question
            </p>
          </dt>
          <div class="accordion-content accordionItem is-collapsed" id="accordion4" aria-hidden="true">
            <p>content</p>
          </div>
          <dt>
            <p class="accordion-title accordionTitle js-accordionTrigger">
              Question
            </p>
          </dt>
          <div class="accordion-content accordionItem is-collapsed" id="accordion5" aria-hidden="true">
            
            <p>content</p>
          </div>
        </dl>  

Javascript Javascript

(function(){
    var d = document,
    accordionToggles = d.querySelectorAll('.js-accordionTrigger'),
    setAria,
    setAccordionAria,
    switchAccordion,
    pointerSupported = ('pointerdown' in window);
  
  

        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(pointerSupported){
      accordionToggles[i].addEventListener('pointerdown', false);
    }
    accordionToggles[i].addEventListener('click', switchAccordion, false);
  }
})();

Just remove all elements is-expanded class and assign the is-collapsed class when a title is clicked and only assign it to the content which should be shown.只需删除所有元素is-expanded class 并在单击标题时分配is-collapsed class 并仅将其分配给应显示的内容。 The other way around for the one content element which should be displayed.应该显示的一个内容元素的另一种方式。

 const accordionTitle = document.querySelectorAll('.accordion-title'); accordionTitle.forEach(e => e.addEventListener('click', (event) => { accordionTitle.forEach((element) => { let content = element.parentNode.nextElementSibling if (element.= event.target) { content.classList.remove('is-expanded') content.classList.add('is-collapsed') // DO STUFF HERE TO ELEMENTS (element) THAT ARE HIDDEN } else { let content = event.target.parentNode.nextElementSibling content.classList.remove('is-collapsed') content.classList.add('is-expanded') // DO STUFF HERE TO THE ELEMENT (event;target) THAT IS SHOWN } }); }));
 .is-collapsed { display: none; }.is-expanded { display: block; }
 <dl> <dt> <p class="accordion-title accordionTitle js-accordionTrigger"> Question </p> </dt> <div class="accordion-content accordionItem is-collapsed" id="accordion4" aria-hidden="true"> <p>content</p> </div> <dt> <p class="accordion-title accordionTitle js-accordionTrigger"> Question </p> </dt> <div class="accordion-content accordionItem is-collapsed" id="accordion5" aria-hidden="true"> <p>content</p> </div> </dl>

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

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