cssのみのロールオーバーをなるべく手抜k…短く書きたい。
2008.11.4 火曜日
個人的メモ
メニューとかをcssのみでロールオーバーさせる処理、
キチンと書くとcssのコードがかなり長くなるので、どこまで削っても平気かなぁと。

とりあえず、こんな画像を用意。
cssのみではプリロードができないんで、ロールオーバー後の画像も全部繋げておいて、cssで位置ずらしながら表示。
- <ul id="sample_menu">
- <li><a href="#" id="sample_menu01" class="selected">メニュー1</a></li>
- <li><a href="#" id="sample_menu02">メニュー2</a></li>
- <li><a href="#" id="sample_menu03">メニュー3</a></li>
- <li><a href="#" id="sample_menu04">メニュー4</a></li>
- </ul>
HTML
- #sample_menu {
- width: 320px;
- height: 20px;
- }
- #sample_menu li {
- width: 80px;
- height: 20px;
- float: left;
- list-style:none;
- }
UL LIタグのスタイル。
サンプル用なので結構いい加減。
- #sample_menu li a {
- width: 80px;
- height: 0px;
- display: block;
- padding-top:20px;
- overflow:hidden;
- background-image: url(img/bar.png);
- background-repeat: no-repeat;
- }
Aタグのスタイル。
どうせ共通になる部分はこっちでまとめて書いて継承させる。
画像置換は、以前は「text-indent: -9999px;」とか使う事が多かったけど、
SEO的にどうよ?ってことで、今はこれ。
heightを0にして、高さ分のmargin-topを指定して文字を押しだし、「overflow: hidden;」で隠してる。
- a#sample_menu01 {
- background-position: 0px 0px;
- }
- /* ロールオーバー時は画像を上に20ピクセルずらす */
- a#sample_menu01:hover {
- background-position: 0px -20px;
- }
- /* class:selected時は画像を上に40ピクセルずらす */
- a#sample_menu01.selected, a#sample_menu01.selected:hover {
- background-position: 0px -40px;
- }
メニューの個別スタイル。
背景画像の位置を指定するだけ。
これを、background-positionの数値を変えながらメニューの数ぶん記述。
動作サンプル
上のコードでこんな感じに。
今のところ手元のブラウザでは問題なさげ。
2009.5.30 - 3:04 PM
こんにちは。
以前にこちらの記事を拝見し、この方法をお借りしてロールオーバーメニューを作りました。
しかしながら最近、I.E.7でctrlキー+マウススクロールで表示サイズを変更した場合、表示されないはずのaタグの文字が表示されてしまう事があるのに気が付きました。
試しにこのページも同様に拡大してみたところ、50%・60%・70%・190%の時にメニュー下に文字が現れるようです。
縮小に関してはあまり神経質になる事はないと考えていますが、うちのサイトの場合、拡大時にたくさんのサイズでこの現象が現れ、対処しないわけにいかないようですので、もしも対処法のヒントのようなものがあれば、教えていただければと思いました。
初めてなのに不躾なお願いではありますが、よろしくお願い致します。
2009.5.30 - 11:17 PM
>るる肉さん
コメントありがとうございます。
うーむ、すみません。
IEは6も7も見たと思ってたのですが、チェック漏れがあったのかも…?
家のマシンはWin7のIE8のみになってしまっており、IETesterやSuperPreviewでも再現できないようなので、
週明けに職場のテスト用の実機で改めて見てみます。
(IE8では問題無いようです)
IE7はXPでしょうか、Vistaでしょうか?
今回の件と関係があるかどうかは分かりませんが、VistaのIEでは、フォントの関係で、
aタグの画像置換等を行う際、cssでfont-sizeを小さくしておかないとはみ出して表示が崩れる、ということが時々起きていました。
2009.6.1 - 3:21 PM
Maroさん、こんにちは。
お返事ありがとうございます。
うちのI.E.7はXPです。
ちなみに、I.E.6の時にはこの現象はありませんでしたし、I.E.8のマシンでも問題ないようで、I.E.7に限った現象のようです。
全くのド素人で、うまく説明もできず申しわけありませんが、font-sizeは1pxにしても、問題は解決しませんでした。
2009.6.1 - 4:41 PM
>るる肉さん
報告ありがとうございます、
WinXPのIE7環境が無かったので未チェックでした…。
その環境を作り、それを含んだ他の環境でも見直してみましたが、
どうやらWinXPのIE7固有の問題のようですね。
ロールオーバー部分でなく、テキストの画像置換(テキストを隠して、背景に指定した画像のみを表示)の方のcssが引っかかってるようです。
スクロールすると出たり消えたりもするので、
overflow:hidden;
が上手く効いていないのかな…?と思って検索してみたら、どうやらビンゴみたいです。
IE7で td に指定した overflow:hidden が 画面の拡大縮小で無効になる
http://shironotes.blogspot.com/2009/03/ie7-td-overflowhidden.html
(今回の対象はTDではないですが、恐らく現象は同じかと思います)
cssやJSを扱うと、IEにはいつも泣かされますね…。
仕様もよく変わるし、バグも多いので。
IEでのCSSのバグを回避するhasLayout | コリス
http://coliss.com/articles/build-websites/operation/css/143.html
こちらを参考にして、この記事のcssにzoom:1;を入れてみましたが、それでもまだ発生してしまうようですね…。
画像置換にoverflow:hiddenを使用せずに、
<a><span>****</span></a>
のようにspanで挟んで、
a span {
display: none;
}
でテキストを消してやるのが堅いのかな…?(無駄なタグが増えますが)
元々、記事で使用してる画像置換は、
text-indentでテキストを飛ばす方法がよくないと言うことで、その代替の方法が色々と考えられてた中の一つなんです。
「css 画像置換」や「text-indent 9999px」などでググってみると、その他にもスマートな方法が色々出てくるので、一度参考にされてみるといいかもしれません。
2009.6.3 - 10:04 PM
本当にありがとうございました!!!
SOHO対策を考えてMaroさんのこの手法を使わせて頂いておりました。
とりあえずspanで囲んで対策をして、色々と調べたりしようと思っています。
家族の会社のホームページを立ち上げてまだ1年ちょっと・・・CSSだのJSだのあれこれ勉強すべき事が山積みですが、硬化した脳みそがついて行けません(笑)。
ウラウザごとにこんなに表示のされ方が異なるのも、最近まで知らなかったくらいで・・・。
今後も参考にさせて頂きます。
重ね重ねありがとうございました。