[CSS] CSS3アニメーションのまとめ:transitionとanimationの基本
transitionとanimationの違い
taransition | :hoverなどと同じように、特定のアクションに対して要素を単純に状態変化させ、終了後に自動で逆のアニメーションで元に戻る |
animation | Flashのように細かいアニメーションの設定をする |
transition
- transition(遷移)という名前のとおり、現在の状態から別の状態に遷移し、そして別の状態から元の状態に戻るアニメーションについて定義する。
- アニメーションの終了後は自動で元の状態に戻る。
- アニメーションの開始は、:hover、:activeなどの擬似クラスをきっかけに使う。
基本
transition関連のプロパティは「アニメーション前の初期状態を定義」し、それ以外は「アニメーションの終了時点の状態を定義」するというイメージ。
AdobeのFlashやAfterEffectsのようなものでいうなら、「トゥイーンの開始と終了するポイントにおけるキーフレームの状態を指定する」ことに近い。
各種プロパティ
以下の値で強調表示されているものが、初期値。
transition-property
transitionの対象となるCSSプロパティ(font-sizeなど)を指定。
all | すべて |
none | なし(transitionの意味がない) |
(各プロパティ名) | コンマ区切りで複数指定 |
transition-duration
アニメーション全体の時間を指定。
0s | すぐ変化(アニメなし) |
秒 | 数値+「s」(10秒なら「10s」) |
ミリ秒 | 数値+「ms」(10ミリ秒なら「10ms」) |
マイナスの値を指定した場合は「0」とされる。
transition-timing-function
アニメーションの変化のパターンを指定。
いわゆるeasing(イージング)。easeとは「~を慎重に動かす」という意味。
jQuery#animate()やActionScriptのTweenerで指定するのと似たようなもの。
値をcubic-bezier()関数で指定する場合
(MDNより)
制御点P0(0.0)とP3(1.0)は固定なので、P1とP2のxとyの座標をそれぞれ指定する。
Adobe IllustratorやInkscapeでいえば、P0・P3がアンカーポイント、P1・P2がハンドルということになる。
/* P1(0.25, 0.1)、P2(0.25, 1.0)の場合 */ transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1.0) ;
値をsteps()関数で指定する場合
(MDNより)
値を階段関数を用いて指定。
単純化していえば、値の変化を直線的(liner)でも曲線的になめらか(cubic-bezier)にするのでもなく、上記のグラフのように階段状に変化していく。
steps(number_of_steps, direction)
number_of_steps | 変化の段階(ステップ)の数を正の整数で指定。 | ||||
direction |
|
transition-timing-function: steps(3, start);
定義済みの値
以下のあらかじめ定められた定義値もある。
ease | ゆっくり入り、加速し、ゆっくり終わる cubic-bezier(0.25, 0.1, 0.25, 1.0) |
linear | 一定の速度(等速直線運動) cubic-bezier(0.0, 0.0, 1.0, 1.0) |
ease-in | ゆっくり入り、加速して終わる cubic-bezier(0.42, 0, 1.0, 1.0) |
ease-out | 速く入り、ゆっくり終わる cubic-bezier(0, 0, 0.58, 1.0) |
ease-in-out | easeよりも、ゆっくり入り、加速し、ゆっくり終わる cubic-bezier(0.42, 0, 0.58, 1.0) |
step-start | すぐに最後の状態になる(アニメーションがない) steps(1, start) |
step-end | ずっと最初の状態のまま(アニメーションがない) steps(1, end) |
transition-delay
アニメーション開始を遅らせる時間を指定。
0s | すぐ変化(アニメなし) |
秒 | 数値+「s」(10秒なら「10s」) |
ミリ秒 | 数値+「ms」(10ミリ秒なら「10ms」) |
マイナスの値を指定した場合はすぐ変化がはじめるが、その分だけ実際のアニメーションが途中から開始される。
たとえば、transition-durationが「3000ms」でtransition-delayが「-1000ms」の場合、アニメーションは本来の「1000ms」の状態から開始し、残りの2000ms(2秒)分だけ動く。
つまり、transition-delayでマイナス指定した分だけアニメーションがカットされる。
そこから元に戻るアニメーションも、マイナス指定した分だけ最初の部分がカットされる。
マイナスの値を指定した場合は、挙動がまったく別物だと憶えておこう。
対象プロパティを複数指定した場合
transition-propertyで複数のCSSプロパティを指定した場合、そのそれぞれにtransition-durationなど他のプロパティの値をコンマ区切りで指定できる。
transition-property: width, height; transition-duration: 1s, 2s;
プロパティの数と設定の数が合わない場合
足らない場合
transition-property: width, height, color, background-color; transition-duration: 1s, 2s;
指定された分がセットでくり返される。
つまり、以下と同じ。
transition-property: width, height, color, background-color; transition-duration: 1s, 2s, 1s, 2s;
多い場合
transition-property: width, height; transition-duration: 1s, 2s, 1s, 2s;
単純に、余りはカットされる。
transition-property: width, height; transition-duration: 1s, 2s;
プロパティをまとめて指定
基本的に、以下の順序で指定したほうがいい。
transition-property transition-duration transition-timing-function transition-delay
すべての項目が省略可能で順不同だが、2つある時間指定の項目は上記の順番で解釈される。
transition: 2s 500ms;
たとえばこの場合、transition-durationが2s、transition-delayが500msと解釈される。
transition-propertyのターゲットごとに指定
設定をそれぞれまとめて、コンマ区切りで複数指定できる。
transition: width 1s ease 500ms, height 2s ease-in 300ms;
JavaScriptイベント
TransitionEventオブジェクト
プロパティ
propertyName | CSSプロパティの名前 |
elapsedTime | 時間経過。transition-delayの値がなんであっても、影響されない。 |
psedoElement | トランジションが起きたCSS擬似要素の名前(文字列)。擬似クラスと区別するために、先頭にセミコロンが2つ付く(::first-lineなど)。
トランジションが起きたのが通常の要素の場合、空文字列になる。 |
イベントタイプ
transitionend | トランジションが完了したときに発生。完了前にJavaScriptでトランジション関連のプロパティを削除したりした場合は発生しない。 |
例
HTML
<div class="example-transition"></div>
CSS
/* 初期状態 */ .example-transition { width: 80px; height: 80px; background-color: red; transition: all 1s ease 200ms; } .example-transition:hover { width: 160px; height: 160px; background-color: blue; }
transition関連のプロパティは、あくまで現在の(元の)状態を示す側に記述する。:hoverなどの側に書くと、挙動が意図したものではなくなってしまうので注意。
参考リンク
animation
- :hoverなどのきっかけがなくても、即実行可能。
- キーフレームを指定し、より細かいアニメーションが可能。
- キーフレームの情報と通常の宣言を完全に分けて記述できるので、アニメーション情報を再利用しやすい。
- ループさせられる。
基本
アニメーションさせたい要素にanimation関連のプロパティを設定し、各キーフレームの情報は@keyframesという@ 規則(@ルール)で書く。
一見するとtransitionのほうがシンプルなようにも思えるが、実際にはこちらのほうが直感的でわかりやすい。
@keyframes
「@keyframes + 固有名」で宣言。その中カッコ { } の内部で「%」指定でキーフレームの情報を書いていく。
0%(初期状態)はfrom、100%(終了時)はtoで置き換えられる。
この@keyframesは、下記のanimation-nameを指定するセレクタの前でなく、後でも構わない。
@keyframes sample { from { width: 50px; } 50% { height: 80px; } to { width: 150px; } }
Chrome、SafariといったWebKit系のブラウザでは、2013年4月12日現在の最新版でも「@keyframes」に対応しておらず、ベンダープレフィックスをつけた「@-webkit-keyframes」で指定しないと認識されない。
手元で確認したところ、Firefox、Operaの最新版ならば問題なく標準の「@keyframes」が使えた。
Firefoxならば「@-moz-keyframes」と書く。
いくらなんでも@keyframesまでブラウザごとに記述するのは煩雑すぎるので、SaasやLESSを使うか各種ジェネレーターを使ったほうがいいだろう。
各種プロパティ
animation-name
@keyframesで指定した名前を指定。
animation-duration
アニメーション全体の時間を指定。
(transition-durationと同じ)
0s | すぐ変化(アニメなし) |
秒 | 数値+「s」(10秒なら「10s」) |
ミリ秒 | 数値+「ms」(10ミリ秒なら「10ms」) |
transition-timing-function
アニメーションの変化のパターンを指定。
(transition-timing-functionと同じ)
animation-delay
アニメーション開始を遅らせる時間を指定。
(transition-delayと同じ)
0s | すぐ変化(アニメなし) |
秒 | 数値+「s」(10秒なら「10s」) |
ミリ秒 | 数値+「ms」(10ミリ秒なら「10ms」) |
マイナスの値を指定した場合はすぐ変化がはじめるが、その分だけ実際のアニメーションが途中から開始される。
くわしくは、transition-delayを参照。
animation-iteration-count
アニメーション全体をくり返す回数。
1 | 1回のみ |
infinite | 無限ループ |
整数 | 0は再生されない。マイナスの数は0と解釈。 |
animation-direction
アニメーションをどちらの方向に再生するか。逆か否か。
また、アニメーションを2回以上くり返す場合、どちらの方向に再生するか。
normal | 通常の再生をくり返すのみ |
alternate | くり返しの際、偶数回は逆方向に再生 |
reverse | ずっと逆方向に再生 |
alternate-reverse | alternateとは逆。奇数回を逆方向、偶数回を正方向に再生。 |
alternateを指定した場合
「行って帰って行って帰って……」をくり返す。
1回目:正方向 => 2回目:逆方向 => 3回目:正方向 => 4回目:逆方向……
つまり、奇数回は正方向に、偶数回は逆方向になる。alternate-reverseの場合はその逆になる。
逆方向への再生の場合、animation-timing-functionで指定した変化のパターンも逆になる。
たとえば、ease-in(ゆっくり入って加速)はease-out(速く入ってゆっくり終わる)になる。
また、animation-delayにマイナスの値を指定している場合、それぞれ冒頭部分が指定値の絶対数分カットされる。
animation-fill-mode
アニメーションの再生前、再生後の状態を指定。
none | 要素の元のスタイルのまま |
forwards | 再生後、要素のスタイルは最後のキーフレームの状態のままになる。 通常は100%(to)のまま、animation-directionの指定で逆方向に再生したあとの場合は、0%(from)のままになるということ。 |
backwards | 再生前、要素のスタイルは最初のキーフレームの状態になる。 通常は0%(from)、animation-directionの指定で逆方向に再生したあとの場合は、100%(to)になるということ。 |
both | 再生前、要素のスタイルは最初のキーフレームの状態になり、再生後、要素のスタイルは最後のキーフレームの状態のままになる。 forwardsとbackwardsを両方指定するようなもの。 |
なぜこの設定が必要なるかというと、0%(from)が要素の初期状態ではなく、また、100%(to)が要素の最後の状態でもないため。
.sample { width: 80px; animation-name: abc; animation-duration: 1s; } @keyframes abc { form { width: 100px; } to { width: 200px; } }
この場合、再生前/再生後――要するにアニメーションしていない間は、widthは80pxになる。
Flashなどに慣れた人間からすると違和感があるが、CSSのanimationでは要素そのもののスタイルとキーフレームでのスタイルを明確に分けているのでこうなる。
Flashなどのアニメーションと同じようにするには、bothを適用しておけばいい。
animation-play-state
再生中か一時停止か指定。
running | 再生中 |
paused | 一時停止 |
いずれにせよ、JavaScriptで制御するしかないのであまり意味がないプロパティ。おそらく、初期状態では一時停止にして、JavaScriptを使って任意のタイミングで再生させるために使う。
「他の方法で同じ効果を得られるという理由から仕様からの削除が検討」されているらしい(リンク)。使わないほうが無難。
プロパティをまとめて指定
基本的に、以下の順序で指定したほうがいい。
animation-name animation-duration animation-timing-function animation-delay animation-iteration-count animation-direction animation-play-state
transitionと同じくすべての項目が省略可能で順不同だが、2つある時間指定の項目は上記の順番で解釈される。
animation: 2s 500ms;
たとえばこの場合、animation-durationが2s、animation-delayが500msと解釈される。
JavaScriptイベント
AnimationEventオブジェクト
プロパティ
animationName | animation-nameで指定された値 |
elapsedTime | 秒単位の実数で示される時間経過。一時停止の状態だった時間と、animation-delayで指定された分は含まない。 animationstartイベントでは通常ゼロになるが、animation-delayがマイナスの値であった場合、elapsedTimeはアニメーションがカットされた分、すなわちanimation-delayの絶対値になる。 animation-delayが-2sだったら2.0になるということ) |
psedoElement | アニメーションが起きたCSS擬似要素の名前。擬似クラスと区別するために、先頭にセミコロンが2つ付く(::first-lineなど)。
アニメーションが起きたのが通常の要素の場合、空文字列になる。 |
イベントタイプ
animationstart | アニメーションの実際のスタート時に発生。animation-delayで指定したあとに。 |
animationend | アニメーションが終了した際に発生。 |
animationiteration | アニメーションがくり返されるときに発生。あくまでくり返しのときのみで、アニメーションが終わるときはanimationendイベントのみが発生し、animationiterationイベントは発生しない。 |
例
HTML
<div class="sample-anim"></div>
CSS
.sample-anim { width: 80px; height: 30px; animation-name: abc; animation-duration: 4s; animation-delay: 500ms; animation-direction: alternate; animation-iteration-count: 5; } @keyframes abc { from { width: 100px; background-color: red; } 50% { width: 125px; } to { width: 200px; background-color: blue; } }
参考リンク
ベンダープレフィックス(接頭辞)
-webkit- -moz- -o- -ms-Leave a comment