CSSで画像をアニメーションさせてみよう(4) メトロノームのように画像を動かす
CSSで静止画像をアニメーションさせる
CSSを使うことで、静止した画像をアニメーション表示することができます。上下・左右に動かせるのはもちろん、回転させることもできます。
参考:CSSで画像をアニメーションさせてみよう(1)キーフレームとは
https://anko.education/archives/3599
参考:CSSで画像をアニメーションさせてみよう(2)平面の画像を立体的に回転させる
https://anko.education/archives/3603
CSSで静止画像をメトロノームのようにアニメーションさせる
この記事のサンプルコードでは、画像を表示する角度を回転させます。そのとき、回転の中心を画像の外に指定して、メトロノームのように、孤を描いて振動するようにさせてみます。
サンプルコードには、動作の速さ(何秒かけて振動を往復させるか)を変更する仕組みも入れてみました。
サンプルの確認
以下で、サンプルの動作を確認することができます。
アプリとソースコードのインポート
以下のボタンをクリックすると、Monaca Educationにプロジェクトをインポートできます。
Monaca Educationにインポートする(要ログイン)
CSSのポイント
画像のアニメーションの動作を指定する
このアプリの、画像のアニメーション動作を実現しているのは、フォルダcssの中のファイルstyle.cssのうち、特に下記の部分です。
#arrow {
…
animation: swing 3s infinite ease-in-out;
transform-origin: center 300px;
}
@keyframes swing {
0%, 100% {
transform: rotate(-30deg);
}
50% {
transform: rotate(30deg);
}
}
HTML(index.html)で、タグ<img>を使い、矢印の画像を表示させています。その矢印の画像要素には、ID属性を用いて、”arrow”(※「矢印」という意味)という名前を付けています。
そのarrowの表示方法として、以下の指定がされています。
#arrow {
…
animation: swing 3s infinite ease-in-out;
transform-origin: center 300px;
}
属性animationの値として、最初に”swing”がされていますが、これはCSSの後の方に書かれているキーフレーム(@keyframes)の名前です(※キーフレームの指定内容は後述)。
次にある“3s”とは、「3秒かけて」という意味です。指定したキーフレームアニメーションを、3秒で実行するように指定しています。
“infinite”は、「無限に繰り返す」という意味です。アニメを(1回きりでなく)繰り返し表示します。
“ease-in-out”は、アニメーションの動作の速さを「ゆっくり変化しはじめ、速度を上げ、また速度を落とす」と指定する書き方です。
キーフレームswingで、アニメの開始点・中間点・終了点のスタイルを指定する
“swing”という名前で定義されているキーフレームでは、次のようにアニメーションのキーフレームを決めています。
なお、キーフレームとは、アニメーションの開始点や終了点、必要に応じて中間点を決め、それぞれの点での要素のスタイルを指定するものです。
@keyframes swing {
0%, 100% {
transform: rotate(-30deg);
}
50% {
transform: rotate(30deg);
}
}
この例では、アニメの開始時点(0%)と終了時点(100%)において、 -30度回転(rotate)するように指定しています。マイナスの角度の指定により、時計の12時の方向(画面真上の方向)に対して、反時計回りに回転した位置になります。
中間時点(50%)では、30度回転が指定されています。
CSSは、これらの点の間を埋めるようにアニメーションを作ってくれます。
つまり、以上のキーフレームの設定の結果、アニメは「最初、(12時の方向から見て)左に30度傾いた向きから始まり、時計回りに回転しながら、アニメの中間のタイミングで右に30度傾いた状態になる。続けて、反時計回りに回転して、元の、左に30度傾いた位置に戻る」と定義されたことになります。
変形の原点(origin)を指定する
次の部分は、変形(=transform。今回のサンプルの場合、「回転」という種類の変形)の原点を決めています。
#arrow {
…
transform-origin: center 300px;
}
この部分のうち、”center”は画像の左右中央を意味します。続く”300px”は、画面の上端を0px(ピクセル)としたときの原点の縦方向の(座標のYの)値です。画像の表示サイズを150pxにしているので、その倍ですから、画像の範囲をはみ出して、画像の外、下側のところに回転の中央を置いたことになります。
これで、弧を描いて動く矢印を作ることができました。
試してみよう:変形の原点を画像の中央にすると
変形の原点(transform-origin)の値を、次のように変更すると、画像の中央を中心に回転するようになります。
#arrow {
…
transform-origin: center center;
}
ぜひ、試してみてください。
アニメーションの動作の速度を変える
このサンプルアプリには「速くする」「遅くする」のボタンも付いています。
ボタンをクリックすると、JavaScriptによるプログラムが動作します。「速くする」の処理内容は以下の通りです(HTMLファイルindex.htmlに記載)。
function faster(){
let arrow = document.getElementById("arrow");
if ( currentSpeed > 1 ) {
currentSpeed -= 1; // 1秒分、加速する
arrow.style.animation = 'swing ' + currentSpeed + 's infinite ease-in-out';
}
}
プログラムの中で、「現在の速度(currentSpeed)が1より大きい場合、currentSpeedの値を1引く」という処理を行なっています。 「数が小さくなるのに、加速する」のは不思議な気がしますが、CSSの属性animateは「何秒で一連の(キーフレームの)アニメを表示するか」指定します。 「3秒かけて一連のアニメを表示する」場合と、「1秒で一連のアニメを表示する」を比べると、「1秒で一連のアニメを表示する」の方が、動作は速くなります。
最後に、HTMLの要素のスタイルを書き換えて、画面に反映させています。
まとめ
この記事では、CSSを使ってアニメーションをさせるにあたって、回転の中心を移動させる例を示しました。移動させる画像はもちろん、回転の中心の位置を変更すると、さまざまな効果が出せます。