意外とよく使うJavascript ロールオーバー
2008.8.5 火曜日(※googleさんのキャッシュから復旧)
小物系です。
ごくありふれたコードだけど、出番は多いので持っておくと便利だし、ってことで。
ロールオーバーイメージの動作自体は、DreamWerverの「スワップイメージ」で簡単に実装できるので、デザイナーさんとかはそっちを昔からよく使ってたけど、
HTMLのソースがかなり凄いことになるので、後で困ることが多いし…。
(ページ更新時、に挿入されたプリロードイメージが、使わなくなった画像の分まで残ったままになってたりとかよくある)
つうことで、なるべくHTML側のソースを汚さない形で作った物を使って貰ってます。
![]()
ページのロード時に、<img>タグにclass=”rollover”とつけてある物を抽出して、
ファイル名に「_on」がついた画像を裏でプリロード(事前読み込み)しておき、マウスオーバー時に画像差し替え。
(sample.gif→sample_on.gif sample.jpg→sample_on.jpg)
下記、jQuery併用版とスタンドアロン版があるけど、動きは全く同じ。
こうやって見比べると、jQueryとかってやっぱり便利だなぁって改めて実感…。
jQueryと併用版
他でjQuery使ってる場合とかは主にこっち。
使用方法
- <html>
- <head>
- <script language="javascript" src="jquery.js" type="text/javascript"></script>
- <script language="javascript" src="jquery.rollover.js" type="text/javascript"></script>
- </head>
- <body>
- <!-- マウスオーバー時にsample_on.gifに差し替え-->
- <img src="sample.gif" alt="test" class="rollover"></div>
- </body>
- </html>
スクリプト
- var preLoadImg = new Object();
- function initRollOvers(){
- $("img.rollover").each(function(){
- var imgSrc = this.src;
- var sep = imgSrc.lastIndexOf('.');
- var onSrc = imgSrc.substr(0, sep) + '_on' + imgSrc.substr(sep, 4);
- preLoadImg[imgSrc] = new Image();
- preLoadImg[imgSrc].src = onSrc;
- $(this).hover(
- function() { this.src = onSrc; },
- function() { this.src = imgSrc; }
- );
- });
- }
- $(function(){
- initRollOvers();
- });
スタンドアロン版
他のフレームワーク使ってて、jQueryとの併用はなるべく避けたい場合とか、
他にJSを使ってなくて、ロールオーバーの為だけにわざわざjQueryまで…とかそんな場合はこっち。
使用方法
- <html>
- <head>
- <script language="javascript" src="rollover.js" type="text/javascript"></script>
- </head>
- <body>
- <!-- マウスオーバー時にsample_on.gifに差し替え-->
- <img src="sample.gif" alt="test" class="rollover"></div>
- </body>
- </html>
スクリプト
- function initRollOvers() {
- if (!document.getElementById){
- return;
- }
- var preLoads = new Array();
- var allImages = document.getElementsByTagName('img');
- for (var i = 0; i < allImages.length; i++) {
- if (allImages[i].className == 'rollover') {
- var src = allImages[i].getAttribute('src');
- var ftype = src.substring(src.lastIndexOf('.'), src.length);
- var oSrc = src.replace(ftype, '_on'+ftype);
- //-- スワップ元、スワップ先画像の登録
- allImages[i].setAttribute('pSrc', src);
- allImages[i].setAttribute('oSrc', oSrc);
- //-- イメージのプリロード
- preLoads[i] = new Image();
- preLoads[i].src = oSrc;
- //-- イベントの設定
- allImages[i].onmouseover = function() {
- this.setAttribute('src', this.getAttribute('oSrc'));
- }
- allImages[i].onmouseout = function() {
- this.setAttribute('src', this.getAttribute('pSrc'));
- }
- }
- }
- }
- function addOnload(func){
- if ( typeof window.addEventListener != "undefined" ){
- window.addEventListener( "load", func, false );
- }else if ( typeof window.attachEvent != "undefined" ) {
- window.attachEvent( "onload", func );
- }else{
- if ( window.onload != null ){
- var oldOnload = window.onload;
- window.onload = function ( e ) {
- oldOnload( e );
- window[func]();
- };
- }else
- window.onload = func;
- }
- }
- addOnload(initRollOvers);
追記:2008/09/22
超暫定版!エム・アールデザイン ブログ » シンプルなコードでロールオーバーを実現する。様の方でトラックバックを頂き、そちらでの指摘で気がついたのですが、
先日データが飛んでgoogleキャッシュから復旧した際にソースが一部古くなっていたようです。
あとでコッソリ直していた、onloadのバッティングを回避する処理が無くなっていたので修正しました。