CSSの小技として、普段は隠れているけどマウスカーソルを合わせると表示されるメニューを実現する方法です。
CSSには:hover擬似クラスなどが定義されており、これに依りマウスカーソルを合わせる事で表示/非表示を切り替える事が出来ます。
残念な事に、
では正常な動作は期待出来ないようですので、IEは7.0以降、ファイヤーフォックスは3.0以降と言う事にしましょう。
試しに、PC環境の
などでご覧の方は、以下の実験サイトにアクセスしてみてください。
それでは、実際にHTMLでのマークアップと、CSSでのスタイル定義を見てみましょう。
まず、ポップアップメニューを成すHTMLのマークアップは以下のようになります。
<ul id="MENU_NAVI"><li><p><a href="…">一列目のアンカー</a></p><ul><li><a href="…">一列目一行目</a></li><li><a href="…">一列目二行目</a></li>…</ul></li><li><p><a href="…">二列目のアンカー</a></p><ul><li><a href="…">二列目一行目</a></li><li><a href="…">二列目二行目</a></li>…</ul></ll>…</ul>
本当は定義リストにしたかったのですが、そうするとCSSの適用が巧く行かないので、このように箇条書きを二重にする形としております。
ポップアップメニューの本体である、<ul id="MENU_NAVI"> 要素は、HTMLの記述を考えると本文より後、フッタより前になると考えられます。
勿論、冒頭にメニューを書いても構わないのですが(その場合には直前に本文にスキップ出来るアンカーを設けておきましょう)、表示はCSSのポジショニングで対応する事としますので、問題はありません。
また、<ul id="MENU_NAVI"> 要素直下の <li>要素は各列の内容となります。
その中で、一番目の <p>要素が常に表示されるべき項目となります。
この <p>要素内のアンカーをポイントすると、二番目の <ul>要素の内容が表示されるようになるという訳です。
<ul id="MENU_NAVI">要素直下の<li>要素に纏めているのです。それでは、実際にこのHTMLがポップアップメニューとして機能するようにCSSを書いてみましょう。
/* メニューバー */ul#MENU_NAVI {position: absolute;top: 5em;left: 0;width: 100%;background: #040;color: #fff;font-size: 80%;margin: 0 0 0;padding: 0;height: 2em;/* 重要 */text-align: center;white-space: nowrap;}/* メニューバー内の各列 */ul#MENU_NAVI li {display: inline-block;width: 10em;vertical-align: top;list-style-type: none;margin: 0;padding: 0;}/* メニューバー内の各列の見出しアンカー */ul#MENU_NAVI li p {margin: 0;padding: 0.25em 0;/* 重要 */height: 1.5em;/* 重要 */}/* メニューバー内の各列の見出しアンカーのスタイル */ul#MENU_NAVI li p a:link,ul#MENU_NAVI li p a:visited {padding: 0;color: #fff;font-weight: bold;text-decoration: none;}/* 各列のポップアップされるメニュー部分のスタイル */ul#MENU_NAVI li ul {display: none;background: transparent;margin: 0;padding: 0 0 2em;white-space: normal;text-align: left;}ul#MENU_NAVI li ul li {display: block;list-style-type: none;margin: 0;padding: 0;background: #fff;}ul#MENU_NAVI li ul li a:link,ul#MENU_NAVI li ul li a:visited {display: block;margin: -1px 0 0;padding: 0.1em 0.2em;border: 1px solid #000;white-space: normal;color: #000;text-decoration: none;}/* ポップアップ時のスタイル */ul#MENU_NAVI li p:hover+ul,ul#MENU_NAVI li ul:hover {display: block;}/* IE 7 */*+html ul#MENU_NAVI li {display: inline;position: relative;left: 0;top: 0;}*+html ul#MENU_NAVI ul {position: absolute;top: 0;left: 0;margin: 2em 0 0;}/* IE 6 */* html ul#MENU_NAVI li {display: inline;}* html ul#MENU_NAVI ul {display: none;}
このスタイルのからくりですが、以下のようになります。
先ず、ポップアップするメニューバーとなる、<ul id="MENU_NAVI"> 要素セレクタについて、背景色などを指定して表示させたい位置にポジショニングします。
ここで大事なのは、バーの高さをしっかり決めておく事(heightプロパティ)。高さが曖昧だと、綺麗に表示されなかったり巧くポップアップメニューが機能しない事になります。
各列は <ul id="MENU_NAVI"> 要素直下の <li>要素となり、これらはインラインブロックで表示されるようにします(display: inline-block;プロパティ)。
<ul id="MENU_NAVI"> 要素直下の <li>要素の一番目の子要素である<p>要素となり、これについては固有のスタイルを決めておきます。各列のポップアップされるメニュー部分は <ul id="MENU_NAVI"> 要素直下の <li>要素の二番目の子要素である<ul>要素となります。
display: none; プロパティを与えておきます。親要素となる、<ul id="MENU_NAVI"> 要素直下の <li>要素はインラインブロックで表示させるようにしているため、見出しアンカーとなる直前の<p>の真下に表示されるようになりますので、あとは適宜上マージンを適切な値にして隙間が出来ないようにします。
尚、下にパディングを設けておりますが、これは手が滑ってポップアップさせたメニューからマウスカーソルが外れてもすぐに消えないようにするための措置です。
実際にポップアップしたときのスタイルは 普段非表示になっている(display: none; プロパティを与えられている)<ul>要素をブロックレヴェル要素として表示させるものとなります。
ここで、セレクタとして、以下の二つの状況を挙げておきます。
前者はポップアップさせるために必要です。
一方、後者はポップアップさせた後に当該メニュー上にマウスカーソルが移動したときの状態となります。
さて、CSSだけでもこんな事が出来る訳ですが、それにはCSS第二水準に完全に準拠していないといけません。
初めに解説した通り、平成21年10月16日現在、以下のブラウザはユーザ数が比較的多いブラウザですが、CSSだけでポップアップメニューを実現する事は出来ません。
これらの環境でもポップアップメニューを実現したいのであれば、JAVAスクリプトを用いてDOM操作を行わなければなりません。
実際にDOM操作を行う例については、DOMの表示スタイルへの応用内のCSSのみでポップアップメニューが実現出来ない環境への対策をご覧ください。