CSSアニメーション適用例
基本モーション
CSSの@keyframesとanimationプロパティを使用すれば、JavaScriptを使わなくても、ウェブページ上でさもざもなモーションやアニメーションを実装できます。
ここでは、CSSアニメーションで簡単に実装できる基本モーションを例としてあげてみます。適用対象はpタグで(pタグのCSSプロパティは初期値です)、DEMOごとにクラス名をつけています。
各プロパティの値を自由にいじってみると、値がどのようにモーションを決定するのか体感できます。
フェードイン
@keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } .fadeIn { animation-name: fadeIn; animation-duration: 1s; animation-iteration-count: infinite; animation-timing-function: linear; }
opacity(不透明度)が0から1になることでフェードインになります。
フェードアウト
@keyframes fadeOut { 100% { opacity: 0; } } .fadeOut { animation-name: fadeOut; animation-duration: 1s; animation-iteration-count: infinite; animation-timing-function: linear; }
上記では、対象となる要素がそもそも透明ではないため、0%時のopacityは設定していません。
再生回数が有限の場合
重要なポイントとして、アニメーションの終了時、要素にはもともと指定されているプロパティの値が反映されます。つまり、アニメーションの再生回数が1回、2回と有限である場合は、最終的にopacityの値が戻ってしまい、通常は要素が表示されたままになっていまいます(例)。
これを解消するには、アニメーションを適用する要素のopacityをはじめから0にしておき、またアニメーション0%時で1にしておきます。
@keyframes fadeOutLimited { 0% { opacity: 1; } 100% { opacity: 0; } } .fadeOutLimited { animation-name: fadeOutLimited; animation-duration: 1s; animation-iteration-count: 1; animation-timing-function: linear; opacity: 0; }
あわせて知っておきたい
フェードインもフェードアウトもopacity(不透明度)の値を調節することで実現できます。
opacityを使う場合は、その要素が消えてなくなるわけではないので、透明であっても選択したり、検索したりすることができます。
完全な非表示には通常display: none;を使うので、この場合はJavaScriptでdisplayの値をいじります。
フェードイン&アウト
@keyframes fadeInOut { 0% { opacity: 0; } 50% { opacity: 1; } 100% { opacity: 0; } } .fadeInOut { animation-name: fadeInOut; animation-duration: 1s; animation-iteration-count: infinite; animation-timing-function: linear; }
拡大
@keyframes getBigger { 0% { font-size: 10px; } 100% { font-size: 50px; } } .getBigger { animation-name: getBigger; animation-duration: 1s; animation-iteration-count: infinite; animation-timing-function: linear; }
縮小
@keyframes getSmaller { 0% { font-size: 50px; } 100% { font-size: 10px; } } .getSmaller { animation-name: getSmaller; animation-duration: 1s; animation-iteration-count: infinite; animation-timing-function: linear; }
拡大+フェードイン
@keyframes getBiggerWithFadeIn { 0% { font-size: 10px; opacity: 0; } 100% { font-size: 50px; opacity: 1; } } .getBiggerWithFadeIn { animation-name: getBiggerWithFadeIn; animation-duration: 2s; animation-iteration-count: infinite; animation-timing-function: linear; }
縮小+フェードアウト
@keyframes getSmallerWithFadeOut { 0% { font-size: 50px; } 100% { font-size: 10px; opacity: 0; } } .getSmallerWithFadeOut { animation-name: getSmallerWithFadeOut; animation-duration: 1s; animation-iteration-count: infinite; animation-timing-function: linear; }
逆再生する
animation-directionプロパティの値にreverseを取ると、逆再生することができます。
つまり、フェードインを逆再生してフェードアウト、拡大を逆再生して縮小を実現することもできます。
フェードインを逆再生(フェードアウト)
@keyframes fadeInReversed { 0% { opacity: 0; } 100% { opacity: 1; } } .fadeInReversed { animation-name: fadeInReversed; animation-duration: 1s; animation-iteration-count: infinite; animation-timing-function: linear; animation-direction: reverse; }
拡大を逆再生(縮小)
@keyframes getBiggerReversed { 0% { font-size: 10px; } 100% { font-size: 50px; } } .getBiggerReversed { animation-name: getBiggerReversed; animation-duration: 1s; animation-iteration-count: infinite; animation-timing-function: linear; animation-direction: reverse; }