CSSのみでプルダウンメニューを実現してみます。
と、いうのも、
またもや、お仕事仲間である、
万年青年のルイス兄さんに、
javascriptなしでも、プルダウンできますよ。
とお伝えしたら、後日になって、
------------------------------------------------------------
やっぱりプルダウンメニューって
javascript併用やないと、IEで動かなかった。
------------------------------------------------------------
と、言われ、
へー、そーだったんですか、
と返事したものの…
職人としてこれでエエのか、
と思うところもあり、
都度都度、ふと思うあっても使うことがなかったのと、
あるお仕事で、メインナビゲーションをプルダウンにしてたら、
そのときのクライアントから、
分かりにくいとか、使いづらいとか、言われてヤメたこともあり…
それ以降は、他からも特に要望がなかったので、
ほったらかしにしていましたが、
他のCSSを説明するサイトを改めて見てみますと、
結構サンプルがあるようですし、
(今更ながら)遅れまじ、とも思いましたので
javascriptを使わずに、利用しやすい
究極(?)のプルダウンメニューに挑んでみました。
通常、プルダウンメニューをCSSで行う場合は、
子にあたるメニューの横幅や、
高さ幅を決めていることがほとんどですが、
その場合、
画像を利用したボタンなら大丈夫なものの、
テキストを使ったメニューでは、
横幅の制限がキツいと
メニューの文言を考えるのに、
結構難儀してしまうことがあります。
今回のミッションの目的は、
子メニューが下方向に伸びるのではなく、
横方向に伸び、かつ、サイズが可変できる、
(テキストでのメニューがつくりやすい)
ものをつくることです。
▽CSSベースのHTML
プルダウンメニュー
(子メニューは横並びでサイズ可変)
------------------------------------------------------------
今回はCSSに関する解説も
ソース内に入れ込んでみました。
------------------------------------------------------------
<例>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>CSSのみでプルダウンを実装してみる その1</title>
<style type="text/css">
<!--
/*
【01】
ページ内の文字サイズを、初期状態の83.3%に設定する。
*/
body{
font-size: 83.3%;
}
/*
【02】
ページ内の全ての<a></a>に対して、
ブロック要素(block)に変換
上下左右の間隔(margin)を文字の半分のサイズにする。
文字色をオレンジ色(#ff5500)にする。
文字の下線を消す。
*/
a{
display: block; margin: 0.5em; color: #ff5500; text-decoration: none;
}
/*
【03】
id="menubar" 内の全ての<ol></ol>は
間隔(margin)・余白(padding)を空けない
*/
div#menubar ol{
margin: 0px; padding: 0px;
}
/*
【04】
id="menubar" 内の全ての<li></li>は
右から順に横並び(float)
位置指定を相対で指定する。
リスト項目の先頭にビュレットを付けない。
間隔(margin)を空けない。
*/
div#menubar ol li{
float: left; position: relative; list-style: none; margin: 0px;
}
/*
【05】
id="menubar" 内の子供のメニューを格納する<ol></ol>は
横幅を600pxにする。
位置指定を絶対で指定する。
起点から左側は0px、上側は2文字分離す。
(通常は)隠しておいて見えなくしておく。(hidden)
*/
div#menubar ol li ol{
width: 600px; position: absolute; left: 0px; top: 2em; visibility: hidden;
}
/*
【06】
id="menubar" 内の全ての<li></li>にマウスが重なったとき、
背景を薄いピンク色(#eedede)に変更する。
*/
div#menubar ol li:hover{
background: #eedede;
}
/*
【07】
id="menubar" 内の全ての<li></li>と<a></a>にマウスが重なったとき、
文字の下線を表示する。
*/
div#menubar ol li:hover a:hover{
text-decoration: underline;
}
/*
【08】
id="menubar" 内の全ての<li></li>にマウスが重なったとき、
子供のメニューを格納する<ol></ol>を表示する。
*/
div#menubar ol li:hover ol{
visibility: visible;
}
/*
【09】
id="menubar" 内の
子供のメニューである<li></li>の背景色を
薄いグレー(#eeeeee)にする。
*/
div#menubar ol li li{
background: #eeeeee;
}
-->
</style>
</head>
<body>
<div id="menubar">
<ol>
<!-- menu01 -->
<li>
<a href="http://www.google.co.jp/" target="_blank">▼Google</a>
</li>
<!-- menu02 -->
<li>
<a href="http://www.yahoo.co.jp/" target="_blank">▼YAHOO!</a>
<ol>
<li><a href="#">○メニューA</a></li>
<li><a href="#">○メニューBB</a></li>
</ol>
</li>
<!-- menu03 -->
<li>
<a href="http://www.live.com/?searchonly=true&mkt=ja-jp" target="_blank">▼Live Search(MSN)</a>
<ol>
<li><a href="#">○メニューA</a></li>
<li><a href="#">○メニューBB</a></li>
<li><a href="#">○メニューCCC</a></li>
</ol>
</li>
<!-- menu04 -->
<li>
<a href="http://www.excite.co.jp/" target="_blank">▼excite</a>
<ol>
<li><a href="#">○メニューA</a></li>
<li><a href="#">○メニューBB</a></li>
<li><a href="#">○メニューCCC</a></li>
<li><a href="#">○メニューDDDD</a></li>
</ol>
</li>
</ol>
</div>
</body>
</html>
※id名やclass名は任意です。
------------------------------------------------------------
Mac Safari3.0, FF2.0
Windows IE7.0 FF2.0 で確認
------------------------------------------------------------
今回のポイントは
●<li></li>に疑似クラス「:hover」を設定していること。
→リンクの文字上だけだと、子メニューが選択しずらいので。
●親メニューの<li></li>にposition: relative; を 設定し、各左上を起点にするようにしていること。
→これにより、子メニューは、その各起点をもとに位置が設定されます。
です。
残念ながら、
子メニューを完璧な可変サイズには、
できませんでした。
【05】の
横幅を600px という部分がそれなのですが、
この記述を可変(例えば100%など)にすると、
子メニューは横ならびにならずに、下方向へ改行されて表示されます。
なので、
上記ソースを使う際は、作成されているデザインにあわせて、
子メニューに必要なサイズを求めるようにして、
600pxを適当な数値に変えてもらえたら、と思います。
また、float: left;を使って、横並びさせているので、
メニューの下のレイアウト表示が崩れる場合は、
適当にclear: left;をどこかに記述してください。
とりあえずは、このような結果でしたが、
さらに究極を目指して、研究していきたいと思います。
【MEMO】
単純に親メニューの下方向に、子メニューが並ばせる場合は、
【04】…floatの記述を削除
【05】…横幅の指定を削除、もしくは、小さめのサイズにする。
でいけます。
▽ ▽ ▽ ▽ ▽ ▽ ▽ ▽ ▽ ▽ ▽ ▽ ▽ ▽ ▽
簡単なHTMLを組めるようになったくらいで、
CSSに挑戦! という頃からお世話になってる本です。
タグ、CSSともに、項目別に整理が行き届いており、
簡単なサンプルがついているので、非常にわかりやすかったです。
なにより、
本のレイアウトがシンプルで見やすく、
読みやすいのがナイスです。
これで、開きっぱなしにできたら最高なんですけど…
最新版は、かなりボリュームがたっぷりで、
分厚くなったな〜 と思います。
まだ、この手のリファレンス本を
買われていない方がいらしたら、
購入検討されてはいかがでしょう。
△ △ △ △ △ △ △ △ △ △ △ △ △ △ △



