← Все вопросы

Кнопка-аккордеон: как раскрывать и скрывать текст по очереди?

Задан 13 месяцев назад1.3к просмотров2 ответа
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(...).

Ваш ответ

Войдите, чтобы ответить на вопрос.