tween.jsとは
四角いdiv要素をクリックしたら、びょんびょんびょーーーんっと、動いたと思います。早速これのサンプルコードはこちら。(jQueryで書いてます。)
js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| (function(){
if(typeof jQuery == 'undefined')return;
jQuery.noConflict();
jQuery(function($){
var twObj = $('#obj');
twObj.text('クリック');
twObj.click(function(){
twObj.text('クリック');
init();
});
twObj.css({
'position':'absolute',
'left':'0xp',
'height':'50px',
'width':'50px',
'background-color':'#0FF',
'font-size':'12px'
});
function init() {
var tween = new TWEEN.Tween( { x: 0 } )
.to( { x: 400 }, 2000 )
.easing( TWEEN.Easing.Elastic.InOut )
.onUpdate( function () {
twObj.css('left', this.x + 'px');
})
.onComplete(function(){
twObj.text('おしまい');
});
tween.start();
}
function animate() {
requestAnimationFrame(animate);
TWEEN.update();
}
animate();
});
})();
|
tween.jsはJavaScript製のアニメーションライブラリです。jQueryや MooToolsなどを使えば簡単なアニメーションは可能でしたが、このtween.jsを使えば、JavaScriptで複雑なアニメーションを表現する事が可能になります。FlashのTweenerみたいですね。ダウンロードして内容を見てみました。
圧縮したライブラリは、ダウンロードしたフォルダーの中にあるbuildフォルダーにありました。非圧縮は12KBで圧縮は8KBなので、スマートフォンでも使えそうな容量ですね。
Hello World!を見てみましょう
examplesフォルダーにある00_hello_world.htmlファイルのJavaScriptの記述です。
00 _ HELLO WORLD
http://sole.github.com/tween.js/examples/00_hello_world.html
js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| <script src="../build/Tween.js"></script>
<script src="js/RequestAnimationFrame.js"></script>
<script>
var position;
var target;
var tween, tweenBack;
init();
animate();
function init() {
position = {x: 100, y: 100, rotation: 0};
target = document.getElementById('target');
tween = new TWEEN.Tween(position)
.to({x: 700, y: 200, rotation: 359}, 2000)
.delay(1000)
.easing(TWEEN.Easing.Elastic.InOut)
.onUpdate(update);
tweenBack = new TWEEN.Tween(position)
.to({x: 100, y: 100, rotation: 0}, 3000)
.easing(TWEEN.Easing.Elastic.InOut)
.onUpdate(update);
tween.chain(tweenBack);
tweenBack.chain(tween);
tween.start();
}
function animate() {
requestAnimationFrame( animate );
TWEEN.update();
}
function update() {
target.style.left = position.x + 'px';
target.style.top = position.y + 'px';
target.style.webkitTransform = 'rotate(' + Math.floor(position.rotation) + 'deg)';
target.style.MozTransform = 'rotate(' + Math.floor(position.rotation) + 'deg)';
}
</script>
|
少し最初の2行目を見てみます。
js1 2
| <script src="../build/Tween.js"></script>
<script src="js/RequestAnimationFrame.js"></script>
|
これの1行目はtween.jsライブラリを読み込む記述です。2行目は、ブラウザがRequestAnimationFrameに対応しているかどうか判断するためのJavaScriptです。
ちょっと脱線しますが、RequestAnimationFrameについて。
動きのある表現を今までしていたときは、setIntervalやsetTimeoutなどを使っていたと思います。このRequestAnimationFrameは前者の2つに代わるもので、何がメリットかというと、ウィンドウが非アクティブならタイマーが止まって、いつの間にかメモリーがたくさん使われている。といったことを回避できるみたいです。しかしまだベンダードラフトなので、いつ仕様が変わるかわからず、jQueryもバージョン1.6でサポートしましたが、1.6.3では使われなくなり、setIntervalに戻され、1.7でもrequestAnimationFrameは使われてないようです。setIntervalのqueryが衝突してしまうなどの噂もありますので、requestAnimationFrameとsetInterval、setTimeoutを併用して使う場合は、少し注意がいるかもしれません。W3Cからは2012年2月21日時点で、最終草案が発表されたみたいですので、英語サイトですが見ておくといいかもしれません。
Timing control for script-based animations - W3C
http://www.w3.org/TR/2012/WD-animation-timing-20120221/
簡単にRequestAnimationFrame.jsも見ておきます。
RequestAnimationFrame.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| (function() {
var lastTime = 0;
var vendors = ['ms', 'moz', 'webkit', 'o'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
|| window[vendors[x]+'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}());
|
つまりこのScriptは、requestAnimationFrameが対応しているブラウザじゃなかったら、setTimeoutを代用していくれるScriptです。
tweenのメソッドチェーン
new TWEENした後に実行メソッドの種類。
- Tween(object);
トゥイーンさせるobjectを引数に入れる。 - to(object, Number);
第一引数に目的の値、第二引数に目的までの時間 - easing(object);
TWEEN.Easing.○○.○○を入力。種類はこの後。 - delay(Number);
ディレイは遅れるという意味なので何秒遅れて実行するか。 - onUpdate(function(){});
トゥイーン中に実行する関数を記述する。 - onComplete(function(){});
トゥイーン完了後に実行する。
イージングの種類
easing(TWEEN.Easing.○○.○○); ここの○○のところに記述できる種類が書かれています。03_graphs.htmlにも書いてます。グラフの曲線があることで、動きの流れがわかりやすくなってますね。
03 _ GRAPHS
http://sole.github.com/tween.js/examples/03_graphs.html
Linear.None
Quadratic.In
Quadratic.Out
Quadratic.InOut
Cubic.In
Cubic.Out
Cubic.InOut
Quartic.In
Quartic.Out
Quartic.InOut
Quintic.In
Quintic.Out
Quintic.InOut
Sinusoidal.In
Sinusoidal.Out
Sinusoidal.InOut
Exponential.In
Exponential.Out
Exponential.InOut
Circular.In
Circular.Out
Circular.InOut
Elastic.In
Elastic.Out
Elastic.InOut
Back.In
Back.Out
Back.InOut
Bounce.In
Bounce.Out
Bounce.InOut