Accordion, открывается только первый элемент, как фикс?
в аккордионе виден вопрос и кнопка, при клике на кнопку показывается ответ. Схема работает только на первый блок, как сделать что бы применялось ко всем? js
html
<div class="accordion__inner"> <div class="accordion__item"> <div class="accordion__content"> <div class="accordion__text">Вопрос:</div> <button class="accordion__btn"></button> </div> <div class="accordion__answer">Ответ:</div> </div> <div class="accordion__item"> <div class="accordion__content"> <div class="accordion__text">Вопрос:</div> <button class="accordion__btn"></button> </div> <div class="accordion__answer">Ответ:</div> </div> <div class="accordion__item"> <div class="accordion__content"> <div class="accordion__text">Вопрос:</div> <button class="accordion__btn"></button> </div> <div class="accordion__answer">Ответ:</div> </div> </div> |
<div class="accordion__inner"> <div class="accordion__item"> <div class="accordion__content"> <div class="accordion__text">Вопрос:</div> <button class="accordion__btn"></button> </div> <div class="accordion__answer">Ответ:</div> </div> <div class="accordion__item"> <div class="accordion__content"> <div class="accordion__text">Вопрос:</div> <button class="accordion__btn"></button> </div> <div class="accordion__answer">Ответ:</div> </div> <div class="accordion__item"> <div class="accordion__content"> <div class="accordion__text">Вопрос:</div> <button class="accordion__btn"></button> </div> <div class="accordion__answer">Ответ:</div> </div> </div>
css
.accordion__answer {display: none} .active {display: block} |
.accordion__answer {display: none} .active {display: block}
js
var accordionAnswer = document.querySelector('.accordion__answer') var accordionBtn = document.querySelector('.accordion__btn') accordionBtn.addEventListener('click', function() { accordionAnswer.classList.toggle('active') }) |
var accordionAnswer = document.querySelector('.accordion__answer') var accordionBtn = document.querySelector('.accordion__btn') accordionBtn.addEventListener('click', function() { accordionAnswer.classList.toggle('active') })
Дополнительно:
Изучить базу.
Ну хотя бы почитать про методы, которые в коде используются..
https://learn.javascript.ru/searching-elements-dom...
Как решить - заменить поиск не одного элемента, а всех, удовлетворяющих селектору.
Ответы:
var accordionContainer = document.querySelector('.accordion__inner'); accordionContainer.addEventListener('click', function({target}) { if (target.classList.contains('accordion__btn')) { var answer = target.parentNode.nextElementSibling; answer.classList.toggle('active'); } }); |
var accordionContainer = document.querySelector('.accordion__inner'); accordionContainer.addEventListener('click', function({target}) { if (target.classList.contains('accordion__btn')) { var answer = target.parentNode.nextElementSibling; answer.classList.toggle('active'); } });
- Все круто, работает. но как сделать что бы '.active' добавлялся именно '.accordion__answer', а не ближайшему соседу?
Вот есть хороший пример с подробным описанием - Тыц..
Думаю по нему не сложно будет разобраться и подправить свой скрипт.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для решения проблемы с аккордеоном, открывающим только первый элемент, вам нужно добавить некоторый JavaScript код, который будет управлять состоянием аккордеона.
Прежде всего, убедитесь, что у вас есть структура HTML, которая представляет собой аккордеон с заголовками элементов и содержимым каждого элемента. Например:
<div class="accordion"> <div class="accordion-item"> <div class="accordion-header">Заголовок 1</div> <div class="accordion-content">Содержимое 1</div> </div> <div class="accordion-item"> <div class="accordion-header">Заголовок 2</div> <div class="accordion-content">Содержимое 2</div> </div> </div><div class="accordion"> <div class="accordion-item"> <div class="accordion-header">Заголовок 1</div> <div class="accordion-content">Содержимое 1</div> </div> <div class="accordion-item"> <div class="accordion-header">Заголовок 2</div> <div class="accordion-content">Содержимое 2</div> </div> </div>
Затем вы можете использовать следующий JavaScript код, чтобы сделать аккордеон интерактивным и позволить открывать и закрывать элементы:
document.addEventListener("DOMContentLoaded", function() { const accordionItems = document.querySelectorAll(".accordion-item"); accordionItems.forEach(item => { item.addEventListener("click", function() { if (item.classList.contains("active")) { item.classList.remove("active"); } else { accordionItems.forEach(el => el.classList.remove("active")); item.classList.add("active"); } }); }); });
Этот код добавляет обработчик событий клика для каждого элемента аккордеона. При клике на элемент, он проверяет, есть ли у него класс "active". Если есть, то класс удаляется и содержимое элемента скрывается. Если класса нет, то все элементы аккордеона теряют класс "active", а текущему элементу добавляется этот класс, что приводит к открытию его содержимого.
После добавления этого кода на вашу страницу, аккордеон должен работать корректно и открывать и закрывать элементы по клику на них.