前提・実現したいこと
JavaScriptを使用して、複数階層(第3階層まで)のタグメニュー実装を行いたいです。
発生している問題
下記、Gifのように第1階層の選択時の色は、選択エリアごとに変わるものの、
選択したことによって出現した第2階層のメニューは、選択エリアごとに消えない。
https://gyazo.com/383699c4017be9011999dd60554c615d
第1階層選択時の色のように、第2階層のメニューも選択外のところは消したい。
何卒よろしくお願いいたします。
該当のソースコード
Js
1(()=>{ 2 3window.addEventListener('load', () => { 4 const tabMenu = document.getElementById("js-tab") 5 const menuDetail = tabMenu.querySelectorAll("[data-id]") 6 const menuMoreDetail = tabMenu.querySelectorAll("[data-menu]") 7 console.log(menuMoreDetail) 8 for(let i = 0; i < menuDetail.length; i++) { 9 //タブメニュークリック時 10 11 menuDetail[i].addEventListener('click', (e) => { 12 const init = () => { 13 menuMoreDetail[i].style.display = 'block'; 14 }; 15 init(); 16 17 //クリックされた要素(メニュー要素)を取得 18 let currentMenu = e.currentTarget; 19 //ターゲットとなる要素(タブメニューdata属性ちと等しいid値を持つコンテンツ要素を取得 20 let currentContent = document.getElementById(currentMenu.dataset.id); 21 console.log(currentContent) 22 23 // すべてのタブメニューの'is-active'クラスを削除 24 for(let i = 0; i < menuDetail.length; i++) { 25 menuDetail[i].classList.remove('is-active'); 26 } 27 // クリックしたタブメニューに'is-active'クラスを追加 28 currentMenu.classList.add('is-active'); 29 30 // タブコンテンツを非アクティブにする 31 for(let i = 0; i < menuMoreDetail.length; i++) { 32 menuMoreDetail[i].classList.remove('is-active'); 33 } 34 // 対象コンテンツ(指定したIDの要素があったら)を表示させる 35 if(currentContent !== null) { 36 currentContent.classList.add('is-active'); 37 } else { 38 currentContent.classList.remove('is-active'); 39 } 40 41 }) 42 } 43}) 44})();
css
1/* タブメニュー */ 2.tab-menu { 3 display: flex; 4 margin: 0 -5px; 5} 6 7.tab-menu__item { 8 box-sizing: border-box; 9 width: -webkit-fill-available; 10} 11 12 13.tab-trigger { /* label */ 14 text-align: left; 15 cursor: pointer; 16 display: block; 17 padding: 10px; 18 border: 1px solid #ccc; 19 border-bottom: 0; 20 border-radius: 5px 5px 0 0; 21 overflow: hidden; 22 background-color: lightgray; 23 position: relative; 24} 25 26.tab-trigger.is-active { 27 background-color: darkgoldenrod; 28 29} 30 31/* 2段目たぶ */ 32.tab-menu-detail{ 33 display: none; 34} 35 36.tab-menu-detail.is-active { 37 display: flex; 38} 39 40.second-menu { 41 width: 100%; 42 text-align: left; 43 cursor: pointer; 44 padding: 6px; 45 border: 2px solid dimgray; 46 border-radius: 5px 5px 0 0; 47 overflow: hidden; 48 background-color: lightslategrey; 49 position: relative; 50 51}
html
1<div id="js-tab"> 2<ul class="tab-menu" > 3 <li class="tab-menu__item"><span class="tab-trigger js-tab-trigger is-active" data-id="tab01">予約管理</span> 4 <ul class="tab-menu-detail" id="tab01"> 5 <li class="second-menu js-tab-target " data-menu="1">スケジュール確認</li> 6 <li class="second-menu js-tab-target " data-menu="2">定休日選択</li> 7 </ul> 8 </li> 9 10 <li class="tab-menu__item"><span class="tab-trigger js-tab-trigger" data-id="tab02">メニュー作成</span> 11 <ul class="tab-menu-detail" id="tab02"> 12 <li class="second-menu js-tab-target is-active" data-menu="3">新規メニュー作成</li> 13 <li class="second-menu js-tab-target " data-menu="4">既存メニュー編集・削除</li> 14 </ul> 15 </li> 16 17 <li class="tab-menu__item"><span class="tab-trigger js-tab-trigger" data-id="tab03">クーポン作成</span> 18 <ul class="tab-menu-detail" id="tab03"> 19 <li class="second-menu js-tab-target " data-menu="5">新規クーポン作成</li> 20 <li class="second-menu js-tab-target " data-menu="6">既存クーポン編集・削除</li> 21 </ul> 22 </li> 23 24 <li class="tab-menu__item"><span class="tab-trigger js-tab-trigger" data-id="tab04">レビュー確認</span> 25 <ul class="tab-menu-detail" id="tab04"> 26 <li class="second-menu js-tab-target " data-menu="7">新規メニュー作成</li> 27 <li class="second-menu js-tab-target " data-menu="8">既存メニュー編集・削除</li> 28 </ul> 29 </li> 30</ul> 31<!-- .tab-menu --> 32 33<!-- .2段目めにゅ --> 34 35 36<!-- .2段目めにゅ --> 37<div class="tab-content"> 38 <div class="tab-content__item js-tab-target is-active" id="tab01"> 39 <p>タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。タブ1のコンテンツが入ります。</p> 40 </div><!-- .tab-content__item --> 41 <div class="tab-content__item js-tab-target" id="tab02"> 42 <p>タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。タブ2のコンテンツが入ります。</p> 43 </div><!-- .tab-content__item --> 44 <div class="tab-content__item js-tab-target" id="tab03"> 45 <p>タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。</p> 46 </div><!-- .tab-content__item --> 47 <div class="tab-content__item js-tab-target" id="tab04"> 48 <p>タブ4のコンテンツが入ります。タブ4のコンテンツが入ります。タブ4のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。タブ3のコンテンツが入ります。</p> 49 </div><!-- .tab-content__item --> 50</div><!-- .tab-content --> 51</div> 52
試したこと
jsファイルにif文でelse以下を追加し、removeする記述を追加してみたが、特に変化なし。
// 対象コンテンツ(指定したIDの要素があったら)を表示させる if(currentContent !== null) { currentContent.classList.add('is-active'); } else { currentContent.classList.remove('is-active'); }
参考にしたページ
https://blog.pranktone.net/web/javascript/20200304150200.html
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/01 17:20
2021/04/02 00:37