【JQuery】現在地を自動でハイライトする
※※※URLが変更となりました。
以前のURLはこちら (http://tam-tam.co.jp/tipsnote/javascript/post4875.html)
ブックマークをされている方はお手数ですが変更をお願いいたします。※※※
グローバルナビゲーションやサイドナビで、マウスオーバーとは別に現在地表示させたいときがあります。
クラスを追加してCSSで背景画像を置き換え、などはよく見るのですが
CSSではなくボタンの画像自体を置き換えたかったので作成しました。
(CSS置き換えもほぼ内容は変わらないので下に記述しました)
テンプレートでナビゲーションを一括管理している場合などにはすごく便利です。
(※注)このJavascriptは各フォルダのindexファイルのみに有効です。
(“test/”には有効ですが、“test/abc.html”などではハイライトされません)
コンテンツ構成は以下とします。
/css/common.css
/js/navi.js
/images/
/testA/index.html
/testB/index.html
/testC/index.html
/testD/index.html
【HTML】
今回はサイドナビゲーションのボタンを現在地表示したいと思います。
[sub_btn_a.gif] という通常の画像と、
[sub_btn_a_on.gif] という現在地用の画像を用意します。
<div id="subcontents">
<ul class="list">
<li><a href="/testA/"><img src="/images/sub_btn_a.gif" alt="A" width="193" height="56"></a></li>
<li><a href="/testB/"><img src="/images/sub_btn_b.gif" alt="B" width="193" height="54"></a></li>
<li><a href="/testC/"><img src="/images/sub_btn_c.gif" alt="C" width="193" height="54"></a></li>
<li><a href="/testD/"><img src="/images/sub_btn_d.gif" alt="D" width="193" height="54"></a></li>
</ul>
</div>
HTMLは特に変わったことはなく、普通にコーディングします。
【Javascript】
JQueryを読み込み、ナビゲーション用のJSを記述します。
//JQuery読み込み
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
if(location.pathname != "/") {
var $path = location.href.split('/');
var $endPath = $path.slice($path.length-2,$path.length-1);
//どこをハイライトするか
$('#subcontents ul.list li a[href$="'+$endPath+'/"]').addClass('active');
var ovName = "_on";
$("#subcontents ul.list li a.active img").each(function(){
var self = $(this);
//画像置換関数
var imgChange = function (elm,str1,str2){
elm.attr("src",self.attr("src").replace(new RegExp("^(\.+)"+str1+"(\\.[a-z]+)$"),"$1"+str2+"$2"));
}
$(function() {
imgChange(self,"",ovName);
});
});
};
});
↑をコンテンツに合わせて変更する点はおよそ2点、
//どこをハイライトするか
$('#subcontents ul.list li a[href$="'+$endPath+'/"]').addClass('active');
まずはこちら。
“#subcontentsのlistというクラスのついたul要素以下のリンク”
が現在表示されているページと同じであれば
Aタグにactiveというクラスをつけます、ということです。
導入したいサイトのマークアップに合わせて適宜変更してください。
var ovName = "_on";
$("#subcontents ul.list li a.active img").each(function(){
こちらは
“#subcontentsのlistというクラスのついたul要素以下のリンク”で
activeというクラスが付いている画像(=現在表示されているページ)
を var ovName で指定した文字列を付与して置き換えますよ、という部分です。
こちらもマークアップや画像のファイル名に合わせて変更してください。
ちなみに、画像ではなく、CSSで現在地表示をする場合は
Javascriptは以下になります。
<script type="text/javascript">
$(function() {
if(location.pathname != "/") {
var $path = location.href.split('/');
var $endPath = $path.slice($path.length-2,$path.length-1);
$('#subcontents ul.list li a[href$="'+$endPath+'/"]').addClass('active');
}
});
</script>
CSSにて
#subcontents ul.list li a.active {
<現在地のときのスタイル指定>
}
<動作確認済 ブラウザ>
windows:firefox3~12、IE6~9、chrome
mac:safari3、chrome、firefox12





