arrow-left arrow-right envelope facebook feedly folder home html-tag person tag twitter wordpress rss user get-pocket envira google-plus

[jQuery]プラグインなしでタブメニュー

画像を多く表示させたい場合にカルーセル(スライドショー)を使いますが、他にも同じページでコンテンツを複数表示させたい時にはタブメニューも有効です。Bootstrapやプラグインなどでも多彩なタブメニューが実装できるのですが、今回はプラグインを使わずにjQueryを書いて実装できるタブメニューを作ってみました。

タブメニューって?


ブラウザのタブのようにクリックすると、画面が切り替わるものをさします。
ナビゲーションにも使われていたりしますが、興味のあるコンテンツをクリックして表示させる時に使われているのを見かけます。
プラグインで実装されているものが多いですが、今回はスクリプトだけでタブメニューを実装します。

実装手順

実装手順は以下です。

  1. jQueryを用意
  2. マークアップ
  3. 大まかに見た目を決める
  4. スクリプト
  5. 見た目をさらに整える

実際に作ってみよう

手順を追って作っていきます。
またスクリプトについては、どのように動かすのかの説明を追加します。

1.jQueryを用意する

実装の前段階として、文書構造にjQueryを忘れずに埋め込みます。
今回はCDNを使います。</body>の直上にでも置いておきましょう。

2.文書構造を書く

まず、タブの部分をマークアップします。

クリックした時にそのタブが表示されるように.activeクラスをつけておきます。

続いてコンテンツ部分を書きます。

ここも<ul>と<li>で書いてもいいと思いますが、今回は<div>で構造を書いています。
ここにもアタマのコンテンツに.activeクラスをつけておきます。

完成した文書構造は以下です。

3.大まかな見た目を決める

CSSで大体の見た目を作っておきます。CSSリセットもかけておきます。

タブ自体を display: inline-block; で横並びにしておきます。また、.activeクラスがついたコンテンツだけ見えるように、元々のコンテンツ部分には display: none; をかけておきます。

ここまでの全体像はこちら。

See the Pen Simple Tab(stub) by necomacustom (@tamayura) on CodePen.27739



これだけですとタブをクリックしても全く動かないので、ここでスクリプトを書いていきます。

4.スクリプトを書く – jQuery

クリックした場所に合わせて.activeクラスを付け替えて表示/非表示を制御する、という内容です。

すみません、途中で面倒になって、コードの中に書いてしまいました…
一番最初の $(function() { }); はjQueryのおまじない的な感じで書いていくのですが…元々 jQuery(document).ready(function() { }); という処理を始める書き出しを略しています。
そして、この $(function() { }); 内の『{ }』の中に処理を書いていきます。
マークアップした時に書いていますが、".tab li" はタブ部分、".tabContent" はコンテンツ部分に付けられたクラス名です。これらをjQueryで操作します。

2行目

$(“.tab li”).click(function() { は、タブ(.tab li)をクリックした時に『{ }』内に書かれた内容を動かす為に書きます(.click(function(){ });)。

13行目にあるように、『});』で閉じれば処理が終わります。最初からjQueryを書く場合は必ず$(“honyarara”).click(function() { });といった感じで始めに閉じておき、『{ }』内に処理内容を書いていきます。

3行目

.tab li 要素がクリックされたときに、それが何番目の要素かをjQueryを使って調べます。
その時に使われるのが index(this) です。正確にはindexメソッドと言います。
詳細は避けますが、当てはまる要素に対して0から始まる値を返していきます。反対に当てはまる要素がない時には-1の値を返します。
indexメソッドで返ってきた値を今回は’num‘という変数に代入します。変数は…中学校の時に習った、方程式に使われるxやyのことですね。

5行目

タブをクリックした時に、コンテンツ部分(.tabContent)についていた .active クラスを一旦取り除きます(.removeClass())。
これはどういうことかと言いますと、CSSで書いたコンテンツ部分は display: none; で非表示にしてあり、クラス .active をつけることにより表示させているので、この処理を忘れると、前にクリックしたコンテンツ部分が表示されたままになります。これは実際にコードを一旦書いてみて、この部分をコメントアウトしてみると確認できます。

7行目

3行目でindexメソッドを使って、クリックしたタブが何番目かを調べて変数’num’にその値を代入しました。
クリックしたタブと同じ順番(eq(num))にあるコンテンツ部分にクラス .active をつけて(.addClass(.active))表示させる、という意味になります。
試しにここの’num’に『1』を代入すると、2番目のコンテンツが表示されます。

9行目

元々1つ目のタブについていたクラス名 .activeを取り除きます。
この処理も5行目と同じで、この処理を書かずに置くとクリックしたすべてのタブにクラス .active がつけられて、どのタブも色が変わったまま(CSSで .tab li.active を指定していますね)になってしまいます。

11行目

最後に $(this) というのが出てきました…これは「イベントが発生した要素」を指します。
このタブメニューの場合は、複数の同じ要素(ここでは.tab li)のうち、クリックした要素を指しています。
クリックしたタブにクラス .active を追加して(.addClass(.active))タブの背景色を変えています。
これで、タブをクリックするとコンテンツ部分も変わるはず、です。

5.さらに見た目を整える

これでも十分タブメニューなのですが、もう少し変えてそれっぽくしていきます。

See the Pen Simple Tab1 by necomacustom (@tamayura) on CodePen.27739



他にもいろいろ変えていけば、ユーザーの興味を引くタブメニューになると思います。
今回は以上です、お疲れ様でした!


基礎中の基礎のような、タブメニューでした。
最近は記録として残してくれる方が多くなったおかげと、コピペでも十分使えるプラグインとしてたくさん出回るようにもなって、本当に時代の流れを感じています。
フロントエンドはJavaScriptの歴史といっても過言ではないようで、新しいことがどんどん出てきてどんどん廃れていくというめまぐるしい分野ですが、時代に振り回されつつも基礎もしっかり固めておきたいですね。ねこま(@necomacustom)でした。

Share

Leave a comment

PAGE TOP