CSS3で作るナビゲーション
CSS3で作るタブメニュー
今回は、前回のWEBパーツに続き、これまで紹介してきたCSS3の機能を使ってナビゲーションパーツを作成してみましょう。まずは、図 1のような、タブ型ナビゲーションの作り方を紹介します。タブ画像を並べたようなデザインですが、テキストはWebフォント、グラデーションはlinear-gradient、角丸はborder-radiusで指定し、CSSだけで実装したサンプルになります。
図1:タブ型ナビゲーション(クリックで拡大) |
HTMLは以下のようになります。
[リスト01]HTMLソース(tab01.html)
<head> ~中略~ <link href='http://fonts.googleapis.com/css?family=Terminal+Dosis:800' rel='stylesheet' type='text/css' /> <link rel="stylesheet" type="text/css" href="css/tab.css" /> </head> <body class="tab01"> <ul id="nav"> <li><a href="tab01.html">Tab01</a></li> <li><a href="tab02.html">Tab02</a></li> <li><a href="tab03.html">Tab03</a></li> </ul>
head内で指定している外部参照のCSSファイルは、GoogleWebFonts(http://www.google.com/webfonts)で提供されているWebフォント(Terminal Dosisの極太)を使用するためのものです。
ナビゲーションで現在位置を表現できるよう、body要素にはclass属性でCSSシグネチャを付けています。ナビゲーションはul要素でマークアップし、navというID名を付けています。HTML5でマークアップしていますが、現状では新要素を認識しないブラウザもあるため、ここではナビゲーションのための新要素「nav」は使用していません。
共通のスタイルを指定する
まずは、スタイリングしやすいように、ul要素やli要素のデフォルトスタイルをリセットしておきましょう。margin、paddingを0に、リストマーカーも不要なのでlist-style-typeプロパティを指定します。続いて、floatプロパティを指定して横並びに配置し、font-familyプロパティでWebフォントを適用します。
[リスト02]CSSソース(tab.css)
#nav { margin: 0; padding: 0; list-style-type: none; } #nav li { margin: 0; padding: 0; float: left; font-family: 'Terminal Dosis', sans-serif; }
a要素には、カーソルホバー時と通常時に共通したスタイルを指定しておきましょう。幅を指定できるように、displayプロパティでブロックレベル表示にするのがポイントです。
[リスト03]CSSソース(tab.css)
#nav li a { display: block; /* ブロックレベル表示に */ width: 150px; /* 幅を150pxで固定 */ margin-right: 1px; /* 右側に1pxのマージン */ text-align: center; /* テキストを中央揃え */ text-decoration: none; /* 下線を表示しない */ border-radius: 10px 10px 0 0; /* 角丸 */ }
これでリンクテキストの共通部分のスタイル指定ができました。
通常時のスタイルを指定する
続いて、通常時のリンクスタイルを指定しましょう。通常時は、背景がグリーンのグラデーションです。各ブラウザ用にグラデーションの指定が複数個あります。自分で書くと大変そうですが、以前紹介したCSS3ジェネレーター(http://css3generator.com/)を利用すれば、IEを含むほとんどのブラウザに対応したコードを自動生成してくれます。
[リスト04]CSSソース(tab.css)
#nav li a:link, #nav li a:visited { ~中略~ background: #cdeb8e; /* Old browsers */ background: -moz-linear-gradient(top, #cdeb8e 0%, #a5c956 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#cdeb8e), color-stop(100%,#a5c956)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, #cdeb8e 0%,#a5c956 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #cdeb8e 0%,#a5c956 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, #cdeb8e 0%,#a5c956 100%); /* IE10+ */ background: linear-gradient(top, #cdeb8e 0%,#a5c956 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cdeb8e', endColorstr='#a5c956',GradientType=0 ); /* IE6-9 */ }
さらにグラフィカルになるよう、背景色に合わせた暗めのグリーン(#669933)を、borderやtext-shadowに指定します。
[リスト05]CSSソース(tab.css)
#nav li a:link, #nav li a:visited { ~中略~ border: 1px #669933 solid; text-shadow: 1px 1px 3px #669933; }
ホバー時、アクティブ時のスタイルを指定する
同様にホバー時、アクティブ時のスタイルを指定します。背景をオレンジのグラデーションにし、borderとtext-shadowに濃い目のオレンジ(#ff9900)を指定します。
[リスト06]CSSソース(tab.css)
#nav li a:hover, #nav li a:active { ~中略~ background: #ffc578; /* Old browsers */ background: -moz-linear-gradient(top, #ffc578 0%, #fb9d23 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffc578), color-stop(100%,#fb9d23)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, #ffc578 0%,#fb9d23 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #ffc578 0%,#fb9d23 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, #ffc578 0%,#fb9d23 100%); /* IE10+ */ background: linear-gradient(top, #ffc578 0%,#fb9d23 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffc578', endColorstr='#fb9d23',GradientType=0 ); /* IE6-9 */ border: 1px #ff9900 solid; text-shadow: 1px 1px 3px #ff9900; }
transitionでアニメーションを指定
最後に、ホバー時に拡大表示されるよう、図2のようにマージンとパディングの値を指定します。また、transition-durationプロパティで、通常時からホバー時へのスタイルが0.3秒で変化するように指定します。
図2:マージンとパディングの指定(クリックで拡大) |
[リスト07]CSSソース(tab.css)
#nav li a:link, #nav li a:visited { ~中略~ margin-top: 10px; padding: 10px 0; -webkit-transition-duration: 0.3s; -moz-transition-duration: 0.3s; -o-transition-duration: 0.3s; transition-duration: 0.3s; } #nav li a:hover, #nav li a:active { ~中略~ margin-top: 0; padding: 15px 0; }
ナビゲーションで現在位置を示す
ナビゲーションメニューで現在位置を示す表現として、ホバー時、アクティブ時と同じスタイルを適用することにしましょう。ここでは、body要素に付けたCSSシグネチャとnth-child()で、現在位置のセレクタを指定しています。例えば、body class="tab01"のページの場合、ul#navの1番目の子要素liが、現在のカテゴリになります。
これまではそれぞれのli要素に「class="nav01"」や「class="nav02"」といったクラス名を付け、「.tab01 #nav li.nav01」というようなセレクタで制御するのが一般的でした。しかしCSS3を使えば、「.tab01 #nav li:nth-child(1)」というセレクタで「Tab01」のスタイルを制御でき、li要素に付けるクラス名は不要になります。
[リスト08]CSSソース(tab.css)
#nav li a:hover, #nav li a:active, .tab01 #nav li:nth-child(1) a, .tab02 #nav li:nth-child(2) a, .tab03 #nav li:nth-child(3) a { ~ホバー時、アクティブ時、現在位置を示すスタイル~ }
「CSS3で作るナビゲーション」サンプルプログラム