今回のお題は、ボタンのアニメーションだ。マウスポインタを重ねると、周囲が勢いよく回る(サンプル1)。「Button Spinner Test」のデザインとアニメーションをもとに、コードは絞り込んでわかりやすく組み立て直した。animation
プロパティで細かい動きをつくり込んでいる。
ボタンをつくる要素と静的なスタイル
HTMLドキュメントの<body>
要素に加えるボタンをつくる要素の記述と、アニメーションを与える前の静的なスタイルはコード1のとおりだ(図1)。Google FontsのRalewayを使っている。また、<script>
要素に-prefix-freeを読み込んで、ベンダープレフィックスは省いた(第1回の「ベンダープレフィックスと-prefix-free」の項参照)。
ボタンにマウスポインタが重なったときのアニメーション
ボタンにマウスポインタが重なったときの基本的なアニメーションを加えよう。ボタンの縁として見える大もとの要素(class
属性"circle")は、以下のようにはじめ背景と同じ色(steelblue)にしておき、:hover
擬似クラスで白に変える。内側(class
属性"label")は背景色を明るい青(lightsteelblue)に、テキストは白にした。アニメーションはtransition
プロパティで定めている。ボタンの縁には待ち時間を加えたので、少しためてから動き始める。
これで、ボタンにマウスポインタを重ねると、内側の色が明るく変わりテキストは白くなる。そして、白い縁が広がるように表れる(図2)。スタイルの定めは以下にコード2としてまとめた。
ボタンの周囲を回るアニメーション
残るは、ボタンの左右両側に見える要素(class
属性"spinner")を、以下のようにマウスポインタが重なったとき回す(@keyframes
規則clockwise)。マウスポインタが外れたときの逆回しも、併せてanimation
プロパティに定めた(@keyframes
規則anti-clockwise)。:hover
擬似クラスには、少し遅れた拡大のアニメーションも加えてある(@keyframes
規則scale)。それぞれの@keyframes
規則は後で示そう。
さらに、マウスポインタを重ねたときには、ボタンの左右両側の要素(class
属性"spinner")はfilter
プロパティにblur()
関数でぼかした。引数にはぼけ幅を渡す。また、cubic-bezier()
はタイミング関数を4つの引数で定める。引数の与え方と値がどう変わるかについては、次項で補おう。
回転の時計回り(clockwise)と反時計回り(anti-clockwise)および拡大(scale)の@keyframes
は、それぞれつぎのとおりだ(第10回の「五角柱を水平に回す」参照)。回転角に360度より大きい値を与えれば1周以上くるくると回ることになる。これで、お題のアニメーションはでき上がった。ボタンにマウスポインタを重ねると、周囲が広がりながら、左右の要素はくるくると回る(図3)。スタイルの定めは以下のコード3にまとめた。
cubic-bezier()関数とopacityプロパティの役割
cubic-bezier()
関数について、補っておく。この関数は4つの引数でタイミング関数を定める。xy座標平面で始点が(0, 0)、終点は(1, 1)として、ベジエ曲線の各コントロールポイントのxy座標値を、つぎのようにcubic-bezier()
関数に渡す。たとえば、デフォルトの関数キーワードease
は、cubic-bezier(0.25, 0.1, 0.25, 1.0)を表す。
「Cubic Bezier Generator」でcubic-bezier()
関数の4つの引数値を入力すると、値の変わり方がグラフで示される。前掲コード3で用いたcubic-bezier(1, 0.22, 1, 0.92)を試すと、つぎの図4のようにease-in
にもっとめりはりを利かせた曲線になる。
もうひとつ、ボタンの大もとの要素(class属性"circle")にopacity
プロパティをなぜ加えたのか、疑問に思われたかもしれない。つぎのように、このプロパティを与えないと、実はボタンの左右の要素のアニメーションが、マウスポインタを重ねたとき円形の外側にはみ出してしまう(図5)。そこで、opacity
プロパティを不透明(1)に近い数値(0.99)とした。