メニューなどに画像を設定し、マウスポインタを合わせる事で画像を変化させる効果は、多くのサイトで使われている言わば定番効果となっています。
そのような効果の実装では、現在でもMM_swapImageなどのJavaScriptを利用しているようなサイトが多く見られます。 メニューにマウスポインタを合わせる、あるいはクリックする事でサブメニューを表示するなど、他のエレメントと連携するような処理の場合には、やはりJavaScriptなどの利用が必要となりますが、 単に画像を変更するだけならば、HTML+CSSだけで行う事が可能です。
JavaScriptを利用した実装では、初期画像と切替後の画像を別ファイルとして用意し、初期画像をimgタグで指定します。 そしてマウスポインタが画像の範囲に入った時に、JavaScriptでimgタグのファイルソースを変更する事で画像切替を行うというのが、一般的な処理になります。 また、瞬時に切り替える為に切替後の画像は前もって先読みするような処理も行われています。
一方CSSでは、任意のエレメントの背景として画像を指定し、:hoverなどの動的な効果を与える事が出来る擬似クラスを利用して切替後の画像を表示します。
ここでは、CSSを利用して3パターンの実装を行います。
これはCSSを使った画像切替処理での基本パターンとも言える実装になります。
CSSでは背景画像として画像を使う場合に、画像の中で実際に表示される部分の指定が出来ますので、1つの画像ファイルに複数のイメージを混在させる事が可能になっています。 そこで、関連性のある一連の画像を1つの画像ファイルに纏める手法が広く使われています。
上の画像にマウスポインタを乗せる事で画像が変化します。 テキストでのリンクも設定してありますが、CSSで非表示(visibility: hidden)にする事でCSSが有効な環境では表示しません。これはCSS非対応環境用のリンクとして利用する為です。
画像ファイル自体は、このように2イメージを含んだものとなっています。
上記の例では画像に文字情報まで含んでいますが、画像を本来の背景としてのみ利用し、文字情報はテキストとして設定する事で、1つの画像ファイルを汎用的に利用する事も出来ます。
メニューに利用した場合のサンプルです。:hoverなどの擬似クラスでも通常のCSS定義と同様の設定をする事が出来ます。 画像ファイル使用時と比較した場合、フォントや文字サイズなどクライアント環境/設定に依存する要素が大きい為、想定通りの表示とならない場合があります。
3つのイメージを1画像ファイルにまとめて格納してあります。
こちらでは、CSS非対応環境でも表示されるように初期画像はimgタグで指定します。
CSS対応環境ではimgタグで指定した画像自体はCSSで非表示にし、実際に表示される画像は背景として設定された画像になります。 画像の切替は他の実装と同様に擬似クラスを利用して行っています。 一方、CSS非対応環境では、imgタグで指定された画像を表示するだけで、画像切替は行いません。
それぞれの状態用に2つの画像ファイルを用意します。モバイル系のブラウザで、転送速度/パケット量などを考え画像を取得しないようにしている場合や、 PC系ブラウザでも画像を非表示にしているような環境において、 画像の代わりに代替テキストを表示させるように対応した実装です。
CSS対応環境であるという前提がある為、 代替テキストをCSSで非表示にするような手法は使えませんので、記述が多少冗長になるという欠点があります。
このような場合において定番とも言える実装は、Gilder/Levin Methodと呼ばれる手法です。 position:relativeで基準位置設定したエレメントに代替テキストを記述し、 それをposition:absoluteと背景画像を設定した子エレメントで上書きするような記述になります。
Gilder/Levin Methodを元にした実装
ImgSwap
CSS対応で画像も表示する環境では、画像が表示されマウスポインタによる画像切替も行われますが、
CSS対応で画像を表示しない場合とCSS非対応環境では、代替テキストであるImgSwapが表示されます。
が、画像を表示する環境で透過画像を使った場合には、下の代替テキストが表示されてしまうケースがあります。
<a id="aImgNI_01" href="">ImgSwap<span></span></a> #aImgNI_01 { position: relative; display: block; width: 80px; height: 28px; overflow: hidden; } #aImgNI_01 span { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; z-index: 1; background: url(img/imgswap_2p.png) no-repeat top left; } #aImgNI_01 span:hover, a:hover#aImgNI_01 span { background-position: bottom left; }