CSS3とjQueryでオリジナル画像のスプライトアニメーションを実装する方法


CSS3とjQueryでオリジナル画像のスプライトアニメーションを実装する方法

どうもですよ、フロントエンドエンジニアのはやちですよ( ˘ω˘)✌

今回はスプライト画像を使用した、アニメーションの実装方法を2つご紹介いたします(´ʘ‿ʘ`)✌

実装する前に準備をしよう

画像

まず画像が必要ですね。今回はこのような画像を用意いたしました。
1つの絵に対して100×126で作っております。ズレがないようにご注意くださいまし( ˘ω˘)☝

sprite

HTML

マークアップはこんな感じで、sectionの中のspriteを動かします( ˘ω˘)☝

<section class="section css">
   <h2>CSS</h2>
   <div class="sprite"></div>
</section>

準備はこれで以上になります( ˘ω˘)☝

実装をしよう

お次にそれぞれの実装方法をご紹介します( ˘ω˘)

CSS3を使用した形での実装方法

CSS3ではanimationを使用します。
animateで1秒間に動くフレームの数を指定して、keyframesで動かしたい場所のスタイルを記述してあげます( ˘ω˘)☝

.sprite {
    width: 126px;
    height: 100px;
    margin: 100px auto;
    background: url(../images/sprite.png) no-repeat 0 0;
}

.css .sprite {
    /*一秒間に動くフレーム数*/
    -webkit-animation: play 1s steps(6) infinite;
    animation: play 1s steps(6) infinite;
}

@-webkit-keyframes play {
    /*一秒間に動くスタイル*/
    0% {
        background-position: 0px 0;
    }

    100% {
        background-position: -756px 0;
    }
}

@keyframes play {
    /*一秒間に動くスタイル*/
    0% {
        background-position: 0px 0;
    }

    100% {
        background-position: -756px 0;
    }
}

これでCSSでの実装は完了になります( ˘ω˘)☝

jQueryを使用した形での実装方法

jQueryで実装する場合は、まずCSSを下のように書き換えましょう。
フレームごとにclassを振ってあげて、background-positionを指定しておきます。

CSS

.sprite{
  width: 126px;
  height: 100px;
  margin: 100px auto;
  background: url(../images/sprite.png) no-repeat 0 0;
}
.jQuery {
  .frame1{ background: url(../images/sprite.png) no-repeat 0 0; }
  .frame2{ background: url(../images/sprite.png) no-repeat -126px 0; }
  .frame3{ background: url(../images/sprite.png) no-repeat -252px 0; }
  .frame4{ background: url(../images/sprite.png) no-repeat -378px 0; }
  .frame5{ background: url(../images/sprite.png) no-repeat -504px 0; }
  .frame6{ background: url(../images/sprite.png) no-repeat -630px 0; }
}

JavaScript

JavaScriptはこのようになります。
フレームごとに関数を分けてsetTimeoutで先程のclassたちをつけたり外したりをして動かします( ˘ω˘)☝

$(function () {
    var TIMER = 180; //一つのフレームに対しての時間
    var animeTimer; //タイマー設定用

    //アニメーションの関数
    var spriteAnimation = function() {
        var $jsAnime = $('.jQuery').find('.sprite'); //動かしたいセレクタ

        //フレーム毎の関数
        var frame1 = function(){
            removeanimeClass();
            $jsAnime.addClass('frame1'); //フレーム1のクラスをつける
            animeTimer = setTimeout(frame2, TIMER);//次のフレームに移る
        }

        var frame2 = function(){
            removeanimeClass();
            $jsAnime.addClass('frame2');
            animeTimer = setTimeout(frame3, TIMER);
        }

        var frame3 = function(){
            removeanimeClass();
            $jsAnime.addClass('frame3');
            animeTimer = setTimeout(frame4, TIMER);
        }

        var frame4 = function(){
            removeanimeClass();
            $jsAnime.addClass('frame4');
            animeTimer = setTimeout(frame5, TIMER);
        }

        var frame5 = function(){
            removeanimeClass();
            $jsAnime.addClass('frame5');
            animeTimer = setTimeout(frame1, TIMER);
        }

        //フレームリセット用の関数
        var removeanimeClass = function(){
            $jsAnime.removeClass('frame1');
            $jsAnime.removeClass('frame2');
            $jsAnime.removeClass('frame3');
            $jsAnime.removeClass('frame4');
            $jsAnime.removeClass('frame5');
            $jsAnime.removeClass('frame6');
        }

        //フレーム1の関数を呼び出す
        frame1();
    }

    //アニメーション発火
    spriteAnimation();
});

これでJavaScriptの実装は完了になります( ˘ω˘)☝
完成したスプライトアニメーションはこちらでご覧いただけます( ˘ω˘)☞三☞シュッシュッ
DEMO

まとめ

いかがでしたでしょうか。

完成形は、ほぼ同じような感じになりましたね。

CSS3のanimationはIE10からなのでかなりモダン向けなサイトにしか使用はできませんが、jQueryならIE10以前のバージョンにも対応しているので安心です( ˘ω˘)

ただし、CSSで対応したアニメーションの方が処理が軽いです。どちらの方法で対応していくかは時と場合次第ですね(´∵`)

ではではこのへんで( ˘ω˘)

 

【JavaScriptでアニメーション表現を作ってみるの巻】

animateとjQuery.Deferredで動きのある「トップへ戻る」ボタンを作ってみよう

アニメーションに便利なJavaScriptライブラリTweenMaxを使ってみる(その1)

アニメーションに便利なJavaScriptライブラリTweenMaxを使ってみる(その2)

ScrollMagicを使ってスクロールに応じたアニメーションをさせてみよう

アニメーションを実装するなら知っておきたい「requestAnimationFrame」の使い方

この記事を書いた人

はやち
はやち フロントエンドエンジニア 2010年入社
フロントエンドエンジニアのはやちです( ˘ω˘)☝
以前までは顔隠しておりましたが思い切ることにしました…。
相変わらず顔文字乱舞ですがブログもコーディングも楽しくやっていこうと思います✌(´ʘ‿ʘ`)✌
今までに作ったDemoたちはGithubにて公開しております!よろしければ是非( ˘ω˘)☞三☞シュッシュッ