2011/02/01
下のような4つの部位がある1枚の画像に対して、CSSのclipプロパティを使って
必要な部分を切り出し、その画像をアニメーションさせます。
#img1 {
position: absolute; /*必須*/
top: 0;
left: 0;
clip: rect(0px, 48px, 32px, 0px);
}
jQueryで画像を生成し、CSSを指定します。
1枚分の高さの32pxだけtopを減算することで、2番の画像を適正な位置に表示することができます。
jQuery(document).ready(function($){ $('<img>') .attr({ 'id':'img2', 'src':'img.png' }) .css({ 'position':'absolute', 'top':'-32px', 'clip':'rect(32px, 48px, 64px, 0px)' }) .appendTo('#area2'); });
アニメーションの準備として、表示画像の指定や座標を変数で自由に設定できるようにし、
その一連の処理を関数にします。
グローバル変数を設定します。
//表示する画像のサイズ var H = 32; //高さ var W = 48; //幅 //アニメーションの順番と画像切り出しの指定 var obj_anim = { src:'img.png', set:[ {top:0 * H, right:1 * W, bottom:1 * H, left:0 * W}, {top:1 * H, right:1 * W, bottom:2 * H, left:0 * W}, {top:2 * H, right:1 * W, bottom:3 * H, left:0 * W}, {top:3 * H, right:1 * W, bottom:4 * H, left:0 * W} ] };
画像切り出し、生成の汎用関数を作成します
function setAnim(x, y, id, index){ var set = obj_anim.set[0]; //長いので短縮! var img = $('') .attr({ 'id':'img'+id, 'src':obj_anim.src }) .css({ 'position':'absolute', 'top' : y - set['top'] + 'px', 'left': x - set['left'] + 'px', 'clip':'rect('+ set['top'] +'px,'+ set['right'] +'px,'+ set['bottom']+'px,'+ set['left'] +'px' + ')' }) .appendTo('#area'+id); }
作成した関数を呼び出します
jQuery(document).ready(function($){ setAnim(0, 0, 3, 0); });
上で作成した関数も利用して、アニメーションさせます。
現在のアニメーションの順番を保存するグローバル変数です。
var INDEX4 = 0;
表示する画像を変更して、アニメーションを実現する関数です
function updateAnim4(id){ INDEX4++; if(INDEX4 >= obj_anim.set.length) INDEX4 = 0; var set = obj_anim.set[INDEX4]; //長いので短縮! $('#img'+id) .css({ 'top' : - set['top'] + 'px', 'left': - set['left'] + 'px', 'clip':'rect('+ set['top'] +'px,'+ set['right'] +'px,'+ set['bottom']+'px,'+ set['left'] +'px' + ')' }); }
まずは画像を生成・設置し、その後定期的に画像を変更していきます。
jQuery(document).ready(function($){ setAnim(0, 0, 4, 0); //生成・設置 setInterval(function(){ updateAnim4(4); //画像を変更 }, 1000); });
親divの枠内で動きまわるようにします。
var INDEX5 = 0; //現在表示している画像の番号 var limit_w; //親の境界 - 画像の幅 var limit_h; //親の境界 - 画像の高さ var vx = 2; //X方向へ進む距離 var vy = -1; //Y方向へ進む距離
取得したCSSのtop,leftの値から数値のみを取り出す関数を作っておきます
function getInt(text){ if(text == undefined) return 0; var matches = text.match(/(-?[0-9]+)(px)?/); if(!matches){ return 0; }else{ return parseInt(matches[1], 10); } }
表示する位置が変わっても正しくアニメーションされるように関数を書き換えます
function updateAnim5(id){ //一つ前の画像切り出し情報を記憶 var PREV = INDEX5; if(PREV < 0) var PREV = obj_anim.set.length - 1; var prev = obj_anim.set[PREV]; //現在の画像切り出し情報を記憶 INDEX5++; if(INDEX5 >= obj_anim.set.length) INDEX5 = 0; var curr = obj_anim.set[INDEX5]; //長いので短縮! //一つ前の画像座標を記憶 var prev_top = getInt($('#img'+id).css('top')); var prev_left = getInt($('#img'+id).css('left')); $('#img'+id) .css({ 'top' : prev_top - curr['top'] + prev['top'] + 'px', 'left': prev_left - curr['left'] - prev['left'] + 'px', 'clip':'rect('+ curr['top'] +'px,'+ curr['right'] +'px,'+ curr['bottom']+'px,'+ curr['left'] +'px' + ')' }); }
画像の位置を動かす関数を作ります
function moveImg(id){ //現在の画像座標を記憶 var curr_top = getInt($('#img'+id).css('top')); var curr_left = getInt($('#img'+id).css('left')); //現在の画像切り出し情報を取得 var rect = obj_anim.set[INDEX5]; $('#img'+id) .css({ 'top' : curr_top + vy + 'px', 'left': curr_left + vx + 'px', 'clip':'rect('+ rect['top'] +'px,'+ rect['right'] +'px,'+ rect['bottom']+'px,'+ rect['left'] +'px' + ')' }); }
ロード後に親divの領域を取得し、アニメーションと移動を開始します。
jQuery(document).ready(function($){ limit_w = parseInt($('#area5').width(),10) - W; limit_h = parseInt($('#area5').height(),10) - H; setAnim(0, 0, 5, 0); setInterval(function(){ updateAnim5(5); }, 1000); setInterval(function(){ moveImg(5); },50); });