[CSS] 3D変形(transform)のまとめ

CSS3からは、要素の3D表現が可能になっている。

基本的には、2D変形の機能と同じ形式。

ただし、ブラウザごとに微妙に動作が異なるので注意。

また、全体的にSassなどのメタ言語を使わないと厳しいか。

基本

基本的に、transformプロパティの値として各種の関数形式で指定していく。

引数が複数ある場合は、関数形式なのでコンマで区切る。

例:rotate3dの場合

transform: rotate3d(70deg, 30deg, 10deg);

すでに大半のブラウザで対応していると思われるが、念のため「-webkit-」などのベンダー・プレフィックスをつけておいたほうがいいだろう。

座標は左手座標系

transformでの座標系は、DirectXと同じ左手座標系。

といっても、CSSなのであくまで左上原点であり、y座標は下方向がプラスになる。

transform-originプロパティ

各種変形を適用する際に基準となる原点(アンカーポイント)を、ローカル座標で指定する。

プロパティなので、x(水平方向)、y(垂直方向)、z(奥行き)の値をスペース区切りで指定する。デフォルト値は50% 50% 0。

xとyに関しては、left・center・right、top・center・bottomのキーワードで指定することも可能。

transform-origin: left top;

transform-styleプロパティ

値は、flat(デフォルト)とperspective-3dのみ。

子要素を親要素の2D平面に投影するか(flat)、実際の3Dとするか(perspective-3d)。

flatのほうは、特定の要素の平面にレンダリング結果をベイクするようなもの(?)。

perspective():正投影(遠近感)の指定

その名のとおり、正投影の深度(遠近感)を指定する。

引数は、視点からz値が0の位置までの距離を指定する。負の値は指定できない。

matrix3d():行列の適用

3Dの計算・プログラミングでよく使う、4×4の正方行列を16個の引数として適用する。

transform: matrix3d(
	1, 0, 0, 0,
	0, 1, 0, 0,
	0, 0, 1, 0,
	0, 0, 0, 1
);

3Dの知識が豊富で、かつSassなどのメタ言語を扱えるのなら、こちらのほうが手っ取り早い。

しかし、そうでなくても、下記の各種関数を使えば行列の知識がなくても3D表現は可能。

translate3d():平行移動

translate3d(x, y, z)
translateX()
translateY()
translateZ()

transform: translate3d(10, -10, 5);

値は、pxなどの数値で指定していく。

translate3d()の第2引数以降は省略できる。デフォルト値は0。

scale3d():拡大縮小

scale3d(x, y, z)
scaleX()
scaleY()
scaleZ()

transform: scale3d(1, 1.5, 1)

値は1を100%とする実数値で指定する。

なお、scaleX()などで指定した場合、他の軸の比率は1となる。

マイナスの値を指定した場合、表示を反転させることができる。

rotate3d():回転

rotate3d(vx, vy, vz, deg)
rotateX()
rotateY()
rotateZ()

値は度数法で「deg」を使い、マイナスの値も指定できる。

rotate3d()では、いわゆるクオータニオンを使う。最初の3つの引数に方向ベクトルを指定する。正規化されていないくても自動的に処理されるが、それぞれの値の2乗の合計が1にならないと、つまりクオータニオンとして計算可能な値でないと、rotate3d()の処理そのものがキャンセルされる。

なお、rotateX()などで個別に各軸の回転を指定する場合は、特定の軸回転しかできなくなる「ジンバルロック」の問題に気をつける必要がある。

所感

全体としてシンプルだが、やや面倒なのでSassなどを使わないと全体の調整が難しい気がする。

ちょっとした3D表現に使うくらいにとどめておいたほうがいいかも。

CSS

Posted by takasho