Webデザイナーになる方法やサイト制作のテクニック・Tipsをご紹介

メニューを開く

jQueryでタブメニューを実装(画像メニュー版)

jQuery2010年8月12日

こちらの記事で、メニュー部分をテキストにて実装するjQueryのスクリプトを紹介させて頂きました。
私も業務でタブメニューを実装する場合はjQueryを使用することが多いのですが、テキストではなくなにかと画像で実装するパターンのほうが多かったりします。実はその場合のスクリプトはまったく違ったものになるので、こちらの記事ではメニューを画像で実装した場合のスクリプトをご紹介します。

HTML

<div id="tab-box">
<ul id="nav" class="clearFix">
<li><a href="#tab-01"><img src="img/nav-01.gif" alt="" width="80" height="30"/></a></li>
<li><a href="#tab-02"><img src="img/nav-02.gif" alt="" width="80" height="30"/></a></li>
<li><a href="#tab-03"><img src="img/nav-03.gif" alt="" width="80" height="30"/></a></li>
<li><a href="#tab-04"><img src="img/nav-04.gif" alt="" width="80" height="30"/></a></li>
</ul>
<div id="tab-01">
<p>メニュー1のコンテンツメニュー1のコンテンツメニュー1のコンテンツ</p>
</div>
<div id="tab-02">
<p>メニュー2のコンテンツメニュー2のコンテンツメニュー2のコンテンツ</p>
</div>
<div id="tab-03">
<p>メニュー3のコンテンツメニュー3のコンテンツメニュー3のコンテンツ</p>
</div>
<div id="tab-04">
<p>メニュー4のコンテンツメニュー4のコンテンツメニュー4のコンテンツ</p>
</div>
</div>

CSS

*{margin:0;padding:0;}
body{padding:10px;}
#tab-box ul {
width:500px;
margin:0 10px;
padding: 0;
list-style: none;
}
#tab-box ul li {
margin-right:3px;
float:left;
display:inline;
font-size:0;
}
#tab-box ul li a img{
outline:none;
border:none;
}
#tab-box div {
display:none;
width:500px;
margin-bottom:30px;
padding:20px;
border:3px solid #0066cc;
}
.clearFix:after{
display:block;
clear:both;
height:0;
visibility:hidden;
content:".";
zoom:1;
}

Javascript

$(function(){
var handler = $('ul#nav li a');
var url = document.URL;
var urlId = url.substr(url.lastIndexOf('#'));
var urlIdJudgment = urlId.lastIndexOf('#');
$('ul#nav').each(function(){
$('#tab-box > div:first').show();
var imgSrc = $('ul#nav li:first img').attr('src');
var imgDot = imgSrc.lastIndexOf('.');
var onSrc = imgSrc.substr(0, imgDot) + '_o' + imgSrc.substr(imgDot, 4);
$('ul#nav li:first img').attr('src',onSrc).addClass('tab-on');
});
// クリック時の動作
handler.click(function() {
// クリックしたタブ画像をオンの状態に
var imgSrc = $(this).children('img').attr('src').replace(/data/o/g, "");
var imgDot = imgSrc.lastIndexOf('.');
var onSrc = imgSrc.substr(0, imgDot) + '_o' + imgSrc.substr(imgDot, 4);
$(this).children('img').attr('src',onSrc);
// タブ画像の切り替え
var imgOff = $('ul#nav li img.tab-on').attr('src').replace(/data/o/g, "");
$('ul#nav li img.tab-on').attr('src',imgOff);
$('ul#nav li img').removeClass('tab-on');
$(this).children('img').addClass('tab-on');
// コンテンツの切り替え
var clickAttr = $(this).attr('href');
var showAttr = '#' + $('#tab-box > div:visible').attr('id');
if(clickAttr !== showAttr) {
$('#tab-box > div:visible').hide();
var showDiv = '#tab-box div' + clickAttr;
$(showDiv).show();
return false;
}
else {
// 何度もクリックした場合もタブ画像をオンの状態に
var imgSrc = $(this).children('img').attr('src').replace(/data/o/g, "");
var imgDot = imgSrc.lastIndexOf('.');
var onSrc = imgSrc.substr(0, imgDot) + '_o' + imgSrc.substr(imgDot, 4);
$(this).children('img').attr('src',onSrc);
return false;
}
})
// ロールオーバー
handler.hover(function() {
var classJudgment = $(this).children('img').attr('class');
if(classJudgment != 'tab-on') {
var imgSrc = $(this).children('img').attr('src');
var imgDot = imgSrc.lastIndexOf('.');
var onSrc = imgSrc.substr(0, imgDot) + '_o' + imgSrc.substr(imgDot, 4);
$(this).children('img').attr('src',onSrc);
}
}, function() {
var classJudgment = $(this).children('img').attr('class');
if(classJudgment != 'tab-on') {
var imgOff = $(this).children('img').attr('src').replace(/data/o/g, "");
$(this).children('img').attr('src',imgOff);
}
});
});

