質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1740閲覧

JavaScriptを使用して 複数階層のタブメニューのコンテンツ表示

RyoYamane

総合スコア2

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/04/27 11:06

解決したいこと

クリックしたボタンに該当するコンテンツ(内容)を表示させたい。

例)
Ruby on Railsでサロン予約ができるWebアプリをつくっています。
記事を投稿する機能の実装中に狙っている表示ができずかなり時間が経過しております。
解決方法を教えて下さい。

発生している問題

https://gyazo.com/27d110281873abf33a73ca8178de638d

上記動画のように、第2階層のメニューをクリックした際に、コンソール内に記述してあるPタグの内容を実際のビューでも
表示させ、それぞれのメニューにある出しわけを行いたい。

該当するソースコード

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" unko-id="10">スケジュール確認</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<!-- .メニュー内容 --> 37<div class="tab-content"> 38 <div class="tab-content__item js-tab-target " unko-menu="1" > 39 <p class="tab-content__item" >スケジュール確認のコンテンツが入ります。。スケジュール確認のコンテンツが入ります。。スケジュール確認のコンテンツが入ります。。スケジュール確認のコンテンツが入ります。。スケジュール確認のコンテンツが入ります。。</p> 40 </div><!-- .tab-content__item --> 41 <div class="tab-content__item js-tab-target" id="tab02"> 42 <p>定休日選択のコンテンツが入ります。定休日選択のコンテンツが入ります。定休日選択のコンテンツが入ります。定休日選択のコンテンツが入ります。定休日選択のコンテンツが入ります。定休日選択のコンテンツが入ります。</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<%# /Footer前 %> 52</div> 53

例)

css

1.tab-menu-detail{ 2 display: none; 3} 4 5.tab-menu-detail.is-active { 6 display: flex; 7} 8 9.second-menu { 10 width: 100%; 11 text-align: left; 12 cursor: pointer; 13 padding: 6px; 14 border: 2px solid dimgray; 15 border-radius: 5px 5px 0 0; 16 overflow: hidden; 17 background-color: lightslategrey; 18 position: relative; 19 20} 21 22/* タブコンテンツ */ 23.tab-content { 24 border: 1px solid #ccc; 25 26} 27.tab-content__item { 28 box-sizing: border-box; 29 padding: 20px; 30 display: none; 31 text-align: left; 32} 33 34.tab-content__item:active { 35 display:flex; 36}

javascript

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 const tabMenuDetails = tabMenu.querySelectorAll(".tab-menu-detail"); 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 console.log(menuMoreDetail) 15 }; 16 init(); 17 18 //クリックされた要素(メニュー要素)を取得 19 let currentMenu = e.currentTarget; 20 //ターゲットとなる要素(タブメニューdata属性ちと等しいid値を持つコンテンツ要素を取得 21 let currentContent = document.getElementById(currentMenu.dataset.id); 22 console.log(currentContent) 23 24 // すべてのタブメニューの'is-active'クラスを削除 25 for(let i = 0; i < menuDetail.length; i++) { 26 menuDetail[i].classList.remove('is-active'); 27 } 28 // クリックしたタブメニューに'is-active'クラスを追加 29 currentMenu.classList.add('is-active'); 30 31 //クリックされた時に is-active を追加/削除 32 for (const tabMenuDetail of tabMenuDetails) { 33 console.log(tabMenuDetail) 34 if (tabMenuDetail.id === currentMenu.dataset.id) { 35 tabMenuDetail.classList.add('is-active'); 36 } else { 37 tabMenuDetail.classList.remove('is-active'); 38 } 39 } 40 // タブコンテンツを非アクティブにする 41 //for(let i = 0; i < menuMoreDetail.length; i++) { 42 // menuMoreDetail[i].classList.remove('is-active'); 43 44 // 対象コンテンツ(指定したIDの要素があったら)を表示させる 45 // if(currentContent !== null) { 46 // currentContent.classList.add('is-active'); 47 // } else { 48 // currentContent.classList.remove('is-active'); 49 // } 50 51 52 //ここから 53 const menuDetailSub = tabMenu.querySelectorAll("[unko-id]") 54 const menuMoreDetailSub = tabMenu.querySelectorAll("[unko-menu]") 55 const tabMenuDetailsSub = tabMenu.querySelectorAll(".tab-content__item"); 56 57 for(let i = 0; i < menuDetailSub.length; i++) { 58 menuDetailSub[i].addEventListener('click', (e) =>{ 59 const taketakeshi = () =>{ 60 menuMoreDetail[i].style.display = 'block'; 61 console.log(menuDetailSub) 62 }; 63 taketakeshi(); 64 65 //クリックされた要素(メニュー要素)を取得 66 let currentMenuSub = e.currentTarget; 67 //ターゲットとなる要素(タブメニューdata属性ちと等しいid値を持つコンテンツ要素を取得 68 let currentContentSub = document.getElementById(currentMenuSub.dataset.id); 69 console.log(currentContentSub) 70 71 // すべてのタブメニューの'is-active'クラスを削除 72 for(let i = 0; i < menuDetailSub.length; i++) { 73 menuDetailSub[i].classList.remove('is-active'); 74 } 75 // クリックしたタブメニューに'is-active'クラスを追加 76 currentMenu.classList.add('is-active'); 77 78 //クリックされた時に is-active を追加/削除 79 for (const tabMenuDetailSub of tabMenuDetailsSub) { 80 console.log(tabMenuDetailSub) 81 if (tabMenuDetailSub.id === currentMenuSub.dataset.id) { 82 tabMenuDetailSub.classList.add('is-active'); 83 } else { 84 tabMenuDetailSub.classList.remove('is-active'); 85 } 86 } 87 })} 88 89 90 //ここまで 91 }) 92 }

自分で試したこと

GIFでも確認できる通りですが、console.logで確認しながら作業を行なっており、 第2階層のメニューをクリックした時に表示させたいPタグの中身までは引っ張って来れている状態です。 あとは表示の問題でCSSのdisplayをnoneにするかしないかだと思い、思いつくパターンを試して見ましたが、 全くうまくいきませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thyda.eiqau

2021/04/28 00:26

data-menuなのかunko-menuなのか、idなのかunko-menuなのか、めちゃくちゃですが、全体的に定義を見直して修正していただけますか。
thyda.eiqau

2021/04/28 00:32

あと、CSSも、.tab-content__item:active は何を意図しているのか、ご自身で確認されたほうがよいと思います。
RyoYamane

2021/04/28 07:37

いろんなものを参考にしてしまって、classなど整理せずに増やしていたらこんな状態になりました。 わかりにくいコードですいません。 また、ご指摘のとり記述している言葉の認識も甘いところがまだまだあります。 一度整理します!!ありがとうございます!
guest

回答1

0

ベストアンサー

とりあえず、以下のように変更追加してみてはいかがでしょうか。

js

1 const taketakeshi = () =>{ 2 //menuMoreDetail[i].style.display = 'block'; ←変数名が間違っている 3 menuMoreDetailSub[i].style.display = 'block';

css

1.tab-content__item .tab-content__item { 2 display: block; /* display: none を打ち消し */ 3}

投稿2021/04/28 01:07

Lhankor_Mhy

総合スコア36104

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RyoYamane

2021/04/28 07:35

早急な回答ありがとうございます。 ご指摘の記述で挙動確認できました! 現在、要素を増やそうとすると、先に表示した要素がそのままで新しい要素がその下に表示されているので、 こちら実装できるように頑張ります! 今後とも何卒よろしくお願いいたします。
Lhankor_Mhy

2021/04/28 07:59

お役に立てたようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問