HOME>WEBプログラム覚書>[jQuery]余計なことをしないタブのjQueryプラグイン

[jQuery]余計なことをしないタブのjQueryプラグイン

タブのサンプルやプラグインは多々あるのですが、文書構造が変だったり、デザインとか 余計なことをしてくるのが多く使いにくかったので、適当に書いて使っていたものを jQueryのプラグインにしてみました。

動作サンプル

複数のタブを作成することも可能です。

サンプル

実行結果

見出し1
  • コンテンツ1の内容が入ります
見出し2
  • コンテンツ2の内容が入ります

見出し1
  • コンテンツ1の内容が入ります
見出し2
  • コンテンツ2の内容が入ります

Javascript

  1. $('.app-tab2').tab({
  2.     headline: 'h5',
  3.     content: '.wrapper div'
  4. });

HTML

  1. <div class="app-tab2 ver-blue">
  2.     <div class="wrapper">
  3.         <div>
  4.             <h5>見出し1</h5>
  5.             <ul>
  6.                 <li>コンテンツ1の内容が入ります</li>
  7.             </ul>
  8.         </div>
  9.  
  10.         <div>
  11.             <h5>見出し2</h5>
  12.             <ul>
  13.                 <li>コンテンツ2の内容が入ります</li>
  14.             </ul>
  15.         </div>
  16.     </div>
  17. </div>
  18.  
  19. <br />
  20.  
  21. <div class="app-tab2 ver-orange">
  22.     <div class="wrapper">
  23.         <div>
  24.             <h5>見出し1</h5>
  25.             <ul>
  26.                 <li>コンテンツ1の内容が入ります</li>
  27.             </ul>
  28.         </div>
  29.  
  30.         <div>
  31.             <h5>見出し2</h5>
  32.             <ul>
  33.                 <li>コンテンツ2の内容が入ります</li>
  34.             </ul>
  35.         </div>
  36.     </div>
  37. </div>

CSS

  1. .app-tab2 .tab-nav h5 {
  2.     display: inline-block;
  3.     background: #E5E5E5;
  4.     padding: 8px;
  5.     margin: 0 4px;
  6.     cursor: pointer;
  7. }
  8.  
  9. .app-tab2 .tab-nav h5.active {
  10.     cursor: default;
  11. }
  12.  
  13. .app-tab2 .wrapper {
  14.     padding: 8px;
  15.     background: #FFFFFF;
  16.     border-style: solid;
  17.     border-width: 8px
  18. }
  19.  
  20. .app-tab2.ver-blue .wrapper {
  21.     border-color: dodgerblue;
  22. }
  23.  
  24. .app-tab2.ver-blue .tab-nav h5.active {
  25.     background: dodgerblue;
  26. }
  27.  
  28. .app-tab2.ver-orange .wrapper {
  29.     border-color: orange;
  30. }
  31.  
  32. .app-tab2.ver-orange .tab-nav h5.active {
  33.     background: orange;
  34. }

最初に開いているコンテンツを変更したり、スピードを変えてみたり。

サンプル

実行結果

見出し1
  • コンテンツ1の内容が入ります
見出し2
  • コンテンツ2の内容が入ります

見出し1
  • コンテンツ1の内容が入ります
見出し2
  • コンテンツ2の内容が入ります
見出し3
  • コンテンツ3の内容が入ります

Javascript

  1. $('.app-tab3').tab({
  2.     headline: 'h5',
  3.     content: '.wrapper div',
  4.     open: 1,
  5.     duration: 'fast'
  6. });
  7.  
  8. $('.app-tab4').tab({
  9.     headline: 'h5',
  10.     content: '.wrapper div',
  11.     open: 2,
  12.     duration: 'slow'
  13. });

HTML

  1. <div class="app-tab3 ver-red">
  2.     <div class="wrapper">
  3.         <div>
  4.             <h5>見出し1</h5>
  5.             <ul>
  6.                 <li>コンテンツ1の内容が入ります</li>
  7.             </ul>
  8.         </div>
  9.  
  10.         <div>
  11.             <h5>見出し2</h5>
  12.             <ul>
  13.                 <li>コンテンツ2の内容が入ります</li>
  14.             </ul>
  15.         </div>
  16.     </div>
  17. </div>
  18.  
  19. <br />
  20.  
  21. <div class="app-tab4 ver-red">
  22.     <div class="wrapper">
  23.         <div>
  24.             <h5>見出し1</h5>
  25.             <ul>
  26.                 <li>コンテンツ1の内容が入ります</li>
  27.             </ul>
  28.         </div>
  29.  
  30.         <div>
  31.             <h5>見出し2</h5>
  32.             <ul>
  33.                 <li>コンテンツ2の内容が入ります</li>
  34.             </ul>
  35.         </div>
  36.  
  37.         <div>
  38.             <h5>見出し3</h5>
  39.             <ul>
  40.                 <li>コンテンツ3の内容が入ります</li>
  41.             </ul>
  42.         </div>
  43.     </div>
  44. </div>

CSS

  1. .ver-red .tab-nav h5 {
  2.     display: inline-block;
  3.     background: #E5E5E5;
  4.     padding: 8px;
  5.     margin: 0 4px;
  6.     cursor: pointer;
  7. }
  8.  
  9. .ver-red .tab-nav h5.active {
  10.     cursor: default;
  11.     background: darkred;
  12. }
  13.  
  14. .ver-red .wrapper {
  15.     padding: 8px;
  16.     background: #FFFFFF;
  17.     border: 8px solid darkred;
  18.     border-width: 8px
  19. }

ソース

