AnimateImage は複数の画像をアニメーション GIF のように表示する JavaScript コード。
※ アニメーション機能を実現するスクリプトはいくつかあるが、要求に合ったものがなかなか見つからなかったため作成。
head 要素や body 要素などに以下のコードを記述して AnimateImage スクリプトを読み込む。
<script type="text/javascript" src="animateImage.js"></script>
Image1.png, Image2.png, … Image10.png をアニメーションさせる場合は次のように記述する。
<script type="text/javascript">
animateImage('Image[1-10].png');
</script>
※ animateImage() 関数では次のような項目を指定することができる。詳細は記述例や API 仕様を参照。
※ ImageAnimator オブジェクトを使用すると任意のタイミングでアニメーションを再生/停止/再開することができる。また Animations オブジェクトを使用するとすべてのアニメーションに共通する設定を変更することができる。詳細は記述例や API 仕様を参照。
※ Minify: 主にパフォーマンス向上のために JavaScript コードを最適化してサイズを小さくすること。具体的にはコメントや空白の除去、ローカル変数名の短縮などが行われる。
※ 一応 JavaScript 1.4 または JScript 5.0 (IE5) で動作するように実装しているつもりなので、古いバージョンの Web ブラウザーやほかの Web ブラウザーでも特に問題なく動作するはず。
※ v0.7 以降は仕様変更により v0.6.x 以前のバージョンとの互換性はなし。v0.6.x 系の仕様については Animate Image version 0.6.x 系の情報を参照。
アニメーション画像に 透過 PNG 画像を指定するとアニメーション GIF のように背景を透過することができる。デモではマウスホバーによって背景色が変更される。
アニメーション画像に 256 色 (GIF の最大色数) を超える高画質の写真やイラストを指定することができる。デモでは色数 24 bit の JPEG 画像を指定している。
アニメーション画像にファイル名が連番でない任意の画像を指定することができる。デモでは blank.png, website.png, blog.png, download.png ファイルを指定している。
アニメーションの再生/停止/再開を制御することができる。デモでは Start, Stop, Replay ボタンを押すとアニメーションが再生 (再開)、停止 (一時停止)、リプレイされる。
次のような画像ファイルをアニメーションさせる場合の記述例を紹介する。
画像タイトルを指定して複数のアニメーション。
animateImage('Foo[1-5].png', 'Image Foo');
animateImage('Bar[0-9].png', 'Image Bar');
animateImage('Baz[01-15].png', 'Image Baz');
※ 画像ファイルの連番は Image Foo は 1 から、Image Bar は 0 から、Image Baz は 01 から始まる。またアニメーション間隔はデフォルトの 0.5 秒、アニメーションの繰り返し回数はデフォルトの無制限となる。
すべて 5 枚の画像でアニメーションする。Image Foo のみ画像タイトルと ID 文字列を指定する。
animateImage('Foo[1-5].png', 'Image Foo', 'id-foo');
animateImage('Bar[0-4].png', '', null);
animateImage('Baz[01-05].png', null, null);
※ Image Bar では img 要素に空文字列の alt 属性 (img@alt="") が付加される (画像の代替テキストが不要なことを意味する)。Image Baz では img@alt, img@title は付加されない。また Image Bar, Image Baz では ID 文字列が自動生成される。
異なるアニメーション間隔と繰り返し回数でアニメーション。Image Bar はアニメーション終了時に最初の画像に巻き戻す。
animateImage('Foo[1-5].png', 'Image Foo', null, 1000, 5);
animateImage('Bar[0-9].png', 'Image Bar', null, 500, 10, true);
※ アニメーション終了時に Image Foo は最後の画像 (Foo5.png) のままとなるが、Image Bar は最初の画像 (Bar0.png) に巻き戻される。
アニメーション間隔 1 秒で 1 回だけアニメーションする設定。ただし Image Baz のみ 0.5 秒で無制限にアニメーションを繰り返す。
Animations.delay = 1000;
Animations.repeat = 1;
animateImage('Foo[1-5].png', 'Image Foo');
animateImage('Bar[0-9].png', 'Image Bar');
animateImage('Baz[01-15].jpg', 'Image Baz', null, 500, -1);
ファイル名が連番でない任意の画像を指定する。
var files = ['Foo1.png', 'Bar0.png', 'Baz01.jpg']; animateImage(files); animateImage(['Foo5.png', 'Bar9.png', 'Baz15.jpg']);
アニメーションの開始/停止/再開を制御する。アニメーションの繰り返し回数は 1 回で、その他の項目は指定しない。
var animator = new ImageAnimator('Foo[1-5].png', null, null, null, 1);
※ アニメーションの制御をボタンで行う場合は次のように記述する。
<input type="button" value="Start" onclick="animator.animate()" /> <input type="button" value="Stop" onclick="animator.stopAnimate()" /> <input type="button" value="Replay" onclick="animator.animate(true)" />
アニメーション画像にスタイル (CSS) を適用する。Image Bar は個別にスタイルを適用するため ID 文字列を指定する。
animateImage('Foo[1-5].png', 'Image Foo');
animateImage('Bar[0-9].png', 'Image Bar', 'id-bar');
共通のスタイルは class セレクタ (img.animation) を、個別のスタイルは id セレクタ (img#id-bar) を記述する。
img.animation {
border: solid medium silver;
}
img#id-bar {
border: dashed medium blue;
}
複数の画像をアニメーションさせる。
animator = animateImage(files, title, id, delay, repeat, rewind)
すべてのアニメーションに共通する設定。
※ animateImage() 関数呼び出し前に設定されている値が反映される。値を変更する場合はアニメーション開始前に設定しておく (開始後に値を変更しても参照されない)。
複数の画像のアニメーションを制御する。
ImageAnimator(files, title, id, delay, repeat, rewind)
※ 引数の仕様については animateImage() 関数を参照。
アニメーションを再生 (開再)する。
引数 replay が true の場合やアニメーション終了後に呼び出した場合は、アニメーションが最初の画像から再生 (リプレイ) される。
アニメーションを停止 (一時停止) する。
画像表示系の JavaScript で Web 標準に準拠した (妥当な) HTML を記述するにはを参照。
AnimateImage と同じように複数の画像を GIF アニメーションのように表示できる JavaScript ライブラリ。探せばほかにもあると思うがなかなか見つからない。
画像関連のアニメーション規格にはいくつかあるが、未だにアニメーション GIF が主流となっている。多くの Web ブラウザーに対応し、かつ 256 色を超える画像をアニメーションするには、AnimateImage のように JavaScript を利用する方法が現実的な代替手段といえる。
いただいたコメントは大変参考になります。ここまで読んでいただきありがとうございました。
※ なかなかスマートな実装が思いつかないので対応保留。とりあえずアニメーションする画像を調整して運用する。(最初/最後の画像を重複させる、空白の画像を最後にするなど)
"keyboard keys" by chromatix is licensed under Creative Commons License.
はじめまして。
PNGアニメのできるjQueryを探していたところこちらにたどり着きました。
大変助かりました。ありがとうございます!
こんなに簡単にできてしまうなんて感動です。
ひとつ質問させていただきたいのですが、「アニメーションが一度終了したのちに、一定時間後に再生を再開する。(これをループ)」という動作をさせたいと思い、以下のように書いてみたのですが、うまくいきませんでした。もしかしてかなりトンチンカンな事をしているのかもしれません。このような動作をさせるにはどのようにしたら良いのでしょうか?
function test(){
animateImage('sample[01-10].png', 'sampleanime', null, 100, 1); setTimeout("test()",3000);
}
このページ内のMEMOにお書きになっている「最初/最後の画像で一時停止してからアニメーションする (pauseAtFirst/Last)」との表記がもしかして関係あるのでしょうか?いきなりの質問で大変恐縮ですが、お分かりになりましたらお答え願えませんでしょうか?よろしく御願いいたします。
コメントありがとうございます。attosoft です。
こちらこそご利用いただけて大変うれしいです。
希望のアニメーション動作を具体的にリストで表すと、次のような動作でしょうか。
アニメーション動作を制御したい場合は ImageAnimator オブジェクトを利用します。たとえば今回のような動作であれば、次のようなコードになると思います。
var animator = new ImageAnimator('sample[01-10].png', 'sampleanime', null, 100, 1); function test(){ animator.animate(); setTimeout("test()", 3000); } test();ちなみにというのは、もしかしてアニメーション画像が次々と挿入されていく現象のことでしょうか。これは animateImage() 関数を同じ ID で複数回呼ぶと、重複しない ID 文字列の生成処理が行われるのが要因です。(バグではありません)
MEMO にあるのは思いついた機能の候補ですので直接的には関係しません。またどちらかと言えば関連性があるのは「アニメーションサイクル間の遅延時間 (cycleDelay)」になります。AnimateImage に cycleDelay が実装されれば、アニメーションとアニメーションの間隔に任意の時間を指定できるため、今回のような動作を簡単に実現することができる、ということになります。
attosoftさま
回答ありがとうございます!
こんなに丁寧に書いていただけるなんて感激です。
提示していただいたコードで理想の動作がしっかり実現できました!
勉強にもなりました。
まだまだ初心者。勉強しなければダメですね。
※「うまくいきませんでした」というのは、PNGアニメ自体が表示されなくなってしまった状態でした。
いきなりの質問に貴重な時間を割いてお答えいただき、本当にありがとうございました。AnimateImage、これからも愛用させていただきます。
それでは。
無事に解決したようで何よりです。
作成したスクリプトが多少なりとも役に立っていると思うと、非常に嬉しく思います。
原因はなんでしょう…。test() 関数を呼び出していないから、なんてことはないですよね。
>原因はなんでしょう…。test() 関数を呼び出していないから、なんてことはないですよね。
問題は解決したものの、勉強のためにいろいろ試してみようと思い、最初に試したものを引っ張ってきたのですが、以下になります。この時点では「test() 関数を呼び出していない」という事になってしまっているようですね。(汗)
function test(){
animateImage('sample[01-10].png', 'sampleanime', null, 100, 1); setTimeout("test()",3000);
}
しかし以下で試したところ、ページ自体が白紙の状態になってしまいました。
function test(){
animateImage('sample[01-10].png', 'sampleanime', null, 100, 1); setTimeout("test()",3000);
}
test();
うーん、原因不明ですね。私の環境 (IE, Chrome, Firefox, Opera, Safari) では、上記コードで一応 (初回の) 画像アニメーションが行われますけど。(前述のコメントのように animateImage 関数は同じ ID による複数回呼び出しを想定していないため、初回以降のアニメーションには問題あり)
ちなみに細かいことになりますが setTimeout 関数では文字列 "test()" を渡すのではなく関数オブジェクト test を渡した方が適切です。
はじめまして!とてもわかりやすく、素敵なページ、勉強させていただいております。
AnimateImageを使わせていただき、動作確認をしていたところ、
連続する画像が8枚以上だとエラーがおきてしまいました。。。
7枚までですと正常に動きます。
改変した部分は、秒数と、img 要素の書き込み(下記部分)のみです。
———————————-
// img 要素の書き込み
var imgElem = '<img id="' + id + '" src="' + anim.images[0].src + '"' + 'width="200"' ;
———————————-
7枚と8枚の差は何なのでしょうか・・・
お手数ですがご教授いただけますと幸いです。
コメントありがとうございます。attosoft です。
具体的にはどのようなエラーでしょうか。
現象およびエラーメッセージが分からないので推測になりますが、次のような原因が考えられます。
animateImage.js を改変しているとのことですが、改変していない状態で動作確認してみてください。正常に動作するのであれば改変部分に、エラーとなる場合は画像に問題がある可能性があります。
そもそも animateImage.js を改変する必要はあるのでしょうか。
秒数の変更と width 指定のみであるならば、次のようなコードを書いて、
CSS で次のようなスタイルを指定すれば改変不要になりますよね。
img.animation { width: 200px; }※ ちなみに改変部分ですが、width 属性の前にスペースがないので不正な HTML となってしまいます。
attosoft 様
こんにちは、先日質問させていただきましたbabiと申します。
お返事ありがとうございます!!とても丁寧な解説、勉強になります。
確かにjs側で画像サイズを指定する意味はないですね、、失礼いたしました、cssで調整することにして、jsは改変せずに使用させていただきました。
ですが、やはり8枚以降になると動作しませんでした。。
他のjsが競合になっているのかな?と思い、animateImage.jsのみと、画像、htmlのみで実験してみましたが、8枚以上になるとページが生成されません。
エラー文言も出てこず、画像を他のものに差し替えてもだめでした。。。
ちなみに、実験時のファイル内容は以下の通りです
※jsは秒数含め改変一切なし
html
———————————-
テスト
animateImage('画像パス[01-08].gif');
———————————-
上記の記述で、画像パス[01-07].gif までだと正常に動きます。。
jsエラーが起きないので、何が問題なのかわかりません。。何かhtml記述に間違いがあれば、教えていただけますと幸いです。
あ、すみません、、上記にhtmlコードを書いたのですがコメント欄にはソース反映されませんね。。
———————————-
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>テスト</title>
<script type="text/javascript" src="animateImage.js"></script>
</head>
<body>
<script type="text/javascript">animateImage('画像パス[01-08].gif');</script>
</body>
</html>
———————————-
こちらで表示されますでしょうか。。
あ、原因分かりました。AnimateImage スクリプトのバグでした。色々と時間を無駄にさせてしまってすみません。
連番が "0" で始まっていると 8 進数と解釈されるため "08", "09" は "0" と評価されていました。問題を修正した version 0.8.0.3 に差し替えましたので、正常に動作するかご確認ください。
※ version 0.8.0.3: parseInt 関数に明示的に基数 10 を指定
attosoft 様
8進数!そうだったのですね!すぐにわかるなんてすごい!!
迅速なご対応、ありがとうございます、更新されたjsに差し替えましたところ、正常に動作しました!
素敵なコードを提供くださり、ほんとうに助かっております。勉強させていただきます。
本当にありがとうございました!!
問題が解決されたようで良かったです。AnimateImage スクリプトのバグだったのに、余計なお手間を取らせてしまいすいませんでした。
attosoft 様
はじまして。今回こちらのjsを使用させていただかこうかと考えているのですが、アニメーションを繰り返さずに1回にして、アニメーション終了時のイベントを取得することは可能でしょうか?
こちらがやりたいこととしては、アニメーション終了後に別の全くアニメーションを動かすことになります。もし簡単に終了イベント等取る方法がありましたらご教授いただけたらと思います。
コメントありがとうございます。attosoft です。
AnimateImage の API 仕様はこのページに記載してある通りですので、残念ながらイベントには対応していません。イベントの仕組みを利用したい場合は、そのように改変する必要があります。(改変と言ってもイベントハンドラを呼び出すだけですが)
あるいは希望のアニメーションが「アニメーションA → アニメーションB → 終了」であるならば、アニメーションA とアニメーションB の画像ファイルからなる配列を生成して引数 files に指定する方法が一番簡単だと思います。
Great script… I'm using this script for my presentation…
Thanks for using AnimateImage script, and sorry for late reply.
Your comment will help encourage me to support software development.