かわたま.net

Enjoy Creative! かわたまのwebメモ

【jQuery】マウスオーバーで画像をふわっとフェードで切り替えるsmart-crossfade.js実装方法

2013 December 22

Tag:

画像をマウスオーバーしたときにただぱっと切り替わるだけでも良いですが、ふわっとフェードで切り替わるようにsmart-crossfade.jsを実装してみました。
とっても簡単にできたので、使い方をメモします♪

>[2014.08.15]CSS3でふわっと切り替える方法の記事も書きました

手順↓↓

head内にjQueryをインポート

今回は、Google Hosted Librariesから引用します!

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script></script>
<script type="text/javascript" src="【jsを入れるディレクトリ】/smart-crossfade.js"></script>

同じhead内にsmart-crossfade.jsを読み込ませるタグも書きます。

画像を2枚用意します

同じサイズの、異なる2枚の画像を用意します。
今回はこの画像を使ってみます^O^

kawatama.net

kawatama.net

それぞれファイル名の末尾に”_on”,”_off”とつけます。

ex:cava_off.jpg、cava_on.jpg
※_offが通常表示される画像、_onのほうがマウスオーバーした時に切り替わる画像になります。

smart-crossfade.jsのソース

smart-crossfade.jsに下記を記載します。

function smartRollover() {
    if(document.getElementsByTagName) {
        var images = document.getElementsByTagName("img");

        for(var i=0; i < images.length; i++) {
            if(images[i].getAttribute("src").match("_off."))
            {
                images[i].onmouseover = function() {
                    this.setAttribute("src", this.getAttribute("src").replace("_off.", "_on."));
                }
                images[i].onmouseout = function() {
                    this.setAttribute("src", this.getAttribute("src").replace("_on.", "_off."));
                }
            }
        }
    }
}

if(window.addEventListener) {
    window.addEventListener("load", smartRollover, false);
}
else if(window.attachEvent) {
    window.attachEvent("onload", smartRollover);
}

// cross fade

new function(){
  function setRollOver2(){
    if(!document.images){return;}
    var imgs = document.images;
    var insert = [];
    for(var i=0;i<imgs.length;i++){
      var splitname = imgs[i].src.split('_off.');
      if((splitname[1])&&(imgs[i].parentNode.tagName=='A')){
        var rolloverImg = document.createElement('img');
        rolloverImg.src = splitname[0]+'_on.'+splitname[1];
        var alpha = 0;
        rolloverImg.currentAlpha = alpha;
        rolloverImg.style.opacity = alpha/100;
        rolloverImg.style.filter = 'alpha(opacity='+alpha+')';
        rolloverImg.style.position = 'absolute';

        addEvent(rolloverImg,'mouseover',function(){setFader(this,100);});
        addEvent(rolloverImg,'mouseout',function(){setFader(this,0);});

        insert[insert.length] = {position:imgs[i],element:rolloverImg};
      }
    }
    for(var i=0;i<insert.length;i++){
      var parent = insert[i].position.parentNode;
      parent.insertBefore(insert[i].element,insert[i].position);
    }
  }

  function setFader(targetObj,targetAlpha){
    targetObj.targetAlpha = targetAlpha;
    if(targetObj.currentAlpha==undefined){
      targetObj.currentAlpha = 100;
    }
    if(targetObj.currentAlpha==targetObj.targetAlpha){
      return;
    }
    if(!targetObj.fading){
      if(!targetObj.fader){
        targetObj.fader = fader;
      }
      targetObj.fading = true;
      targetObj.fader();
    }
  }

  function fader(){
    this.currentAlpha += (this.targetAlpha - this.currentAlpha)*0.2;
    if(Math.abs(this.currentAlpha-this.targetAlpha)<1){
      this.currentAlpha = this.targetAlpha;
      this.fading = false;
    }
    var alpha = parseInt(this.currentAlpha);
    this.style.opacity = alpha/100;
    this.style.filter = 'alpha(opacity='+alpha+')';
    if(this.fading){
      var scope = this;
      setTimeout(function(){fader.apply(scope)},30);
    }
  }

  function addEvent(eventTarget, eventName, func){
    if(eventTarget.addEventListener){
      eventTarget.addEventListener(eventName, func, false);
    }else if(window.attachEvent){
      // IE
      eventTarget.attachEvent('on'+eventName, function(){func.apply(eventTarget);});
    }
  }

  addEvent(window,'load',setRollOver2);

}

画像を表示したい箇所には“_off”を<a>タグで囲います。

kawatama.net

<a href="#"><img alt="altを入れましょう" src="【画像のディレクトリ】/画像の名前_off.jpg" width="piyo" height="piyo" /></a>

87行目の【30】の部分を変えるとフェードの時間が変わります。

setTimeout(function(){fader.apply(scope)},30);

数字を増やすとゆっくりになります。

これだけ!とっても簡単でした^O^

 

ちなみに、写真はカバのサングリアでした☆
見た目も可愛くってとっても美味しい〜^O^