などの疑問や悩みを解決してまいります。
小規模のアニメーションであればCSSのanimation
プロパティと@keyframes
を使用して実装することができます。
しかし、日常にある動きをアニメーションとして実装する場合はなかなかリアルな動きを再現できずに苦労している方も多いかと思います。
今回は日常においても必ず見たことがあるであろう、物体が「バウンド(跳ねる)」の動きを実装していきます。
完成例を見てみましょう。
以下が完成例になります。
See the Pen バウンドアニメーション by koutarou mori (@koutarou-mori) on CodePen.
それでは早速解説していきます。
CSSの解説
CSSコードを解説していきます。
body {
/* ボールを中心に */
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.ball {
/* ボールのレイアウト */
background-color: #5694c6;
border-radius: 50%;
width: 200px;
height: 200px;
/*animationプロパティここから*/
animation-name: bounce;
animation-duration: 1s;
animation-iteration-count: infinite;
animation-timing-function: linear;
transform-origin: center bottom;
}
@keyframes bounce {
0% { transform: scale(1.0, 1.0) translate(0%, 0%); } /* 初期状態 */
30% { transform: scale(1.5, 0.5) translate(0%, 0%); } /* 地面に着地し、その変動で潰れだす */
40% { transform: scale(1.0, 1.0) translate(0%, 0%); } /* 潰れた反動で一瞬元に戻る */
50% { transform: scale(0.8, 1.3) translate(0%, -70%); } /* 潰れた反動で縦に伸び、その勢いでバウンド開始 */
60% { transform: scale(1.0, 1.0) translate(0%, -120%); } /* 潰れた反動が終り、空中で元に戻る */
100% { transform: scale(1.0, 1.0) translate(0%, 0%); } /* 初期状態に戻る */
}
animation-nameプロパティでアニメーションに名前を付ける
CSSアニメーションを実装するためにアニメーションに名前を付けなくてはいけません。
アニメーションに名前を付けるにはanimation-name
プロパティを使用します。
今回はわかりやすく「bounce
」と指定しています。
animation-durationプロパティでアニメーションの再生時間を指定
今回こちらのバウンドアニメーションはアニメーションの再生1回につき1秒に設定しています。
このアニメーションの再生時間を指定するのがanimation-duration
プロパティです。
今回は再生時間を1秒としているので、値に1sと記載しています。
なお時間指定の単位の意味は以下の通りです。
単位 | 内容 |
---|---|
s | 秒単位を示し、1sとすると1秒ということになる |
ms | ミリ秒単位を示し、1000msで1秒となる(0.5sだと500msと同じになり0.5秒ということになる) |
animation-iteration-count: infinite;で繰り返し再生
animation-iteration-count: infinite;
はアニメーションを繰り返し再生してくれるプロパティです。
animation-timing-functionプロパティで再生加速度を設定
animation-timing-function
プロパティを使用することで、アニメーション途中の加速度を変更することができます。
指定できる値は以下の通りです。
値 | 効果 |
---|---|
linear | 一定のスピードで変化 |
ease(初期値) | 開始時と終了時をゆっくり変化 |
ease-in | 最初はゆっくりで、だんだん速く |
ease-out | 最初は速く変化し、だんだんゆっくり変化 |
ease-in-out | 「ease」よりも開始時と終了時をさらにゆっくり変化 |
step-start | 開始時に最後の段階へ一気に変化 |
step-end | 終了時に最後の段階へ一気に変化 |
今回はlinear
を使用しています。
transform-originプロパティで変形となる基点を決める
イメージしてほしいのですが、落ちたボールは地面に密着しながら落ちた反動で潰れます。
地面に密着しながらということは、ボールの下側の位置は固定されたままということです。
なのでアニメーションの起点を要素の下にしたいときなどに使うのがtransform-origin
プロパティです。
transform-origin
プロパティを使用することで、要素の下を変形の基点とすることができます。
@keyframeにはtransformプロパティのscale()関数とtranslate()関数を指定
scale()
関数は要素の拡大・縮小することができ、translate()
関数は要素の位置を指定することができます。
要素をバウンドさせる際に必要な動きは、ボールが跳ねる動きとバウンドしたときにボールが変形する動きです。
そのため跳ねたときの上下の動きをtranslate()
関数、つぶれたときに変形するボールの形をscale()
関数で再現しています。
これを@keyframes
で%毎に数値をそれぞれ指定してあげることでボールが弾む動きを実現することができます。
本記事のまとめ
ここまで読んでいただきありがとうございました。
本記事のまとめです。
ポイント
○ animation-name
プロパティでアニメーションに名前を付ける
○ animation-duration
プロパティでアニメーションの再生時間を指定
○ animation-iteration-count: infinite;
で繰り返し再生
○ animation-timing-function
プロパティでアニメーションの再生加速度を設定
○ transform-origin
プロパティで変形となる基点を決める
○ @keyframe
にはtransform
プロパティのscale()
関数とtranslate()
関数を指定
○ よりリアルにアニメーションさせるには別の同じ動画をスローモーションで確認しながら値を調整