DESIGN REMARKS [デザインリマークス]

URLとhrefの比較で、現在ページのナビゲーションだけにスタイルを付ける方法

現在開いているページのナビゲーションにだけ、“今このページを見てるよ”ということを示すため、別のスタイルを付けることがよくあります。私は“ ステイ ” と呼んでいます。

私はこれを、「ステイを付ける」とか「ステイをかける」とか言いますが、正式な名称はあるのでしょうか。
今回は呼び方の問題ではなく、その設定をする方法についてです。

よくある方法は、ナビゲーションに付けたclassと<body>に付けたclassを比較し、一致していればそのナビゲーションにだけスタイルをかける方法です。

しかし、ナビゲーションが大量にある場合、1つ1つにclassを付けるのも手間ですよね。

そこで、ナビゲーションのhrefと現在のurlを比較して、一致していればスタイルを付ける、ということができれば、htmlには必要最低限の記述で実現できるのではないかと考えました。

まずはCSSでステイ時のナビゲーションのclassを作っておく

例えば、ナビゲーションのhtmlは下記の様なリストだとします。

<ul class="gnavi_list">
<li><a href="/news">NEWS</a></li>
<li><a href="/gallery">GALLERY</a></li>
<li><a href="/about">ABOUT</a></li>
<li><a href="/contact">NEWS</a></li>
</ul>

そして、以下の様なCSSを設定しておけば、現在のページのナビの<li>にclass=”now_here”が付けばいいということになります。
classが付けられたナビだけ、背景が黒で文字が白くなるようにしています。

/*urlとhrefが一致している場合*/
ul.gnavi_list li.now_here{
	background-color:#000000;
}
ul.gnavi_list li.now_here a{
	color: #fff;
}

JavaScriptでURLとhrefの比較をし、classを付与する

まずは、現在表示されているページのURL(パス)を取得します。以下の記述でpathという変数に代入します。

var path = location.pathname;

次に、ナビゲーションのリストを取得し、全ての<li>に対して、『<a>に設定したhrefの値と、先ほどのpathとを比較し、pathにhrefの値が含まれていれば、その<li>にclass=”now_here”を付ける』という指示を書きます。

var thelist = $("ul.gnavi_inner_list li");
thelist.each(function(){
	var link = $(this).find('a').attr('href');
	if(path.indexOf(link) > -1){
		$(this).addClass("now_here");
	}
});

ここでポイントとなるのが、path.indexOf(link) > -1 という記述です。

indexOfメソッドの詳細な使い方は割愛しますが、今回の書き方の場合、引数の文字列が含まれている場合には0以上の値を返します。含まれていない場合は-1を返します。
そのため、 path.indexOf(link) > -1と書けば、『URLの中にhrefの値が含まれている場合』というif文になります。

そして、.addClassメソッドで<li>にclass=”now_here”を与えるだけです。

まとめとして

JavaScriptの全文としては以下のようになります。

//↓現在ページのURL(パス)を取得
var path = location.pathname;
//↓ナビゲーションのリスト要素を取得
var thelist = $("ul.gnavi_inner_list li");
//↓全てのナビゲーションに対してこれを実行
thelist.each(function(){
    //ナビゲーションの中の<a>のhrefの値を取得
	var link = $(this).find('a').attr('href');
    //pathの中にhrefの値が含まれていればclassを付与
	if(path.indexOf(link) > -1){
		$(this).addClass("now_here");
	}
});

この方法が使える状況は限られていると思います。複雑なURLやパラメータを使っている場合などは使えないかもしれません。

状況に応じて色々な方法があると思いますが、手打ちでhtmlを書いていて、なおかつページ数が多い場合など(あまりない状況ですが)使えると思います。

モバイルバージョンを終了