文字のフェードとズーム

Fade In Fade Out

'color' property: This property describes the foreground color of an element's text content.

解説

これは文字のフェード効果のサンプルです
Fade Inの文字をクリックすると文字が浮き出てきます
本来ならフェード効果は透明度を変更したいところですが、 残念ながら透明度( opacity )は W3C CSS2 では定義されていないためブラウザ依存となります
そのため、このサンプルは style の colorプロパティを変更して行っています

スクリプトは技術的には簡単なものになりますので、 ここでは多少の応用ができるように汎用化したコードで示します

■JavaScript(汎用部分)


// ステップ制御オブジェクト
function Stepper(idn,do_func,vs,ve,steps,end,interval) {
  this.id      = idn;      // 対象要素のID名
  this.do_func = do_func;  // ステップ実行関数
  this.vs      = vs;       // 開始オブジェクト
  this.ve      = ve;       // 終了オブジェクト
  this.steps   = steps;    // ステップ数
  this.end     = end;      // 終了関数
  this.interval= interval; // インターバル時間
}
Stepper.prototype.element = null; // 対象要素のオブジェクト
Stepper.prototype.step    = 0;    // 現在のステップ
Stepper.prototype.out     = 0;    // 動作方向( in = 0, out = 1 )
Stepper.prototype.tid     = null; // タイマオブジェクト
// ステップ実行メソッド
Stepper.prototype.do_step = function(out){
  this.out = out;
  var nstp = out?(this.step-1):(this.step+1);
  if(nstp<0         ) nstp = 0;
  if(nstp>this.steps) nstp = this.steps;
  if(nstp == this.step){
    if(this.end) this.end(out);
    return 1; // 完了
  }
  if(    this.element
     || (this.element=document.getElementById(this.id)))
  {
    this.do_func(out,nstp);
  }
  this.step = nstp;
  return 0;   // 継続
}
// 終了関数呼び出しメソッド
Stepper.prototype.call_endcallback = function(){
  if(this.end) this.end(this.out,this.ed_cd);
}
// 動作停止メソッド
Stepper.prototype.cancel = function(){
  if(this.tid){
    clearTimeout(this.tid); this.tid=null;
    this.call_endcallback();
  }
}

Stepperオブジェクトは steps で指定された回数だけ do_func で指定した関数を呼び出し、 最後に end で指定した関数を呼び出すだけの機能を持つオブジェクトで、 特にカスタマイズ項目はありません

■JavaScript(共通部分)


// 終了関数
function end(out){
  if(out && this.element)
    this.element.style.visibility = 'hidden';
}
// 開始関数
function start(out,id){
  if(!out)
    document.getElementById(id).style.visibility = 'inherit';
}
// 実行関数
function manage(n,out){
  var obj = objs[n];
  var fin = obj.do_step(out);
  obj.tid = fin?null:setTimeout('manage('+n+','+out+')',obj.interval);
}
// 終了関数
function closure(){
  for(var i=0; i<objs.length; i++){
    var obj = objs[i];
    if(obj.tid){ clearTimeout(obj.tid); obj.tid=null; }
  }
}
// 開始関数
function action(n,out){
  if(!document.getElementById) return;
  var obj = objs[n];
  obj.cancel();
  start(out,obj.id);
  manage(n,out);
}

この関数群は汎用的ではありませんが、 フェード効果のように開始から一定時間繰り返し呼び出す動作を行う上で共通的な手続きを行います

ここで言う共通的な手続きとは以下の処理を指します

■JavaScript
この文字はカスタマイズ項目です


// Stepper オブジェクトの定義
objs = new Array(
  new Stepper('fade',do_fade,    // 要素名と実行関数
    new Array( 0x33,0x99,0x66 ), // 開始時の色
    new Array( 0xd1,0xf1,0xcd ), // 終了時の色
    10,                          // ステップ数
    end,                         // 動作完了時に呼び出す関数
    100)                         // インターバル時間( msec )
  );
// 色値計算関数
function calc_color(v1,v2,n,i){
  return Math.floor((v2-v1)/n*i+v1);
}
// フェード実行関数
function do_fade(out,nstp){
  var r = calc_color(this.vs[0],this.ve[0],this.steps,nstp);
  var g = calc_color(this.vs[1],this.ve[1],this.steps,nstp);
  var b = calc_color(this.vs[2],this.ve[2],this.steps,nstp);
  this.element.style.color = 'rgb('+r+','+g+','+b+')';
}

フェードインの実行は action 関数を引数 (0,0) で呼び出し、 フェードアウトの実行は (0,1) で呼び出します

このスクリプトは以下の構成の HTML を前提としています

■前提とする HTML要素

<p id="fade">fade string</p>

同様にズームイン・アウトする場合は以下の様にします

Zoom In Zoom Out

Zoom

■JavaScript
この文字はカスタマイズ項目です


// Stepper オブジェクトの定義
objs = new Array(
  new Stepper('zoom',do_zoom, // 要素名と実行関数
    9, 72,                    // 開始と終了時の文字サイズ( pt )
    20,                       // ステップ数
    end,                      // 動作完了時に呼び出す関数
    100),                     // インターバル時間( msec )
  );
// ズーム実行関数
function do_zoom(out,nstp){
  var fs = (this.ve-this.vs)/this.steps*nstp+this.vs;
  this.element.style.fontSize = Math.floor(fs)+'pt';
}

■前提とする HTML要素

<div id="zoom">Zoom string</div>

コードは示しませんが、フェードとズームを合わせるとこんな風になります

Fade and Zoom In Fade and Zoom Out

Fade and Zoom

注意とヒント

●このスクリプトは IE5.5, IE6, Mozilla1.4, Opera7.03( 以上 Windows ), Safari1.0, IE5.2( 以上 Mac 10.2 ), Konqueror3.1, Opera7.20 Beta7( 以上 RedHat 9 ) で確認しています
これより古いバージョンのブラウザでは正常に動作しないかもしれません

●旧ブラウザや JavaScript オフのブラウザを考慮すると スタイルシートでの定義では対象要素は初期状態で見られるようにし、 JavaScript で実行可能か判断したのち visibility:hidden の設定を document.write で 上書きした方が良いかもしれません

●ここで紹介したスクリプトは対象要素のインラインスタイルを変更する方式なので 同種のスタイルが指定されている子要素に対しては無効になります
このような場合は全要素のインラインスタイルを変更するか、 クラスの変更で適用されるスタイルを切り替えるか、 スタイルシート自体を直接変更するなどの方法を用いる必要があります