前提・実現したいこと
アコーディオンメニューにて
他のメニューをクリックしたらすでに開いているメニューを閉じたいです。
該当のソースコード
html
1 <main> 2 <ul class="menu"> 3 <li> 4 <a>親メニュー1</a> 5 <ul> 6 <li><a>子リスト1</a></li> 7 <li><a>子リスト2</a></li> 8 <li><a>子リスト3</a></li> 9 </ul> 10 </li> 11 12 <li> 13 <a>親メニュー2</a> 14 <ul> 15 <li><a>子リスト1</a></li> 16 <li><a>子リスト2</a></li> 17 <li><a>子リスト3</a></li> 18 </ul> 19 </li> 20 21 <li> 22 <a >親メニュー3</a> 23 <ul> 24 <li><a>子リスト1</a></li> 25 <li><a>子リスト2</a></li> 26 <li><a>子リスト3</a></li> 27 </ul> 28 </li> 29 </ul> 30 </main> 31
css
1@charset "utf-8"; 2 3* { 4 margin: 0; 5 padding: 0; 6 font-size: 20px; 7 text-decoration: none; 8 list-style-type: none; 9} 10 11a { 12 color: #333; 13} 14 15main { 16 max-width: 1000px; 17 width: 100%; 18 margin: 50px auto; 19 background-color: #eee; 20 padding: 20px; 21 border-radius: 5px; 22} 23 24.menu ul { 25 display: none; 26} 27 28.menu ul.active { 29 display: block; 30} 31 32.menu a { 33 transition: .3s; 34} 35 36.menu a:hover { 37 opacity: 0.7; 38} 39 40.menu > li > a { 41 display: flex; 42 justify-content: space-between; 43 padding: 10px; 44 background-color: #ccc; 45} 46 47.menu > li > a::after { 48 content: ">"; 49 transform: rotate(90deg); 50} 51 52.menu > li > .active::after { 53 transform: rotate(-90deg) translateY(-3px); 54} 55 56.menu > li >ul a { 57 padding: 10px; 58 display: block; 59 background-color: #aaa; 60}
js
1const parentMenu = document.querySelectorAll(".menu > li > a"); 2 3for(let i = 0; i < parentMenu.length; i++) { 4 parentMenu[i].addEventListener("click", function(e) 5 this.classList.toggle("active"); 6 this.nextElementSibling.classList.toggle("active"); 7 }) 8}
試したこと
一度クラスactiveとついたものを取得して、toggleでクラスをつける前にクラスをリセットする形にしてみました
js
1const parentMenu = document.querySelectorAll(".menu > li > a"); 2 3const activeElement = document.getElementsByClassName("active") 4 5 6for(let i = 0; i < parentMenu.length; i++) { 7 parentMenu[i].addEventListener("click", function(e){ 8 e.preventDefault(); 9 activeElement.classList.remove("active") 10 this.classList.toggle("active"); 11 this.nextElementSibling.classList.toggle("active"); 12 }) 13}
そうすると今度はピクリとも動かず下記のエラーが出てしまいました。
発生している問題・エラーメッセージ
Uncaught TypeError: Cannot read properties of undefined (reading 'remove') at HTMLAnchorElement.<anonymous>
Javascriptへの理解が浅く、実現するために他にどういった考え方や挙動がいるのかわかりません…
どうかご教示お願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。