かしこくもなりたいし、女の子にもなりたかった。

とってもガーリーなゆるふわ愛され何でも屋を目指す、30代男性がお送りするファビュラスなブログ。

jQueryのanimateをキーフレーム打ちできるようにしてみるなど

jQueryのanimateを大量に書き連ねなくちゃいけないときが、あるんです。男には。 で、その上それがcallback地獄になってて、コードのど真ん中に美しいピラミッドが出来上がってたりするんです。 まあ、イケてないよね、正直。キーフレーム打てたらそれでそもそも解決じゃん?みたいな。

というわけで書いてみた。

使い方

プラグイン本体はこいつ

(function($){
    $.fn.keyframeAnimate = function(keyframes,interval,easing,callback){

        var keyframe = []
        var lastframe = 0;

        //各プロパティをばらすと共に、各プロパティの指定フレーム数をチェック。
        for(key in keyframes){
            if(lastframe <= keyframes[key].length){
                lastframe = keyframes[key].length
            }
            keyframe.push({property:key,frames:keyframes[key]})
        }

        //最長フレーム数に合わせて、最終フレームのコピーで埋める
        for(i=0,il=keyframe.length;i<il;i++){
            var currentLength = keyframe[i].frames.length;
            if(currentLength < lastframe){
                var lastValue = keyframe[i].frames[currentLength-1];
                var fillcount =  lastframe - currentLength;
                for(j=0;j<fillcount;j++){
                    keyframe[i].frames.push(lastValue)
                }

            }
        }

        return this.each(function() {

            var $el = $(this);
            var scope = this;
            var i = 0;

            function doAnimate(i){
                var frame = {};
                for(j=0,jl=keyframe.length;j<jl;j++){
                    frame[""+keyframe[j].property] = keyframe[j].frames[i]                  
                }
                $el.animate(frame,interval,easing,function(){
                    i++
                    if(i<lastframe){
                        doAnimate(i)
                    }else if(i == lastframe){
                        return callback.call(this)
                    }
                })
            }
            doAnimate(i);
        });
    };
})(jQuery);

書き方汚いのは毎度の事だ気にするな。 使い方はだいたいjQuery.animate()と同じだけど、プロパティの値の指定を配列で渡す事と、durationではなくフレームの間隔の指定になるという点のみが違う。またキーフレームは一番指定数の多いところが優先されて、例えば全長6フレーム指定なのに、一部プロパティが4フレームまでの指定、になると5,6は4の値を継続して指定される。

$("#test").keyframeAnimate({
        top:[50,-40,30,-20,10,0],
        opacity:[0.3,0.6,1]
    },100,"swing",function(){
        //callback処理
    });

こんな具合。かなりスッキリ出来ると思うの。jsdo.itで晒しているのは、エロい人が直してくれると信じているからなので、だれかもっとスマートに書き直してください。以上!おやすみ!