【Javascript】タブメニューを作ろう
ドットインストール様の講座にて、タブメニューの作成を学んできました。私の様な未熟者には簡単そうに思えるちょっとした機能ですら難しいですね(-_-;)
今回はタブメニューの作成方法一例のメモと、その要所についてメモしていきたいと思いますφ(・_・”)メモメモ
目次
タブメニューの完成形
See the Pen
VwezmEe by egg (@egg0522sei)
on CodePen.
完成形はこちらになります。各メニューをクリックすることで、対応した文章が表示されます。それではHTML、CSS、Javascript別に分けて、要所をメモしていきましょう。
HTML解説
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<body> <div class="container"> <ul class="menu"> <li><a href="#" class="active" data-id="about">サイトの概要</a></li> <li><a href="#" data-id="service">サービス内容</a></li> <li><a href="#" data-id="contact">お問い合わせ</a></li> </ul> <section class="content active" id="about"> サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。 </section> <section class="content" id="service"> サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。 </section> <section class="content" id="contact"> お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。 </section> </div> <script type="text/javascript" src="asset/javascript.js"> </script> </body> |
まず一つ目がタグで囲まれた部分です。
メニューパーツ
|
1 2 3 4 5 |
<ul class="menu"> <li><a href="#" class="active" data-id="about">サイトの概要</a></li> <li><a href="#" data-id="service">サービス内容</a></li> <li><a href="#" data-id="contact">お問い合わせ</a></li> </ul> |
二つ目のパーツはコンテンツ部分です。
コンテンツパーツ
|
1 2 3 4 5 6 7 8 9 |
<section class="content active" id="about"> サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。サイトの概要。 </section> <section class="content" id="service"> サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。サービス内容。 </section> <section class="content" id="contact"> お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。お問い合わせ。 </section> |
HTMLで重要なことは、各セクションをidで識別することと、現在選択されているものを識別するために「active」クラスを設定する事です。
CSS解説
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
@charset "utf-8"; /* CSS Document */ body{ font-size: 14px; } .container{ margin:30px auto; width:500px; } .menu{ padding:0; margin:0; display:flex; } .menu li a { display:inline-block; width:100px; text-align: center; padding:8px 0; color:#333; text-decoration:none; border-radius:4px 4px 0 0; } .menu li a.active{ background:#333; color:#fff; } .menu li a:not(.active):hover{ opacity:0.5; transition:opacity 0.4s; } .content.active{ background:#333; color:#fff; min-height:150px; padding:12px; display:block; } .content{ display:none; } |
|
1 2 3 4 |
.menu li a:not(.active):hover{ opacity:0.5; transition:opacity 0.4s; } |
これは「”menu”タグ内の、”li”内の”active”と一緒にくっついていない”a”タグにマウスが乗ったら(ホバー)○○しなさい」という意味です。文章にしてみてもかなり難解ですね。「not」が否定的な意味を持つため、「.active」と一緒にくっついている「a」タグ”以外”のクラスに以下のプロパティを適用しなさいという意味になります。
今回の場合は「”active”がついていない”a”タグにマウスが乗った時、0.4秒かけて0.5半透明にしなさい」という命令になります( ゚д゚ )
|
1 2 3 4 5 6 7 |
.content.active{ background:#333; color:#fff; min-height:150px; padding:12px; display:block; } |
つまり「”content”クラスと”active”両方のクラスがついたものは、表示しなさい」ということになります。これは後に出てくる、非表示設定との兼ね合いで重要になってくる設定です。
|
1 2 3 |
.content{ display:none; } |
Javascript解説
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
'use strict' { const menuItems = document.querySelectorAll('.menu li a'); const contents = document.querySelectorAll('.content'); menuItems.forEach(clickeditem =>{ clickeditem.addEventListener('click',e =>{ e.preventDefault(); menuItems.forEach(item =>{ item.classList.remove('active') }) clickeditem.classList.add('active'); contents.forEach(content =>{ content.classList.remove('active'); }); document.getElementById(clickeditem.dataset.id).classList.add('active'); }); }); } |
|
1 2 |
const menuItems = document.querySelectorAll('.menu li a'); const contents = document.querySelectorAll('.content'); |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
menuItems.forEach(clickeditem =>{ clickeditem.addEventListener('click',e =>{ e.preventDefault(); menuItems.forEach(item =>{ item.classList.remove('active') }) clickeditem.classList.add('active'); contents.forEach(content =>{ content.classList.remove('active'); }); document.getElementById(clickeditem.dataset.id).classList.add('active'); }); }); |
「タブメニューがクリックされた時にイベントが発生」→「リンクタグの処理を無効化する」→「”menu”内の全ての”a”タグから”active”クラスを削除する」→「クリックされた要素に”active”クラスをつける」→「全ての”content”クラスがついている要素から”active”クラスを削除する」→「クリックされた要素の”data-id”から一致する”id”もつ要素に”acrive”クラスをつけなさい」
という、私のような初心者には難解な手順を踏んでますね(-_-;
それでは一つずつ見ていきます。
「タブメニューがクリックされた時にイベントが発生」
|
1 2 |
menuItems.forEach(clickeditem =>{ clickeditem.addEventListener('click',e =>{ |
「リンクタグの処理を無効化する」
|
1 |
e.preventDefault(); |
|
1 2 3 |
menuItems.forEach(item =>{ item.classList.remove('active') }) |
「クリックされた要素に”active”クラスをつける」
|
1 |
clickeditem.classList.add('active'); |
「全ての”content”クラスがついている要素から”active”クラスを削除する」
|
1 2 3 |
contents.forEach(content =>{ content.classList.remove('active'); }); |
「クリックされた要素の”data-id”から一致する”id”もつ要素に”active”クラスをつけなさい」
|
1 |
document.getElementById(clickeditem.dataset.id).classList.add('active'); |
ハァハァ…。クリックすると文章が変わる…。たったこれだけの処理なのにこれだけのロジックが組まれているんですね…。
理解するだけで大変なのにこれを応用して自分でプログラムが書けるようになるはいつのことなのかorz