← Все вопросы
Кнопка-аккордеон: как раскрывать и скрывать текст по очереди?
6
Хочу как в FAQ: список вопросов, нажал на вопрос — раскрылся ответ, нажал ещё — свернулся. Сделал для одного блока через if, но как сделать для нескольких вопросов сразу, не дублируя код?
2 ответа
11
✓ Принятый ответ — помог автору
Навесь обработчик на все вопросы сразу через querySelectorAll и цикл. По клику переключай видимость соседнего блока-ответа.
<div class="item">
<button class="q">Вопрос 1</button>
<div class="a">Ответ 1</div>
</div>
<div class="item">
<button class="q">Вопрос 2</button>
<div class="a">Ответ 2</div>
</div>
.a { display: none; }
.a.open { display: block; }
document.querySelectorAll('.q').forEach(function(btn) {
btn.addEventListener('click', function() {
const answer = btn.nextElementSibling; // блок .a сразу после кнопки
answer.classList.toggle('open');
});
});
forEach вешает обработчик на каждый вопрос, nextElementSibling берёт ответ рядом, toggle('open') раскрывает/скрывает. Код один — а работает для всех вопросов.
3
Если querySelectorAll(...).forEach у тебя выдаёт ошибку — скорее всего, старый пример или опечатка. В современных браузерах forEach у результата querySelectorAll работает. Если же где-то нет — оберни в Array.from(...): Array.from(document.querySelectorAll('.q')).forEach(...).
Ваш ответ
Войдите, чтобы ответить на вопрос.