.welina design

画像置換を使わずにマウスオーバーボタンを作る

アンチテキスト飛ばしのための、マウスイベントボタン実装Tipsです。
これでわざわざCSSにa:overなど書かなくて済みます。ボタン画像の制作も楽々!

前回の記事にも書きましたが、「テキスト飛ばし」や「画像置換」がNGとなりつつあり、ナビゲーションメニューのマウスオーバーイベントをCSSで実装しづらくなりました。

まず下記のソースをご覧ください。


<ul id="nav">
     <li class="nav01"><a href="hoge.html" title="hogeへのリンク">hoge</a></li>
</ul>

たとえば、上記のようなHTML構造のナビゲーションを、ボタン画像にしたい場合に大抵の場合、通常時画像とオーバー時画像をマージした1枚画像を用意し、下記のようなCSSでテキストを飛ばして、ボタン画像を背景として配置しますよね。


ul#nav li.nav01 a {
     display:block;
     text-indent:-9999px;
}

ul#nav li.nav01 a {
     width:100px;
     height:50px;
     background:transparent url(/images/nav01.gif) 0 0 no-repeat;
}

ul#nav li.nav01 a:hover {
     background-position:0 -50px;
}

しかし、このようにテキスト飛ばしを使ってしまうと、SEO的にあまりよくありません。
ましてや、画像の読込みに失敗した場合などは、何も表示されなくなってしまいます。

そこで今回は、テキスト飛ばしを使わずに、<img>にクラス名をつけるだけで、マウスオーバーボタンを実装するTipsを紹介します。

必要なもの
  • jquery.js
  • 通常時のボタン画像
  • オーバー時のボタン画像(ファイル名に”_over”)を付与したもの
  • カレント状態のボタン画像(ファイル名に”_current”)を付与したもの
  • 今回実装するbtn.js

※ボタン画像のファイル名は、先頭を全て同一としてください。

例> 通常時の画像:nav001.gif
オーバー時の画像:nav001_over.gif
カレント時の画像:nav001_current.gif

次に、btn.jsを用意します


$j = jQuery.noConflict();

SITE = {
	basepath : '/',
	preloader : {
		loadedImages: [],
		load: function (url){
			var img = this.loadedImages;
			var l = img.length;
			img[l] = new Image();
			img[l].src = url;
		}
	}
};

$j(function(){
	$j('img.roll').each(function(){
		this.originalSrc = $j(this).attr('src');
		this.rolloverSrc = this.originalSrc.replace(/(\.gif|\.jpg|\.png)/, "_over$1");
		SITE.preloader.load(this.rolloverSrc);
	});
	$j('img.roll').not($j('.rollgroup .roll, .current .roll')).hover(function(){
		$j(this).attr('src',this.rolloverSrc);
	},function(){
		$j(this).attr('src',this.originalSrc);
	});
});

そしてHTMLを下記のようにすると、簡単に実装できてしまいます。


<ul id="nav">
     <li><a class="roll" href="hoge.html" title="hogeへのリンク"><img src="/images/nav01.gif" alt="hoge" /></a></li>
</ul>

<img>に”roll”というクラスを付与すると、マウスオーバーで”_over”が付いた、同一ファイル名の画像に差し代わるといった仕組みです。
こうすれば、もし画像が読み込めなかった場合は、代替えテキストが表示されますし、SEO的にも「テキスト飛ばし」よりも、よっぽどマシになります。

ただし、この方法の場合ですとJavascriptが使えない環境下で、画像が差し代わらなくなってしまうというリスクもあります。

ですが、Javascriptが使えない環境というのも、最近では少なくなってきましたし、仮にスクリプトが実行されなくても、ボタン画像もしくは代替えテキストが表示されるので、実装する価値はあるかなーと思います。

わざわざ、各イベント画像をマージさせて、SEOやユーザビリティを殺した方法を使うか。
それともJavascript非対応環境へのエクスペリエンスを無くすか。