tab.js

  1. (function ($) {
  2.     'use strict';
  3.     $.fn.tab = function (config) {
  4.         var options = $.extend({
  5.             content     : 'div',       // 表示・非表示対象とするコンテンツ
  6.             headline    : '.nav-list', // ナビゲーションにする要素
  7.             open        : 0,           // 最初にオープン状態にするコンテンツのIndex番号
  8.             navClass    : 'tab-nav',   // ナビゲーションのClass名
  9.             activeClass : 'active',    // オープン状態のナビ、コンテンツに付けられるClass名
  10.             duration    : 'normal'     // タブ切替時のアニメーションの速度
  11.         }, config);
  12.  
  13.         this.each(function () {
  14.             var contents = $(this).find(options.content),
  15.                 nav      = $('<div></div>', { 'class': options.navClass });
  16.  
  17.             contents.each(function (i) {
  18.                 var headline = $(this).find(options.headline);
  19.                 headline.addClass('nav-ctrl-' + i).data('index', i);
  20.                 if (i === options.open) {
  21.                     $(this).addClass(options.activeClass);
  22.                     headline.addClass(options.activeClass);
  23.                 } else {
  24.                     $(this).hide();
  25.                 }
  26.             });
  27.  
  28.             nav.prepend(contents.find(options.headline));
  29.             nav.on('click', function (e) {
  30.                 if ($(e.target).data('index') !== undefined) {
  31.                     options.open = $(e.target).data('index');
  32.                     $(this).children().each(function (i) {
  33.                         if (i === options.open) {
  34.                             $(this).addClass(options.activeClass);
  35.                         } else {
  36.                             $(this).removeClass(options.activeClass);
  37.                         }
  38.                     });
  39.  
  40.                     contents.each(function (i) {
  41.                         if (i === options.open) {
  42.                             $(this).fadeIn(options.duration);
  43.                             $(this).addClass(options.activeClass);
  44.                         } else {
  45.                             $(this).hide().removeClass(options.activeClass);
  46.                         }
  47.                     });
  48.                 }
  49.             });
  50.             $(this).prepend(nav);
  51.         });
  52.         return this;
  53.     };
  54. }(jQuery));

使い方

読み込み

jQuery本体とtab.jsを読み込みます。

  1. <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
  2. <script src="./tab.js"></script>

マークアップ

ナビゲーション部分は自動生成するのでJavascriptが無効でも読めて、コンテンツの数や内容が多くなってもコーディングが楽です。

サンプル

実行結果

  • コンテンツ1の内容が入ります
  • コンテンツ2の内容が入ります
  • コンテンツ3の内容が入ります

Javascript

  1. $('.app-tab').tab();

HTML

  1. <div class="app-tab">
  2.     <div>
  3.         <h5 class="nav-list">見出し1</h5>
  4.         <ul>
  5.             <li>コンテンツ1の内容が入ります</li>
  6.         </ul>
  7.     </div>
  8.  
  9.     <div>
  10.         <h5 class="nav-list">見出し2</h5>
  11.         <ul>
  12.             <li>コンテンツ2の内容が入ります</li>
  13.         </ul>
  14.     </div>
  15.  
  16.     <div>
  17.         <h5 class="nav-list">見出し3</h5>
  18.         <ul>
  19.             <li>コンテンツ3の内容が入ります</li>
  20.         </ul>
  21.     </div>
  22. </div>

CSS

  1. .app-tab .tab-nav h5 {
  2.     display: inline-block;
  3.     background: #E5E5E5;
  4.     padding: 8px;
  5.     margin: 0 4px;
  6.     cursor: pointer;
  7. }
  8.  
  9. .app-tab .tab-nav h5.active {
  10.     background: #CC9999;
  11.     cursor: default;
  12. }

上記実行後のHTMLは

  1. <div class="app-tab">
  2.     <div class="tab-nav">
  3.         <h5 class="nav-list nav-ctrl-0 active">見出し1</h5>
  4.         <h5 class="nav-list nav-ctrl-1">見出し2</h5>
  5.         <h5 class="nav-list nav-ctrl-2">見出し3</h5>
  6.     </div>
  7.     <div>
  8.         <ul>
  9.             <li>コンテンツ1の内容が入ります</li>
  10.         </ul>
  11.     </div>
  12.  
  13.     <div>
  14.         <ul>
  15.             <li>コンテンツ2の内容が入ります</li>
  16.         </ul>
  17.     </div>
  18.  
  19.     <div>
  20.         <ul>
  21.             <li>コンテンツ3の内容が入ります</li>
  22.         </ul>
  23.     </div>
  24. </div>

となります。上記HTMLに対してCSSを設定することになります。

オプション

オプション デフォルト 内容
content div 表示・非表示対象とするコンテンツ
headline .nav-list ナビとして利用する要素。上記 content で指定した要素の子要素を検索します。
open 0 最初に表示状態にするコンテンツのIndex
navClass tab-nav ナビゲーションのクラス名
activeClass active オープン状態のナビに付加されるクラス名
duration normal 切替時のアニメーションの速度

その他

  • .tab()とかいうメソッド名は重複しやすいので気をつけてくださいw
  • googleさん的には、どのタブが開いてるかがURLでわかるのが望ましいらしいのです。 (1つめのタブがアクテイブな状態と2つめのタブがアクティブな状態はURLで区別つける)
  • 動作はIE11、Chorome21でのみ確認。jQueryは1.10.2でのみ確認。
投稿日 2013年12月11日 05:16
カテゴリ JavaScript
タグ jQuery
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1342

コメント

コメントする
Name
Email Address
URL