JS-Accordion, не может (display=block) все остальные элементы панели.

  • Автор темы FreeDOM2
  • 42
  • Обновлено
  • 15, May 2024
  • #1
Привет,

У меня есть следующий код из w3schools, открывающий закрывающийся список аккордеона (панель). (CSS работает хорошо!!) Я хотел дополнить версию: когда я открываю панель, все остальные панели должны закрываться.

Я пытался использовать второй цикл в /**/, но это не сработало. Какие-либо предложения? Большое спасибо!
  

(function () {

var acc = document.getElementsByClassName("accordion");

var i,j;

for (i = 0; i < acc.length; i++) {

acc[i].addEventListener("click", function() {

/* for (j = 0; j < acc.length; j++) {

acc[i].nextElementSibling.style.display = "block";

}

*/

this.classList.toggle("active");

var panel = this.nextElementSibling;

if (panel.style.display === "block") {

panel.style.display = "none";

} else {

panel.style.display = "block";

}

});

}

})();
Код (JavaScript):

FreeDOM2


Рег
17 May, 2012

Тем
1

Постов
2

Баллов
12
  • 10, Jun 2024
  • #2
Предполагая, что вы не хотите, чтобы он был анимирован, это больше НЕ работа JavaScript.

На входах есть атрибут :checked, который вы можете использовать для запуска аккордеонов.

Если вы хотите открыть только один, используйте type="radio" с тем же именем.
 

.accordionMenu .toggle {

/* fix for IE so <label> will still toggle their "for" */

display:block;

position:absolute;

left:-999em;

}

.accordionMenu .toggle ~ label {

/*

WHY isn't this the default for <label>?!? Oh that's right, nobody

***ing knows what LABEL is even for much less how to use it right.

*/

cursor:pointer;

}

.accordionMenu .toggle:checked ~ label {

/*

set the style you want for it when checked here. You could use

generated content to add/remove a character like the right-pointing

utf-8 triangles.

*/

background:#000;

color:#FFF;

}

.accordionMenu .toggle ~ ul {

/* APo insstead of display:none so search doens't think we're content cloaking */

position:absolute;

left:-999em;

top:-999em;

}

.accordionMenu .toggle:checked ~ ul {

position:static; /* will now ignore the top/left values, showing it. */

}

Код (разметка):
 <ul class="accordionMenu"> <li> <input type="radio" name="menuDepth1" id="toggle_section1" class="toggle" hidden> <label for="toggle_section1">Section 1</label> <ul> <li>Test1-1</li> <li>Test1-2</li> <li>Test1-3</li> <li>Test1-4</li> <li>Test1-5</li> <li>Test1-6</li> </ul> </li><li> <input type="radio" name="menuDepth1" id="toggle_section2" class="toggle" hidden> <label for="toggle_section2">Section 2</label> <ul> <li>Test2-1</li> <li>Test2-2</li> <li>Test2-3</li> <li>Test2-4</li> <li>Test2-5</li> <li>Test2-6</li> </ul> </li><li> <input type="radio" name="menuDepth1" id="toggle_section3" class="toggle" hidden> <label for="toggle_section3">Section 3</label> <ul> <li>Test3-1</li> <li>Test3-2</li> <li>Test3-3</li> <li>Test3-4</li> <li>Test3-5</li> <li>Test3-6</li> </ul> </li> </ul>
Код (разметка): БОЛЬШЕ НЕ РАБОТАЕТ ПО JAVASCRIPT!!! Также помните, что если вам не нужно «только одно открытие», есть теги DETAILS и SUMMARY, которые также могут сделать это без JavaScript - и, что еще интереснее, можно сделать это и без помощи CSS.
 

Алексей Стоянов


Рег
15 Jan, 2013

Тем
1

Постов
4

Баллов
14
Тем
49554
Комментарии
57426
Опыт
552966

Интересно