var _gaq = _gaq || []; _gaq.push([\'_setAccount\', \'UA-13211647-1\']); _gaq.push([\'_trackPageview\']); (function() { var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true; ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\'; var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s); })();
Wish to be a programmer rather than a coder
AnimateImage は複数の画像をアニメーション GIF のように連続表示する JavaScript ライブラリ。
※ アニメーション機能を実現するスクリプトはいくつかあるが、要求に合ったものがなかなか見つからなかったため自分で作成。
head 要素や body 要素などに以下のコードを記述して AnimateImage スクリプトを読み込む。
<script type="text/javascript" src="animate-image.min.js"></script>
images フォルダー内の 1.png, 2.png, … 10.png をアニメーションさせる場合は次のように記述する。
<img src="images/1.png" data-files="[1-10].png" />
あるいは、JavaScript 内から AnimateImage を利用する場合は次のように記述する。
<script type="text/javascript"> AnimateImage.animate('images/[1-10].png'); </script>
アニメーション可能な画像ファイルは以下の 4 種類。
アニメーションをカスタマイズするためのオプションは 15 個以上。
さらに JavaScript コードを記述すると次のようなことができる。
※ animate-image.min.js はコメントや改行、不必要な空白などの削除によりファイルサイズが縮小されている。またローカル変数や関数の引数の名前は短縮されている。一方で animate-image.js は読みやすいように整形されているほか、ドキュメンテーションコメントが JSDoc スタイルで記述されている。
※ 一応 JavaScript 1.4 または JScript 5.0 (IE5) で動作するように実装しているつもりなので、古いバージョンの Web ブラウザーや上記以外の Web ブラウザーでも特に問題なく動作するはず。
※ 旧バージョンの情報 (記述例や API 仕様など)
data-files 属性を持つ img 要素に自動的に AnimateImage が適用される。
<img src="" data-files="" title="" alt="" id="" class="" style="" data-delay="" data-repeat="" data-rewind="" data-pauseAtFirst="" data-pauseAtLast="" data-showBlank="" data-cycleDelay="" data-blankClassName="" />
img 要素で未定義の属性は独自データ属性 (data-*) で指定する。src 属性と deta-files 属性は AnimateImage の必須属性。data-files 属性には書式文字列を含んだファイル名、または書式文字列でディレクトリ名を指定する場合はそのディレクトリまでの相対パスを指定する。詳細は記述例3を参照。
複数画像からなるアニメーションを制御する。
AnimateImage.Animator(files, options)
※ 引数の仕様については AnimateImage.animate() 関数を参照。旧バージョンの構文も機能する。
AnimateImage.Animator(files, title, id, delay, repeat, rewind)
アニメーションを再生 (開再)する。
引数 replay が true の場合やアニメーション終了後に呼び出した場合は、アニメーションが最初の画像から再生 (リプレイ) される。
アニメーションを停止 (一時停止) する。
複数の画像をアニメーションさせる。
※ new AnimateImage.Animator(files, options).animate()
とほとんど等価。
animator = AnimateImage.animate(files, options)
※ 旧バージョンの構文も機能する。
animator = AnimateImage.animate(files, title, id, delay, repeat, rewind)
{ properyName: value }
) で指定する。{ attributeName: value }
) で指定する。{ propertyName: value }
) で指定する。{ 'property-name': value }
のように引用符で括る。すべてのアニメーションに共通する設定。
※ アニメーション開始前に参照されるため、値を変更する場合はアニメーション開始前に設定しておく。
<img src="images/0.png" data-files="[0-9].png" /> <img src="images/01.png" data-files="[01-99].png" /> <img src="images/001.png" data-files="[001-999].png" /> <img src="images/a.png" data-files="[a-z].png" /> <img src="images/A.png" data-files="[A-Z].png" /> <img src="dir/pre-1_post.jpg" data-files="pre-[1-10]_post.jpg" />
AnimateImage.animate('images/[0-9].png'); AnimateImage.animate('images/[01-99].png'); AnimateImage.animate('images/[001-999].png'); AnimateImage.animate('images/[a-z].png'); AnimateImage.animate('images/[A-Z].png'); AnimateImage.animate('dir/pre-[1-10]_post.jpg'); // prefix/suffix
<img src="images/foo.png" data-files="[foo, bar, baz].png" /> <img src="images/foo.png" data-files="[foo.png, bar.jpg, baz.gif]" /> <img src="dir/pre-foo_post.jpg" data-files="pre-[foo, bar, baz]_post.jpg" />
AnimateImage.animate('images/[foo, bar, baz].png'); AnimateImage.animate('images/[foo.png, bar.jpg, baz.gif]'); AnimateImage.animate('dir/pre-[foo, bar, baz]_post.jpg'); // prefix/suffix
※ 書式文字列を含んだファイル名の代わりにファイル名の配列 (Array) を指定することもできる。
var files = ['images/foo.png', 'images/bar.png', 'images/baz.png']; AnimateImage.animate(files); AnimateImage.animate(['images/foo.png', 'images/bar.jpg', 'images/baz.gif']);
<img src="parent/child/image0.png" data-files="image[0-9].png" /> <img src="parent/child0/image.png" data-files="child[0-9]/image.png" /> <img src="parent0/child/image.png" data-files="parent[0-9]/child/image.png" />
※ data-files 属性には書式文字列を含んだファイル名、または書式文字列でディレクトリ名を指定する場合はそのディレクトリまでの相対パスを指定する。
AnimateImage.animate('parent/child/image[0-9].png'); AnimateImage.animate('parent/child[0-9]/image.png'); AnimateImage.animate('parent[0-9]/child/image.png');
<img src="images/0.png" data-files="[0-9].png" title="foo" /> <img src="images/0.png" data-files="[0-9].png" title="foo" alt="bar" /> <img src="images/0.png" data-files="[0-9].png" alt="bar" /> <img src="images/0.png" data-files="[0-9].png" alt="" />
AnimateImage.animate('images/[0-9].png', { title: 'foo' }); // title="foo" alt="foo" AnimateImage.animate('images/[0-9].png', { title: 'foo', alt: 'bar' }); // title="foo" alt="bar" AnimateImage.animate('images/[0-9].png', { alt: 'bar' }); // alt="bar" AnimateImage.animate('images/[0-9].png', { alt: '' }); // alt=""
※ 画像の代替テキストが不要な場合は img 要素に空文字列の alt 属性 (img@alt=””) を付加する。
<img src="images/0.png" data-files="[0-9].png" /> <img src="images/0.png" data-files="[0-9].png" id="foo" /> <img src="images/0.png" data-files="[0-9].png" class="bar" /> <img src="images/0.png" data-files="[0-9].png" class="bar baz" /> <img src="images/0.png" data-files="[0-9].png"class="" />
AnimateImage.animate('images/[0-9].png'); // class="animation" AnimateImage.animate('images/[0-9].png', { id: 'foo' }); // id="foo" class="animation" AnimateImage.animate('images/[0-9].png', { className: 'bar' }); // class="bar" AnimateImage.animate('images/[0-9].png', { className: 'bar baz' }); // class="bar baz" AnimateImage.animate('images/[0-9].png', { className: '' }); // no class
※ CSS ファイルや style 要素内に class/id セレクタを使用したスタイルルールを定義する。
img.animation { background: white; } img#foo { background: silver; } img.bar { background: gray; } img.baz { background: black; }
<img src="images/0.png" data-files="[0-9].png" /> <img src="images/0.png" data-files="[0-9].png" data-delay="1000" /> <img src="images/0.png" data-files="[0-9].png" data-cycleDelay="2000" />
AnimateImage.animate('images/[0-9].png'); // delay=500, cycleDelay=0 AnimateImage.animate('images/[0-9].png', { delay: 1000 }); AnimateImage.animate('images/[0-9].png', { cycleDelay: 2000 });
<img src="images/0.png" data-files="[0-9].png" /> <img src="images/0.png" data-files="[0-9].png" data-repeat="1" /> <img src="images/0.png" data-files="[0-9].png" data-repeat="2" data-rewind="true" />
AnimateImage.animate('images/[0-9].png'); // repeat=-1, rewind=false AnimateImage.animate('images/[0-9].png', { repeat: 1 }); AnimateImage.animate('images/[0-9].png', { repeat: 2, rewind: true });
<img src="images/0.png" data-files="[0-9].png" /> <img src="images/0.png" data-files="[0-9].png" data-pauseAtFirst="true" data-pauseAtLast="true" />
AnimateImage.animate('images/[0-9].png'); // pauseAtFirst=false, pauseAtLast=false AnimateImage.animate('images/[0-9].png', { pauseAtFirst: true, pauseAtLast: true });
<img src="images/0.png" data-files="[0-9].png" width="100" height="100" longdesc="long description" />
AnimateImage.animate('images/[0-9].png', { attr: { width: 100, height: 100, longdesc: 'long description' } });
<img src="images/0.png" data-files="[0-9].png" style="border: solid; border-top: dotted; border-bottom: dashed" />
AnimateImage.animate('images/[0-9].png', { css: { border: 'solid', borderTop: 'dotted', 'border-bottom': 'dashed' } });
AnimateImage.animate('images/[0-9].png'); // delay=500, repeat=-1 AnimateImage.options.delay = 1000; AnimateImage.options.repeat = 1; AnimateImage.animate('images/[0-9].png'); // delay=1000, repeat=1 AnimateImage.animate('images/[0-9].png'); // delay=1000, repeat=1 AnimateImage.animate('images/[0-9].png', { delay: 2000, repeat: -1 });
var animator = new AnimateImage.Animator('images/[0-9].png'); animator.animate(); var animator2 = AnimateImage.animate('images/[0-9].png');
※ アニメーションの挙動をボタンで制御する場合は次のような input 要素を記述する。
<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)" />
var imgElem = new Image(); imgElem.src = 'images/0.png'; imgElem.width = 100; imgElem.height = 100; imgElem.setAttribute('longdesc', 'long description'); AnimateImage.animate('images/[0-9].png', { imgElem: imgElem });
var animator = AnimateImage.animate('images/[0-9].png', { output: false }); animator.imgElem.width = 100; animator.imgElem.height = 100; animator.imgElem.setAttribute('longdesc', 'long description'); document.getElementById('foo').appendChild(animator.imgElem);
アニメーション画像に 透過 PNG 画像を指定するとアニメーション GIF のように背景を透過することができる。デモではマウスホバーによって背景色が変更される。
アニメーション画像に 256 色 (GIF の最大色数) を超える高画質の写真やイラストを指定することができる。デモでは色数 24 bit の JPEG 画像を指定している。
アニメーション画像にファイル名が連番でない任意の画像を指定することができる。デモでは blank.png, website.png, blog.png, download.png ファイルを指定している。
アニメーションの再生/停止/再開を制御することができる。デモでは Start, Stop, Replay ボタンを押すとアニメーションが再生 (再開)、停止 (一時停止)、リプレイされる。
※ 参考までに、以下の 2 つのコードはほぼ等価といえる。
<p><img src="images/0.png" data-files="[0-9].png" /></p>
<p><script type="text/javascript">AnimateImage.animate('images/[0-9].png');</script></p> <noscript><p><img src="images/0.png" /></p></noscript>
ポイントは以下の 3 つ。
従って Web 標準に準拠した HTML 記述は次のようになる。
<div> <script type="text/javascript"> AnimateImage.animate('image[0-9].png', 'text'); </script> </div> <noscript> <div><img src="image0.png" alt="text" /></div> </noscript>
※ 詳細は画像表示系の 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 オブジェクトを利用します。たとえば今回のような動作であれば、次のようなコードになると思います。
ちなみに
というのは、もしかしてアニメーション画像が次々と挿入されていく現象のことでしょうか。これは 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 で次のようなスタイルを指定すれば改変不要になりますよね。
※ ちなみに改変部分ですが、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.
attosoft様
こんにちは。AnimateImage version 0.8を愛用させていただいてゲームを作成しております。素晴らしいJSありがとうございます!
アニメーションサイクル間に空白の画像を表示する (showBlankSpace)実装を心待ちにしております。気が向いたとき実装していただけたら最高です!
taro さん
コメントありがとうございます。ゲームに使われるとは予想外でした。久しぶりにソースコードをいじってみたら保留にしていた機能が実装できましたので AnimateImage 0.8.3 を公開しました。
Animations.showBlank = true
でアニメーションサイクル間に空白の画像が表示されるようになります。