#javascript #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
(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);
}
})();
Ответ №1:
Просто удалите is-expanded
класс всех элементов и назначьте is-collapsed
класс при нажатии на заголовок и назначьте его только тому содержимому, которое должно отображаться. Наоборот, для одного элемента содержимого, который должен отображаться.
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>
Комментарии:
1. Спасибо вам за ответ! Я приношу извинения за свое непонимание, но я безуспешно пытался реализовать предоставленный вами код. Есть ли что-то, чего мне не хватает в написанном вами коде, что мне нужно было бы применить?
2. Я буквально ничего не изменил в коде, но посмотрите тот образец, который я сейчас предоставил. Возможно, это поможет вам достичь вашей цели.