〽️記述と単位。 〽️transformの複数記述。 〽️後に書いたものが内包される。 〽️もう1つのやり方。 〽️+αが質感を生み出す。
⬆︎CSSアニメーションについてのまとめページはこちら。
要素が上から落ちてくるCSSアニメーション⬆︎。
transform:translateYを使っているのですが、これだけだとどこか機械的、というか、「物理感」がないですよね。
これならどうでしょうか?
keyframes80%ですこし縮んで元にもどる。translateとscaleの両方を施しています。
「CSSアニメーション作り方」、今回は複数のtransform関数を扱う方法や注意点について紹介していきます。メインの動きにさりげない+αを添えることによって、アニメーションをとても豊かなものに仕上げることができます。
transformに2つ以上の関数を指定したいときには、1つのプロパティに値を半角スペースではさんで記述します。
#element { transform:「「1translateX(20%) rotate(1turn)」」; }
よくあるのが、この⬇︎ように書いてしまって、「片方しか動かない!」となるケースです。
#element { transform:translateX(20%); transform:rotate(1trun); }
transform自体が1つのプロパティなので、これを例えば<p>要素のattributeである「color」などでたとえると、
p { color:green; color:blue; }
と同じことに成増。
同じ「color」というプロパティをはじめにgreen、後からblueと上書きしている状態です。
ブラウザ上に表示されるのは、後から上書きした「blue」の状態が採用されます。
transfromプロパティは、「ショートハンド的な書式である」と解釈するのが良いでしょう。
あらかじめ各値の初期値が指定されており、明記したもの以外は初期値がそのまま採用される、ということです。
transform関数を複数指定する場合、「後に書いた値が内包される」という現象がおきます。
どういうことなのか?実際に動かしてみて、その様子をみていきます。
要素に対して、回転+移動のアニメーションをつけてみましょう。
#element { animation:elm 4s linear infinite; } @keyframes elm { to { transform:「「1translate(200%) rotate(2turn)」」; } }
いまキーフレームには、translateを先に、rotateを後に記述しました。
結果はこの⬆︎ように。
言葉で言い表すなら「回転している状態を移動させている」といったところです。
後に記述したrotate(回転)アニメーションは内包され、その外側でtranslate(移動)アニメーションが起こっています。
それでは移動と回転の記述順を入れ替えてみます。
transform:「「1rotate(2turn) translate(150%)」」;
こんどは後に書いた「移動」が内包され、それに対して回転が掛かりました。
「移動している状態が回転している」と言えます。
このようにtransform関数を複数指定する場合には、記述順で結果が変わってくるので注意しましょう。
またtransformには、同じ種類の関数を複数指定することもできます。
transform:「「1rotate(1turn) rotateX(1turn)」」;
これについても後に記述したX軸回転が内包され、外側にZ軸回転が施されました。
つぎは全く同じものを指定してみます。
transform:「「1skew(45deg) skew(45deg)」」;
この⬆︎ような結果になりました。
「skew45°+45°で、結果skew90°になるのでは?」と思うかもしれません。しかし実際そうであれば、要素は潰れて見えなくなってしまうはずです。
あくまで「skew45°が内包された状態」に対してその外側からskew45°が掛かっているのです。
複数のtransformを適用させるもう1つの方法としては、HTML要素のほうを親子構造にして、それぞれに別の関数を指定するやり方です。
■ HTML
「「4<div id = "soto">」」 <img id = "elm" src = "elm.png"> 「「4</div>」」
アニメーションの対象がimg要素だったとすると、その外側を<div> 〜 </div> で囲みます。
その上で#sotoに対してと、#elmに対して別々のtransformアニメーションを仕込みます。
これまでお話ししてきた通常の方法で差し支えがなければ、それに越したことはありません。
このやり方が必要となってくるのは、以下の問題がある場合です。
1つめは複数のtransform関数のタイミングが違っているときです。
要素がscale0%の状態で始まり、キーフレーム50%の時点でscale100%に。キーフレーム100%までその状態を保ちます。
ここに回転が加わります。rotateはキーフレーム0〜100%まで掛けて1回転させたい。
#element { animation:elm 4s infinite; } @keyframes elm { from { transform:rotate(0deg) scaleX(0) } 50% { transform:「「4rotate(0.5turn) 」」scaleX(1); } to { transform:rotate(1turn) scaleX(1); }
scaleのほうは全体の半分のところで終了するため、50%のところにキーフレームを打ちました。一方rotateについてはまだ進行中なので、50%の時点の状態、「0.5turn」としています。
結果⬆︎です。
scaleに関してはキーフレーム50%のところまでスムーズに流れています。ところが、rotateのほうは50%のところで一旦停止してしまって、スムーズではありません。
原因はanimation-timing-functionが初期値のeaseになっているからです。
「linear」であれば進捗が均等に振り分けられるため、問題はないのですが、linear以外のtiming-function下では「キーフレーム50% = 進捗50%」とはならないため、途中でキーフレームを打つとスムーズな動きが失われてしまうのです。
「「4<div id = "soto">」」 <img id = "elm" src = "elm.png"> 「「4</div>」」
画像要素を<div id = "soto">で囲み、#sotoと#elmに対し個別のCSSアニメーションを指定します。
#soto { animation:soto 4s infinite; } @keyframes soto { to { transform:rotate(1turn); } } #elm { animation:elm 4s infinite; } @keyframes elm { from { transform:scaleX(0); } 50% { transform:scaleX(1); } }
rotateの動きも一旦停止することなく、スムーズになりました。
要素自身をその中心を軸に「自転」させつつ、別の基準点を中心として「公転」もさせたい。
ということは2つの動きにおいてtransform-originが違ってくることに成増。
CSSのtransform-originは一意にしか指定できないので、こういった場合も親子構造にする必要があります。
#soto { 「「4transform-origin:150%;」」 animation:el8 linear 4s infinite; } #elm { animation:elm 4s linear infinite; } @keyframes elm { to { transform:rotate(1turn); } }
自転・公転ともに上手くいきました。
親と子にそれぞれ1turnを指定しているので、「element」は2回転することに成増。
「「3違うプロパティの場合にのみ有効」」 #element { animation:「「4animateA 2s,animateB 2s」」; }
ちなみに1つの要素に対して複数のCSSアニメーションを指定することもできます⬆︎。
ただしそれぞれのキーフレームで同じプロパティの操作を行うと、干渉し合ってうまくいきません。
例えば「animateA」がopacity、「animateB」がbackground-colorの変化。これならちゃんと動きます。
しかし片方がrotate、もう片方がskewの操作..といった場合。2つはもともと同じtransformプロパティとなるので、不具合が生じてしまいます。
最後までお読みくださり、ありがとうございました。
今回取り上げたtransformの複数指定。
静止している要素ならいいが、アニメーションさせるとなるといくつか「フォローすべき点」が出てきましたね。
しかし。単一のtransform関数にさりげないもう1つの関数を添えてやると、より自然で豊かなCSSアニメーションを実装することができます。
実戦では試す機会も多いかと思いますので、是非覚えておいてください。
ではまた〜 🎵
swift、web、ガジェットなど。役立つ情報や観ていてたのしいページを書いていきたいと思います。