CSS3 3D效果

这里单独写一篇关于CSS3 3D动画的博文,和大家分享我对3D动画的认识

笛卡尔坐标系统

在说3D变换之前必须了解的一个坐标系统,浏览器对元素进行3D定位、渲染就是遵循这个笛卡尔坐标系统。

2D笛卡尔坐标系统

2D转换是沿着两个坐标轴定义,如下所示

CSS3 3D效果

值的注意的是,y轴是向下延伸,这是由于系统采用的是二维笛卡尔坐标系统。

坐标系统的X轴会沿着所要转换的元素节点向水平维度延伸,y轴则沿着垂直维度延伸。

此坐标系统的原点(图标中的“(0,0)”)默认位于所要转换的元素的中心。可通过transform-origin属性改变。

而本文重点介绍的3D transform在2D的基础上增加多一个维度。

3D笛卡尔坐标系统

CSS3 3D效果


CSS3 3D效果

坐标系统的Z轴同时与x和y轴垂直。

此坐标系统的原点(图表中的“(0,0,0)”)也默认位于所要转换的元素的中心。同样可通过transform-origin属性改变。

3D转换从IE10开始得到支持。


要实现3D效果,要使用如下css属性:

1.perspective

perspective是指景深,定一个长度值,这个值代表从这个透视长度检视物件的所有子元素。通俗点讲就是:我们离元素多远来观察这个3D视图,如下图所示:

CSS3 3D效果

一般而言,该声明应用在3D变换的兄弟元素们的父元素上。

2.perspective-origin(x,y)

perspective-origin是指景深基点,主要用来决定perspective属性的源点角度。perspective-origin属性必须定义在父元素上。通常perspective-orgin属性本身不做任何事情,它必须被定义在设置了perspective属性的元素上。换句话说,perspective-origin属性需要与perspective属性结合起来使用,以便将视点移至元素的中心以外位置。默认点是元素的中心点。其中X和Y的值可以是百分值、em、px,其中X也可以是字符参数值left,center,right;Y和X一样除了百分值外还可以设置字符值top,center,bottom这个看上去有点像我们background-position一样;下面给出一张图片方便大家理解:

CSS3 3D效果

上图中红点就相当于观察者的眼睛,我们在红点处观察3D元素,下面列出相应的写法:

top left、left top 等价于0 0、0% 0%

top、top center、center top 等价于50% 0

right top、top right 等价于100% 0

left、left center、center left 等价于0 50%、0% 50%

center、center center 等价于50% 50%(默认值)

right、right center、center right等价于100% 50%

bottom left、left bottom 等价于0 100%、0% 100%

bottom、bottom center、center bottom等价于50% 100%

bottom right、right bottom 等价于100% 100%

其中left,center,right是水平方向取值,对应的百分值为left=0%;center=50%;right=100%;而top,center,bottom是垂直方向的取值,其中top=0%;center=50%;bottom=100%;如果只取一个值,表示垂直方向值不变。

3.transform-style

transform-style 用于规定如何在3D空间中呈现被嵌套的元素,通俗来讲就是建立3D空间。一般而言,该声明应用在3D变换的兄弟元素们的父元素上。

transform-style:flat|preserve-3d;

flat:子元素将不保留其3D位置。(默认值)

preserve-3d:子元素将保留其3D位置。

4.transform

相对于2D变换,3D变换在原有的transform属性中添加了一下属性:

4.1 3D位移-translate3d(tx,ty,tz)

在CSS3中3D位移主要包括两种函数translateZ()和translate3d()。translate3d()函数使一个元素在三维空间移动。这种变形的特点是,使用三维向量的坐标定义元素在每个方向移动多少。其中

tx:代表x坐标位移向量的长度

ty:代表y坐标位移向量的长度

tz:代表z轴位移向量的长度。此值不能是一个百分比值,如果取值为百分比值,将会认为无效值。

衍生3个属性分别为:

translateX(tx):x轴位移向量的长度,相当于translate3d(tx,0,0)

translateY(ty):y轴位移向量的长度,相当于translate3d(0,ty,0)

translateZ(tz):z轴位移向量的长度,相当于translate3d(0,0,tz)

示例如下

CSS3 3D效果

4.2 3D旋转-rotate3d(x,y,z,angle)

rotate3d代表在3D空间,元素沿着经过原点(0,0,0)和三维坐标(x,y,z)2点的直线进行旋转。其中:

x:是一个0到1之间的数值,主要用来描述元素围绕X轴旋转的矢量值

y:是一个0到1之间的数值,主要用来描述元素围绕Y轴旋转的矢量值

z:是一个0到1之间的数值,主要用来描述元素围绕Z轴旋转的矢量值

angle:是一个角度值,主要用来指定元素在3D空间旋转的角度,如果其值为正值,元素顺时针旋转,反之元素逆时针旋转。

衍生3个属性分别为:

rotateX(angle):指定沿着X轴根据指定角度的顺时针方向旋转。相当于rotate(1,0,0,angle);

rotateY(angle):指定沿着Y轴根据指定角度的顺时针方向旋转。相当于rotate(0,1,0,angle);

rotateZ(angle):指定沿着Z轴根据指定角度的顺时针方向旋转。相当于rotate(0,0,1,angle);

示例如下:

CSS3 3D效果

4.3 3D缩放-scale3d(sx,sy,sz)

CSS3 3D变形中的缩放主要有scaleZ()和scale3d()两种函数,当scale3d()中X轴和Y轴同时为1,即scale3d(1,1,sz),其效果等同于scaleZ(sz)。使用3D缩放函数,可以让元素在Z轴上按比例缩放。默认值为1,当值大于1时,元素放大,反之小于1大于0.01时,元素缩小。

其取值说明如下:

sx:横向缩放比例

sy:纵向缩放比例

sz:z轴缩放比例

衍生3个属性分别为:

scaleX(sx):指定元素每个点在X轴的比例。相当于scale3d(sx,1,1);

scaleY(sy):指定元素每个点在Y轴的比例。相当于scale3d(1,sy,1);

scaleZ(sz):指定元素每个点在Z轴的比例。相当于scale3d(1,1,sz);

示例如下:

CSS3 3D效果

应用

下面我们绘制一个正方体

css代码如下

CSS3 3D效果

html代码

CSS3 3D效果

显示效果如下:

CSS3 3D效果

注意:transform属性中rotate和translate的顺序是很重要的,比如.top中我们先沿X轴旋转90度,此时该div的Z轴已经不是垂直屏幕指向读者,而是竖直向上了。大家可能需要一些时间研究这些代码,要从立体的角度想象rotate之后Z轴的指向。每一个面开始时都按自己的中心点旋转,旋转之后X、Y、Z轴的指向也发生了变化。