Web制作の基本的な技術(?)であるロールオーバー(マウスポインタが乗ったら画像が入れ替わったり見た目が変わったりするアレです)の方法をまとめてみました。
無駄に文章が長いのはいつものことなのでやり方の部分以外は流し読みで構いません。オススメ度は独断と偏見と今日の運勢に基づいています。
方法1.CSSによる画像置換
オススメ度 ☆☆☆
画像置換とは、タグにCSSで背景画像を設定し、擬似クラスhoverで別の画像に差し替えることです。この場合タグの中に記入する文字はtext-indent:-9999pxで彼方に飛ばします。
a{
display:block;
text-indent:-9999px;
width:164px;
height:45px;
background:url(menu.gif);
}
a:hover{
background:url(menu_on.gif);
}
<ul>
<li><a href="#">メニュー</a></li>
</ul>
CSSでロールオーバーするためには:hoverを使う必要があります。
:hoverというのは何かというと「この要素にマウスポインタが重なったら(hoverは上に浮いている、というような意味です)」という条件設定です。こういうのを擬似クラスと呼ぶらしいです。何かニセモノ風の名前ですが気にしないようにしましょう。
ともかく、このクラスはIE6ではa要素にしか適用されないという制約があるので、わざわざa要素をブロック要素に変換して背景画像の操作をしているのです。
利点は、何と言ってもJavaScriptがオフになっていてもロールオーバーができる、ということです。もっとも、どれだけオフにしている人がいるかというと
このサイトの記事によれば1-2%ということなのであまり気にするような時代ではないのかもしれません。
もう一つのいい点は、動作がJavaScriptに比べて軽くて早いらしいです。あとはJavaScriptを覚えなくても使える、という点かも。(一番重要?)
良くないかもしれないところは、text-indent:-9999px;がもしかしたら検索エンジンでスパム扱いされ、ネガティヴに捉えられる(=検索の順位が下がる)可能性があるという、結構有名なウワサです。
これに関しても画像の内容と飛ばした文章の内容があまりにもかけ離れていなければそれほど問題ではないらしいです。この件については「text-indent:-9999px」で検索してみると色々と出てくると思います。ただ、いくら画面上に表示しないからと言って<a>タグの中に文字を何も入れないと隠しリンク扱いになるので、飛ばしてでも入れたほうがいいと思います。
方法2.CSSによる画像置換2
オススメ度 ☆☆☆☆
a {
display:block;
width:164px;
height:45px;
}
img {
border:none;
}
li {
list-style:none;
background:url(./menu_on.gif);
width:164px;
height:45px;
}
a:hover {
background-color:transparent;
}
a:hover img {
visibility:hidden;
}
<ul>
<li><a href="#"><img src="menu.gif" width="164" height="45" alt="メニュー"></a></li>
</ul>
上の改良版です。今度は画像を使うので怪しい「テキスト飛ばし」はやる必要がありません。
:hoverはIE6ではa要素にしか対応していないと書きましたが、このように「a要素経由でimgに設定する」のなら適用可能なようです。と言ってもCSSでは背景画像を変えることはできますがimg要素のsrc属性まで変えることはできないので、変更後の画像は予めli要素の背景画像として仕込んでおき、内側のimgをvisibility:hiddenで消すことで見えるようにします。background-color:transparent;をa要素のhoverに設定するのはIE6用に必要なようです。
さらに良いことには、予め仕込んで置くのでプリロード(ロールオーバー時にチラつかないようにするため前もって画像を読み込むこと)も兼ねているということです。
良くない点はちょっとCSSがややこしいというぐらい。
方法3.CSSによる透明度変更
オススメ度 ☆☆☆
マウスポインタが乗ったら微妙に透明度が変わります。そこまで派手な効果を期待しないならこれで十分かもしれません。
li {
list-style:none;
}
img {
border:none;
}
a:hover img {
opacity:0.8;
filter:alpha(opacity=80);
}
<ul>
<li><a href="#"><img src="menu.gif" alt="メニュー"></a></li>
</ul>
背景画像を操作するわけではないのでそのままimgタグを配置しています。
それで透明度を変える方法ですが、上のように
filter:alpha(opacity=80);
opacity:0.8;
とhoverクラスで指定します。内容的には同じで、透明度を80%にするという意味です。
なぜ2つ書くのかというと、IE8以前ではopacityというプロパティに対応していない代わりにフィルターと呼ばれる独自のものがあるからです。
この方法の良いところは全体的に一番コードが短いことと、差し替え用の画像を用意しなくていいところです。画像もないのでプリロードなども必要ありません。プリロードの方法はどこかでまた書きます。
あえて良くない点をあげるとすれば、W3Cバリデータにひっかかります。片方はCSS2.1で通るけれどもう片方は通らず、3.0で検証したらその逆になりました。
方法4.jQueryによる画像置換
オススメ度 ☆☆☆☆
結果は方法1と同じですがjQuery(JavaScriptライブラリ)を使用します。
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$('img').mouseover(function(){
$(this).attr('src','menu_on.gif');
}).mouseout(function(){
$(this).attr('src','menu.gif');
});
});
</script>
<ul>
<li><a href="#"><img src="menu.gif" width="164" height="45" alt="メニュー"></a></li>
</ul>
JavaScriptライブラリへのリンクと、ロールオーバーのためのコードが入るので多少長くなった印象があるかもしれません。最初のscriptタグの部分はそのままページ内のどこかに貼ります。普通はheadタグの中に記述することが多いです。実際にコードが書いてある方も外部ファイル化してリンクしたりしますが、ここではそのままHTMLファイルに記述しています。
そもそもライブラリとは何か、というとJavaScriptを強化して使いやすくするための補助プログラムのことで、上のようにリンクを貼るとjQuery専用の機能が使えるようになります。
わざわざJavaScriptを使わなくてもCSSで十分じゃないかと思うかもしれません。
しかしこれは、もうちょっと工夫をするとすごく便利になる可能性を秘めています。
$(function(){
$('img.rollover').mouseover(function(){
$(this).attr('src',$(this).attr('src').replace(/^(.+)(¥.[a-z]+)$/,"$1_on$2"));
}).mouseout(function(){
$(this).attr('src',$(this).attr('src').replace(/^(.+)_on(¥.[a-z]+)$/,"$1$2"));
});
});
<ul><li>
<a href="#">
<img class="rollover" src="menu.gif" width="164" height="45" alt="メニュー"></a></li>
</ul>
コードが相当複雑になりましたが、上のコードでどうなるかというと「class="rollover"に設定したimgタグは、全てマウスポインタが乗ると画像名に_onを追加した別の画像に置き換わる」というものです。
必要なことはオリジナル画像と、ロールオーバー用の_onをつけた画像を用意し、あとはクラスを設定するだけでいくら画面上に配置してもそれ以上コードを書き足す必要はありません。ロールオーバーしたい要素が多い場合に重宝します。
jQueryのコードそのものについての説明は割愛しましたが興味があるなら上記の本がオススメです。
方法5. JavaScriptを使う
オススメ度 ☆☆☆
玄人好みのあなたにオススメです。素人の僕が言ってもあまり説得力はありませんが。
<ul>
<li><a href="#"><img src="menu.gif" onmouseover="this.src='menu_on.gif'" onmouseout="this.src='menu.gif'" width="164" height="45" alt="メニュー"></a></li>
</ul>
一応、これだけで動きます。インライン形式でタグの属性に直接コードを書いているので短いです。ロールオーバーしたい要素が少ない場合にいいと思います。
けれども、これだとロールオーバーしたい要素の数だけ個別に画像ファイル名を変えてこの記述をしなくてはなりません。
そこで、さっきのように汎用コードを書くとすれば
<script type="text/javascript">
function imgChange(target){
var defaultImg = target.getAttribute("src");
var changeImg = defaultImg.replace(/^(.+)(¥.[a-z]+)$/,"$1_on$2");
target.setAttribute("src",changeImg);
}
function imgBack(target){
var defaultImg = target.getAttribute("src");
var changeImg = defaultImg.replace(/^(.+)_on(¥.[a-z]+)$/,"$1$2");
target.setAttribute("src",changeImg);
}
</script>
<ul>
<li><a href="#"><img src="menu.gif" onmouseover="imgChange(this)" onmouseout="imgBack(this)" width="164" height="45" alt="メニュー"></a></li>
</ul>
こんな感じになりました。
これはこのサイトに載っているコードと先程のコードを組み合わせて作ったものです。
このコードの場合はクラスの設定はしなくても大丈夫です。その代わり、ロールオーバーしたいimgタグにonmouseover="imgChange(this)" onmouseout="imgBack(this)"と書く必要があります。 この設定をした画像は同じように_onが末尾に追加された画像と入れ替わります。
長くなりましたが、同じ内容をタグに書けばいいので良いソフトを使っているのなら「検索/置換」で一発完了できるかもしれません。
方法6. Dreamweaverのメニューから作る
オススメ度 ☆
このソフトを持っている人は簡単に設定できるので作るの自体は楽だと思います。
しかし意味不明な長いコードが吐き出されるのでオススメはしません。見てみたい方は下のサンプルファイルを右クリックしてソースを表示してみてください。
こんなところでした。「まとめ」と言っている割には全ての方法を網羅したとはとても言い難いエントリーですが、よく使われるのはこんなところではないでしょうか。
特にjQueryを使えば可能性は色々と広がると思います。