ヘッダーとかのナビゲーションで現在表示中のページを色を変えたりするのをカレント表示と言います。スマホではあまりナビゲーションが全て表示されている事はないけど、PC表示の時はけっこう使います。その方法をまとめました。
共通するのは、現在表示中のナビゲーション部分にCSSのclassを付与して、CSSで見た目を変えるイメージ
【共通HTML】
<ul class="nav"> <li class="current"><a href="/">HOME</a></li> <li><a href="/about.html">こだわり</a></li> <li><a href="/menu.html">メニュー</a></li> <li><a href="/company.html">店舗情報</a></li> <li><a href="/contact.html">お問い合わせ</a></li> </ul>
【CSS】
.nav li.current a { color: #f00; }
WordPressを実装してなくて静的なファイルの場合はjQueryで実装するのがてっとり早そう。
ヘッダー・フッターが共通ファイルじゃなかったら、個別にclassをつければいいんだろうけど、共通したheader.phpとかをつかってるなら、このやり方が一番簡単。
$(function() { $(‘.nav li a').each(function(){ var $href = $(this).attr('href'); if(location.href.match($href)) { $(this).parent().addClass('current'); } else { $(this).parent().removeClass('current'); } }); });
jQueryで現在表示中のページを判別して、.currentを付与してくれます。
しかし、こちらのコードだとなぜかTOPページで「<a href=”/index.html”>」などのファイル名までついてたら、問題なくclassが付与されたのですが、「<a href=”/“>」の書き方だとどのページでもTOPページにcurrentがついてしまう…。
<ul class="nav"> <li class="current"><a href="/index.html">HOME</a></li> <li><a href="/about.html">こだわり</a></li> <li class="current"><a href="/menu.html">メニュー</a></li> <li><a href="/company.html">店舗情報</a></li> <li><a href="/contact.html">お問い合わせ</a></li> </ul>
なので、別サイトから参考で「/」対応しているjavascriptのコードを試してみた。
$(document).ready(function() { if(location.pathname != "/") { $('.nav li a[href^="/' + location.pathname.split("/")[1] + '"]').addClass('active'); } else $('.nav li a:eq(0)').addClass('active'); });
こちらのコードなら、「/」の後ろのディレクトリで判断するので、問題なくclassが付与されました。
↓こんな感じ
<ul class="nav"> <li><a href="/" class="current">HOME</a></li> <li><a href="/about.html">こだわり</a></li> <li><a href="/menu.html">メニュー</a></li> <li><a href="/company.html">店舗情報</a></li> <li><a href="/contact.html">お問い合わせ</a></li> </ul>
WordPressの外観→メニューで表示させている場合は<li>部分に「current-menu-item」というclassが自動的に付与されるので、簡単です。
【HTML】
<ul class="nav"> <li class="current-menu-item"><a href="/">HOME</a></li> <li><a href="/about.html">こだわり</a></li> <li><a href="/menu.html">メニュー</a></li> <li><a href="/company.html">店舗情報</a></li> <li><a href="/contact.html">お問い合わせ</a></li> </ul>
※デフォルトだと他にも色んなclassが入りますが、省力しています。
WordPressでサイトを構築する場合は外観→メニューを使わず、直接header.phpとかにナビゲーションを書く時もあると思いますが、そういう時はif文で条件分岐をします。
<li<?php if(is_home()){ echo ' class="current"'; } ?>><a href="<?php echo home_url(); ?>">HOME</a></li> <li<?php if(is_page('about')){ echo ' class="current"'; } ?>><a href="<?php echo home_url(); ?>/about/">こだわり</a></li> <li<?php if(is_page('menu')){ echo ' class="current"'; } ?>><a href="<?php echo home_url(); ?>/menu/">メニュー</a></li> <li<?php if(is_page('company')){ echo ' class="current"'; } ?>><a href="<?php echo home_url(); ?>/company/">店舗情報</a></li> <li<?php if(is_page('contact')){ echo ' class="current"'; } ?>><a href="<?php echo home_url(); ?>/contact/">お問い合わせ</a></li>
(is_page(‘ ‘)の部分にスラッグ名で条件分岐させています。
もし、新着情報っていうナビゲーションボタンがあって、
・全カテゴリの新着ページ(ドメイン.com/news)
・各カテゴリのページ
・詳細ページ
と複数ページの場合と色んなページでもカレント表示させたい場合は、こんな書き方でもありかと。
<li<?php if ( is_category(array('category01','category02','category03')) || is_page('news') || is_single() ) { echo ' class="current"'; } ?>> <a href="<?php echo home_url(); ?>/news/">新着情報</a> </li>
あと、「works」ってカスタム投稿がナビゲーションにある場合は、アーカイブページ(一覧ページ)と詳細ページでclassを付与したいから
<li<?php ?php if( is_post_archive('works')|| is_singular('works') ) { echo ' class="current"'; } ?>>
って書き方をすれば、OK。