このスクリプトにはロールオーバーのスクリプトも含まれていますが、別のスクリプトで実装していればロールオーバー部分の関数は削除して大丈夫です。上記のスクリプトでは、ロールオーバーおよびメニューがアクティブになった場合に「_o」を画像ファイル名に付与するようになっています。ロールオーバーとアクティブの画像を別々にしたければ、スクリプト部分の「_o」と書かれている部分を書き換えれば簡単にカスタマイズできます。

この記事を読んでいる方にオススメの記事

「jQuery」の他の記事を読む

morry さん

2012年5月27日

どうも、お世話様です。
画像のタブ|Jqueryでググって参りました。
独学でスクリプトの開発、頭が下がる思いです。

頭を下げつつ、質問をさせてください。
タブコンテンツ内にリンクを設けて、
そのリンクから該当のタブへ遷移することは
できますか?
var handler02とかにして他のidを代入してみたり
したのですがうまくいかずに質問です。

すいません。

admin さん

2012年6月17日

>morry様

コメントありがとうございます。
お返事が遅くなってしまい申し訳ありません。

>タブコンテンツ内にリンクを設けて、
>そのリンクから該当のタブへ遷移することは
>できますか?
こちらについてですが、そこまで想定したコードではないもので…
申し訳ありません。

機会があれば、そのようなコードも開発して紹介したいと思います。
どうぞ今後ともよろしくお願いいたします。

chobi さん

2013年8月6日

はじめまして。同じくググって参りました。
すごく設置しやすいコードで初めてのタブもうまくできました。

厚かましく質問です。
タブを切り替えた際に、コンテンツのボックス(tab-01,2,3で表示されるエリア)以外の場所も一緒に表示を変えたいのですが、コードを少し書き替えれば実現出来ますか?

具体的に言うとタブメニューの上の方に画像を表示して、それぞれのメニューごとにちがう画像を表示したいのです。
お手数掛けてすいません。どうぞよろしくお願い致します。

admin さん

2013年8月16日

>chobi様

コメントありがとうございます。
お返事が遅くなってしまい申し訳ありません。

ご質問いただいた件についてですが、
本機能を流用して実装することは難しいかと思われます。
あくまで#tab-box内にて切り替えることを想定したものになりますため、
かなりのコードの改変が必要となります。
(ほぼ別物になってしまう)

ご期待に沿えず申し訳ございません。
よろしくお願いいたします。

ponta さん

2016年6月19日

はじめまして。
初めて念願の画像タブ設置ができ、とても感謝しております。
他質問者様よりも大分期間が空いてしまっている為、ご確認いただけることを祈り質問させていただきます…!

サンプル通りの設置は上手くいきましたので、新たに別ページに同じようなタブを設置しようと試みております。
・ボタン箇所は全部で3ヵ所(3つのボタンが表示される)
・各ボタン画像は名前を「navi_01」「navi_01_o」と数字部分のみ変更
(「nav」→「navi」にも変更)
・id「tab-box」は「tab-box-flow」に変更
上記のような変更を行いました場合、jQueryファイル内はどこを変更すれば良いのでしょうか。

お手数をおかけしてしまい誠に申し訳ございません。
どうぞ宜しくお願い致します。

【※】
web上では承認(質問内容を表示)せず、
メールにてご回答をいただけましたら幸いでございます。

この記事にコメントする

必須
必須
本文必須

  • 承認制のため、即時には反映されません。

ページの先頭に戻る