「transition: transform」はなぜ動く? CSSのtransitionとtransformの役割の違い

先日、Web制作を学んでいる受講生の方から、こんな相談をいただきました。

「transition: transform 2s linear 1s; と指定したアニメーションで、hoverすると2秒かけて四角形が右に移動する。動き自体は想定通りだが、transitionの中にtransformと書くことにどういう意味があるのか分からない」と。

実はこれ、CSSでアニメーションを学び始めた学習者がよくつまずくポイントです。今回は、この相談への回答をベースに、transitionとtransformの役割の違いを整理します。

相談内容:動きは実装できているが、書き方の意味が分からない

具体的なコードは次の通りです。

“`css
.box {
width: 80px;
height: 80px;
background: pink;
transition: transform 2s linear 1s;
}

.box:hover {
transform: translateX(400px);
}
“`

hoverすると四角形が2秒かけて右に400px移動する、という動き自体はできています。ただ、受講生の方は動画を見返したりMDNでtransformを調べたりしたうえで、「transitionの中でなぜtransformを名指しする必要があるのか」という点に疑問を持たれていました。自分で仮説を立てて調べる、という姿勢はとても良い学習の仕方です。

原因:transitionとtransformは、そもそも役割が違う

結論から言うと、この2つは別の役割を持つプロパティです。

  • transform:要素の見た目(位置・大きさ・回転など)を変化させるプロパティ
  • transition:あるプロパティの値が変化したときに、その変化を「一瞬」ではなく「なめらかに」見せるための仕組み

つまりtransformが「何をどう変えるか」を決め、transitionが「その変化をどう見せるか」を決めている、という関係になっています。

解決策:それぞれを指定しなかった場合で理解を深める

それぞれを指定しなかった場合を考えると、役割の違いがより分かりやすくなります。

① transitionを指定しなかった場合

“`css
.box:hover {
transform: translateX(400px);
}
“`

このようにtransitionなしでtransformだけを指定すると、hoverした瞬間に四角形が「パッ」と瞬間移動します。なめらかさは一切ありません。

② transform(プロパティ名)を指定しなかった場合

“`css
.box {
transition: 2s linear 1s;
}
.box:hover {
transform: translateX(400px);
}
“`

実は、transition-property(何を対象にするか)を省略した場合、初期値はallになります。そのため上のように書いても、hoverでtransformが変化すれば、ちゃんと2秒かけてなめらかに動きます。

つまり「transformと名指ししないと動かない」わけではありません。では何のために名指しするかというと、

  • 複数のプロパティが同時に変化する要素で、特定のプロパティだけをなめらかにしたい場合
  • 意図しないプロパティまで巻き込まれるのを防ぎたい場合

など、対象を絞り込む目的で指定します。今回のコードでは、対象を明確にするためにtransformと書かれている、ということです。

まとめ:transformが「何を変えるか」、transitionが「どう見せるか」

  • transform:何を変化させるか(今回は位置)
  • transition:その変化をどう見せるか(今回は2秒・等速・1秒遅延)
  • transitionの中のtransform(プロパティ名):なめらかにする対象を絞り込むための指定(省略するとallになり、結果的に動きが変わらないこともある)

Webサイトの制作やコーディングのセカンドオピニオン、またはメンタリングにお困りの方は、お気軽にご相談ください。

▶︎ 平林 颯太への制作・コンサルティング相談はこちら(Smile Creations お問い合わせフォーム)
▶︎ MENTAでのスポット相談はこちら