原森情報技術研究所 WEBコンテンツ企画・制作・運営・サポート / 兵庫県 神戸市 明石市 /

3d変形時の奥行きの深さ指定

perspective、transform : perspective / 3d変形時の奥行きの深さ指定

perspectiveのサンプル

例1

A rotateY (30deg) , B rotateY (60deg)
親BOX perspective なし

説明

例2

C rotateY (30deg) , D rotateY (60deg)
親BOX perspective : 100px

例3

E perspective (100px) rotateY (30deg) ,
F perspective (100px) rotateY (60deg)
親BOX perspective なし

例4

G perspective (100px) rotateX (45deg)
H rotateX (45deg) perspective (100px)

説明

例5

I/ pp (100px) rY (30deg) rX (45deg)
J/ rY (30deg) pp (100px) rX (45deg)

説明

おまけ

K/ rY (30deg) rX (45deg)
L/ rX (45deg) rY (30deg)

説明

サンプル例1、例2、例3の内容

【例1】親div(白枠) に perspective を指定せずに、マウスホバーでボックスを回転。
A rotateY(30deg) , B rotateY(60deg)

【例2】親div(白枠) に perspective : 100px を指定し、マウスホバーでボックスを回転。
D rotateY(30deg) , E rotateY(60deg)

※ 例1では perspective を指定していないので、ボックスが回転しても上下の辺は並行のままですが、例2の方は perspective を指定しているので、奥行きがある見栄えになります。(perspectiveの起点は省略しているので白枠の親ボックスの中央になります)

【例3】親div(白枠) に perspective を指定せずに、マウスホバーでボックスを回転。
E perspective(100px) rotateY(30deg) , F perspective(100px) rotateY(60deg)

例3は例2に似てますが、各回転するBOX自体にperspectiveを指定しています。
※ transform : perspective(数値px) で親ではなく直接要素に指定。

※ 例2の方は perspective の起点 (次項のperspective-origin) の指定なしの状態なので、デフォルトのcenter centerになっている。なのでウインドウサイズによりボックスの表示位置が異なるため、回転時の角度が異なります。(確認方法はブラウザの横幅のウインドウサイズを最小状態にしてみる等)

※ 例3は 変化するオブジェクトの center center(perspective-origin指定なしのデフォルト)を起点に perspective が 指定されているため、例2と異なり、親divのサイズに関係なく、回転等の奥行きが計算されるので、ウインドウサイズにより回転の角度が変化することはありません。

例1へ

サンプル例4の内容 transformのプロパティの指定順

【例4】
G transform : perspective(100px) rotateX(45deg)
H transform : rotateX(45deg) perspective(100px)
Hの結果のように、transformのプロパティでperspectiveを指定する場合、他のプロパティより前に指定しないと、回転させてから奥行きを100pxにするというような状態になっていることが確認できるかと思います。

例4へ

サンプル例5の内容

【例5】順番の違いで変化の違いをさらに確認する例。 I transform : perspective(100px) rotateY(30deg) rotateX(45deg)
J transform : rotateY(30deg) perspective(100px) rotateX(45deg)

例5へ

おまけ「transform のプロパティの指定順を変えるとどうなる実験」

案外、気づいてない人がいるかもしれないので、transform のプロパティの指定順で変化が異なる例を紹介しておきます。
※ perspective の研究ページだけど、単純にrotateのみで比較しています。
K transform : rotateY(30deg) rotateX(45deg)
L transform : rotateX(45deg) rotateY(30deg)
rotateYとrotateXの順番を逆にしただけなんですけど、マウスホバーしてみると…。

まとめ

transform等で思ったような動きにならない場合、transformのプロパティの指定順に統一感がなく、適当に思いついた順に並べてしまっている、などが原因だったりすることもあるので注意が必要です、というのが、今回のおまけネタでした。

奥行きの深さ指定プロパティ

transform : perspective (num)
指定した要素の深度。深度num (0以上を指定) はz=0からの距離。例 transform : perspective(100px)
perspective : num
指定した要素の子要素全体の深度。深度num (0以上を指定) はz=0からの距離。例 perspective : 100px

ページトップへ

top > css3研究 > 
3d変形時の奥行きの深さ指定

表示位置移動

translate(x) / x…[length]
translate(x,y) / x,y…[length]
translate(x) = translate(x,x)

translate3d(x,y,z) / x,y,z…[length]

translateX(x) / x…[length]
translateX(x) = translate(x,0)

translateY(y) / y…[length]
translateY(y) = translate(0,y)

translateZ(z) / z…[length]
translateZ(z) = translate3d(0,0,z)

拡大・縮小

scale(x) / x…[数量]
scale(x,y) / x,y…[数量]
scale(x) = scale(x,x)

scale3d(x,y,z) / x,y,z…[数量]

scaleX(x) / x…[数量]
scaleX(x) = scale(x,1) = scale3d(x,1,1)

scaleX(x) / x…[数量]
scaleX(x) = scale(x,1) = scale3d(x,1,1)

scaleY(y) / y…[数量]
scaleY(y) = scale(1,y) = scale3d(1,y,1)

scaleZ(z) / z…[数量]
scaleZ(z) = scale3d(1,1,z)

回転

rotate(a) / a…[角度]
aが正の値なら時計回り

rotate3d(x,y,z,a) / x,y,z…[数量] a…[角度]

rotateX(a) / a…[角度]
rotateX(a) = rotate3d(1,0,0,a)

rotateY(a) / a…[角度]
rotateY(a) = rotate3d(0,1,0,a)

rotateZ(a) / a…[角度]
rotateZ(a) = rotate3d(0,0,1,a)

傾斜変形

skew(ax [,ay]) / ax,ay…[角度]
ay省略時はaxのみの変形。※skewは非標準となった

skewX(a) / a…[角度]

skewY(a) / a…[角度]

行列指定

matrix(a , c , b , d , tx , ty)
線形 transform a , b , c , d …[数量](Gecko系のみlength可) 移動量 tx , ty …[length]

matrix3d(a1 , b1 , c1 , d1 , a2 , b2 , c2 , d2 , a3 , b3 , c3 , d3 , a4 , b4 , c4 , d4)
線形 transform a1 , b1 , c1 , d1 , a2 , b2 , c2 , d2 , a3 , b3 , c3 , d3 , d4 …[数量] 移動量 a4 , b4 , c4 …[length]

カテゴリMENU
お問い合せ