背景
2022年ごろから、独立transformプロパティとしてtranslate
rotate
scale
が各ブラウザに実装されました。
これにより、transform
の上書きや処理順などを気にせずに座標変換をすることができるようになり、手軽に使用しやすくなりました。
transform: rotate()
とrotate
は、一般に同じ動作をすると思われており、実際にほとんどのケースでそれは間違っていないのですが、そうではない場合もあります。
概要
transform:rotate()
とrotate
はだいたい同じ動作をするが、offset
が絡むと違う動作をする。
実際の動作
以下のCodePenは、円形のモーションパスを移動させながらtransform:rotate()
とrotate
をそれぞれ360deg
までアニメーションさせているものです。回転アニメーション以外のプロパティは全く同じです。
See the Pen transform:rotate() vs rotate by lhankor_mhy (@lhankor_mhy) on CodePen.
初見ではなぜこうなったかよくわかりませんでした。
なので、モーションパスを止めてみるとこうなりました。
See the Pen transform:rotate() vs rotate by lhankor_mhy (@lhankor_mhy) on CodePen.
ご覧の通り、回転の中心点が異なります。
解説
簡単な解説
rotate
はtransform-origin
がoffset
による変形の前の位置になります。言い換えると、offset-path: none
の時のtransform-origin
の場所を変形の原点とする、ということです。
逆にtransform: rotate()
は、offset
による変形後の、見たままのtransform-origin
です。
図示
See the Pen rotate and offset by lhankor_mhy (@lhankor_mhy) on CodePen.
仕様
仕様書によると、このようになっています。
The transformation matrix is computed from the transform, transform-origin, translate, rotate, scale, and offset properties as follows:
- Start with the identity matrix.
- Translate by the computed X, Y, and Z values of transform-origin.
- Translate by the computed X, Y, and Z values of translate.
- Rotate by the computed about the specified axis of rotate.
- Scale by the computed X, Y, and Z values of scale.
- Translate and rotate by the transform specified by offset.
- Multiply by each of the transform functions in transform from left to right.
- Translate by the negated computed X, Y and Z values of transform-origin.
変形行列の合成について正直しっかり理解できていないのですが、translate
→rotate
→scale
→offset
→transform
の順番に処理がされるようです。
rotate
が処理された後にoffset
が処理され、さらにその後にtransform
が処理されていることが、この動作の違いを生んでいるのだろうと思います。
ですので、rotate
だけではなくて、translate
やscale
もこの影響を受けています。