三维变换使用基于二维变换的相同属性,如果您熟悉二维变换,你们发现3D变形的功能和2D变换的功能相当类似。CSS3中的3D变换主要包括以下几种功能函数:

  • 3D位移:CSS3中的3D位移主要包括translateZ()和translate3d()两个功能函数;
  • 3D旋转:CSS3中的3D旋转主要包括rotateX()、rotateY()、rotateZ()和rotate3d()四个功能函数;
  • 3D缩放:CSS3中的3D缩放主要包括scaleZ()和scale3d()两个功能函数;
  • 3D矩阵:CSS3中3D变形中和2D变形一样也有一个3D矩阵功能函数matrix3d()。

CSS3 3D位移

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

translate3d(tx,ty,tz)

其属性值取值说明如下:

  • tx:代表横向坐标位移向量的长度;
  • ty:代表纵向坐标位移向量的长度;
  • tz:代表Z轴位移向量的长度。此值不能是一个百分比值,如果取值为百分比值,将会认为无效值。

一起来看一个简单的实例,加深对translate3d()函数的理解:

html:

<div class="stage s1"><div class="container"><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="70" height="100" /><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="70" height="100" /></div>
</div>
<div class="stage s2"><div class="container"><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="70" height="100" /><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="70" height="100" /></div>
</div>

css:

.stage {width: 300px;height: 300px;float: left;margin: 15px;position: relative;background: url(http://www.w3cplus.com/sites/default/files/blogs/2013/1311/bg.jpg) repeat center center;-webkit-perspective: 1200px;-moz-perspective: 1200px;-ms-perspective: 1200px;-o-perspective: 1200px;perspective: 1200px;
}
.container {position: absolute;top: 50%;left: 50%;-webkit-transform-style: preserve-3d;-moz-transform-style: preserve-3d;-ms-transform-style: preserve-3d;-o-transform-style: preserve-3d;transform-style: preserve-3d;
}
.container img {position: absolute;margin-left: -35px;margin-top: -50px;
}
.container img:nth-child(1){z-index: 1;opacity: .6;
}
.s1 img:nth-child(2){z-index: 2; -webkit-transform: translate3d(30px,30px,200px);-moz-transform: translate3d(30px,30px,200px);-ms-transform: translate3d(30px,30px,200px);-o-transform: translate3d(30px,30px,200px);transform: translate3d(30px,30px,200px);
}
.s2 img:nth-child(2){z-index: 2; -webkit-transform: translate3d(30px,30px,-200px);-moz-transform: translate3d(30px,30px,-200px);-ms-transform: translate3d(30px,30px,-200px);-o-transform: translate3d(30px,30px,-200px);transform: translate3d(30px,30px,-200px);
}

效果如下所示:

从上图的效果可以看出,当z轴值越大时,元素也离观看者更近,从视觉上元素就变得更大;反之其值越小时,元素也离观看者更远,从视觉上元素就变得更小。

在CSS3中3D位移除了translate3d()函数之外还有translateZ()函数。translateZ()函数的功能是让元素在3D空间沿Z轴进行位移,其基本使用语法如下:

translateZ(t)

取值说明如下:

  • t:指的是Z轴的向量位移长度。

使用translateZ()函数可以让元素在Z轴进行位移,当其值为负值时,元素在Z轴越移越远,导致元素变得较小。反之,当其值为正值时,元素在Z轴越移越近,导致元素变得较大。在上例的基础上,我们稍加变化一下,将translate3d()函数换成translateZ()函数:

.s1 img:nth-child(2){z-index: 2; opacity: .6;-webkit-transform: translateZ(200px);-moz-transform: translateZ(200px);-ms-transform: translateZ(200px);-o-transform: translateZ(200px);transform: translateZ(200px);
}
.s2 img:nth-child(2){z-index: 2; -webkit-transform: translateZ(-200px);-moz-transform: translateZ(-200px);-ms-transform: translateZ(-200px);-o-transform: translateZ(-200px);transform: translateZ(-200px);
}

效果如下:

效果再次证明了translateZ()函数仅让元素在Z轴进行位移,当其值越大时,元素离观看者越近,视觉上元素放大,反之元素缩小。

translateZ()函数在实际使用中等同于translate3d(0,0,tz)。仅从视觉效果上看,translateZ()和translate3d(0,0,tz)函数功能非常类似于二维空间的scale()缩放函数,但实际上完全不同。translateZ()和translate3d(0,0,tz)变形是发生在Z轴上,而不是X轴和Y轴。当使用3D变形,能够在一Z轴上移动一个元素确实有很大的好处,比如说在创建一个3D立方体的盒子之时。

CSS3 3D缩放

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

scale3d(sx,sy,sz)

其取值说明如下:

  • sx:横向缩放比例;
  • sy:纵向缩放比例;
  • sz:Z轴缩放比例;

scaleZ(s)

其取值说明如下:

  • s:指定元素每个点在Z轴的比例。

scaleZ(-1)定义了一个原点在Z轴的对称点(按照元素的变换原点)。

scaleZ()和scale3d()函数单独使用时没有任何效果,需要配合其他的变形函数一起使用才会有效果。下面我们来看一个实例,为了能看到scaleZ()函数的效果,我们添加了一个rotateX(45deg)功能:

.s1 img:nth-child(2){z-index: 2; -webkit-transform: scaleZ(5) rotateX(45deg);-moz-transform: scaleZ(5) rotateX(45deg);-ms-transform: scaleZ(5) rotateX(45deg);-o-transform: scaleZ(5) rotateX(45deg);transform: scaleZ(5) rotateX(45deg);
}
.s2 img:nth-child(2){z-index: 2; -webkit-transform: scaleZ(.25) rotateX(45deg);-moz-transform: scaleZ(.25) rotateX(45deg);-ms-transform: scaleZ(.25) rotateX(45deg);-o-transform: scaleZ(.25) rotateX(45deg);transform: scaleZ(.25) rotateX(45deg);
}

其效果如下所示:

CSS3 3D旋转

到目前为止,我们已经讨论了如何让一个元素在平面上进行顺时针或逆时针旋转。在三维变形中,我们可以让元素在任何轴旋转。为此,CSS3新增三个旋转函数:rotateX()、rotateY()和rotateZ()。

使用rotateX()函数允许一个元素围绕X轴旋转;rotateY()函数允许一个元素围绕Y轴旋转;最后rotateZ()函数允许一个元素围绕Z轴旋转。接下来我们简单的了解一下这三个旋转函数。

rotateX()函数指定一个元素围绕X轴旋转,旋转的量被定义为指定的角度;如果值为正值,元素围绕X轴顺时针旋转;反之,如果值为负值,元素围绕X轴逆时针旋转。其基本语法如下:

rotateX(a)

其中a指的是一个旋转角度值,其值可以是正值也可以是负值。

rotateY()函数指定一个元素围绕Y轴旋转,旋转的量被定义为指定的角度;如果值为正值,元素围绕Y轴顺时针旋转;反之,如果值为负值,元素围绕Y轴逆时针旋转。其基本语法如下:

rotateY(a)

其中a指的是一个旋转角度值,其值可以是正值也可以是负值。

rotateZ()函数和其他两个函数功能一样的,区别在于rotateZ()函数指定一个元素围绕Z轴旋转。其基本语法如下:

rotateZ(a)

rotateZ()函数指定元素围绕Z轴旋转,如果仅从视觉角度上看,rotateZ()函数让元素顺时针或逆时针旋转,并且效果和rotate()效果等同,但他不是在2D平面的旋转。

在三维空间里,除了rotateX()、rotateY()和rotateZ()函数可以让一个元素在三维空间中旋转之外,还有一个属性rotate3d()函数。在3D空间,旋转有三个程度的自由来描述一个转动轴。轴的旋转是由一个[x,y,z]向量并经过元素原点。其基本语法如下:

rotate3d(x,y,z,a)


rotate3d()中取值说明:

  • x:主要用来描述元素围绕X轴旋转的矢量值;
  • y:主要用来描述元素围绕Y轴旋转的矢量值;
  • z:主要用来描述元素围绕Z轴旋转的矢量值;
  • a:主要用来指定元素在3D空间旋转的角度,如果其值为正值,元素顺时针旋转,反之元素逆时针旋转。

面介绍的三个旋转函数功能等同:

  • rotateX(a)函数功能等同于rotate3d(1,0,0,a)
  • rotateY(a)函数功能等同于rotate3d(0,1,0,a)
  • rotateZ(a)函数功能等同于rotate3d(0,0,1,a)

接下来通过一个简单的实例,来实战一下3D旋转的运用:

html:

<div class="stage s1"><div class="container"><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="140" height="200" /><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="140" height="200" /></div>
</div>
<div class="stage s2"><div class="container"><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="140" height="200" /><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="140" height="200" /></div>
</div>
<div class="stage s3"><div class="container"><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="140" height="200" /><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="140" height="200" /></div>
</div>
<div class="stage s4"><div class="container"><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="140" height="200" /><img src="http://www.w3cplus.com/sites/default/files/blogs/2013/1311/cardKingClub.png" alt="" width="140" height="200" /></div>
</div>

css:

.stage {width: 300px;height: 300px;float: left;margin: 15px;position: relative;background: url(http://www.w3cplus.com/sites/default/files/blogs/2013/1311/bg.jpg) repeat center center;-webkit-perspective: 1200px;-moz-perspective: 1200px;-ms-perspective: 1200px;-o-perspective: 1200px;perspective: 1200px;
}
.container {position: absolute;top: 50%;left: 50%;-webkit-transform-style: preserve-3d;-moz-transform-style: preserve-3d;-ms-transform-style: preserve-3d;-o-transform-style: preserve-3d;transform-style: preserve-3d;
}
.container img {position: absolute;margin-left: -70px;margin-top: -100px;
}
.container img:nth-child(1){z-index: 1;opacity: .6;
}
.s1 img:nth-child(2){z-index: 2; -webkit-transform:rotateX(45deg);-moz-transform:rotateX(45deg);-ms-transform:rotateX(45deg);-o-transform:rotateX(45deg);transform:rotateX(45deg);
}
.s2 img:nth-child(2){z-index: 2; -webkit-transform:rotateY(45deg);-moz-transform:rotateY(45deg);-ms-transform:rotateY(45deg);-o-transform:rotateY(45deg);transform:rotateY(45deg);
}
.s3 img:nth-child(2){z-index: 2; -webkit-transform:rotateZ(45deg);-moz-transform:rotateZ(45deg);-ms-transform:rotateZ(45deg);-o-transform:rotateZ(45deg);transform:rotateZ(45deg);
}
.s4 img:nth-child(2){z-index: 2; -webkit-transform:rotate3d(.6,1,.6,45deg);-moz-transform:rotate3d(.6,1,.6,45deg);-ms-transform:rotate3d(.6,1,.6,45deg);-o-transform:rotate3d(.6,1,.6,45deg);transform:rotate3d(.6,1,.6,45deg);
}

效果如下所示:

CSS3 3D矩阵

CSS3中的3D矩阵要比2D中的矩阵复杂的多了,从二维到三维,是从4到9;而在矩阵里头是3*3变成4*4,9到16了。话说又说回来,对于3D矩阵而言,本质上很多东西都与2D一致的,只是复杂程度不一样而已。

3D矩阵即为透视投影,推算方法与2D矩阵类似

CSS3 3D倾斜

倾斜是二维变形,不能在三维空间变形。元素可能会在X轴和Y轴倾斜,然后转化为三维,但它们不能在Z轴倾斜。

CSS3 3D变形兼容性

3D变形在实际使用这时同样需要添加各浏览器的私有属性,并且有个别属性在某些主流浏览器中并未得到很好的支持:

  • IE10+中3D变形部分属性未得到很好的支持;
  • Firefox10.0至Firefox15.0版本的浏览器,在使用3D变形时需要添加私有属性-moz-,但从Firefox16.0+版本开始无需添加浏览器私有属性;
  • Chrome12.0+版本中使用3D变形时需要添加私有属性-webkit-;
  • Safari4.0+版本中使用3D变形时需要添加私有属性-webkit-;
  • Opera15.0+版本才开始支持3D变形,使用之里需要添加私有属性-webkit-;
  • 移动设备中iOS Safari3.2+、Android Browser3.0+、Blackberry Browser7.0+、Opera Mobile14.0+、Chrome for Android25.0+都支持3D变形,但在使用时需要添加私有属性-webkit-;Firefox for Android19.0+支持3D变形,但无需添加浏览器私有属性。

多重变形

在CSS3中,不管是2D变形还是3D变形,我们都可以使用多重变形,他们之间使用空格分隔,具体的语法如下:

transform:<transform-function><transform-function> *
其中transfrom-function是指CSS3中的任何变形函数。我们来看一个使用多重变形制作的立方体。先来看一个使用2D变形制作的立方体:

html:

<div class="stage s1"><div class="container"><div class="side top">1</div><div class="side left">2</div><div class="side right">3</div></div>
</div>

css:

@-webkit-keyframes spin{0%{-webkit-transform:rotateY(0deg);transform:rotateY(0deg)}100%{-webkit-transform:rotateY(360deg);transform:rotateY(360deg)}
}
@-moz-keyframes spin{0%{-moz-transform:rotateY(0deg);transform:rotateY(0deg)}100%{-moz-transform:rotateY(360deg);transform:rotateY(360deg)}
}
@-ms-keyframes spin{        0%{-ms-transform:rotateY(0deg);transform:rotateY(0deg)}     100%{-ms-transform:rotateY(360deg);transform:rotateY(360deg)}
}
@-o-keyframes spin{     0%{-o-transform:rotateY(0deg);transform:rotateY(0deg)}100%{-o-transform:rotateY(360deg);transform:rotateY(360deg)}
}
@keyframes spin{0%{transform:rotateY(0deg)}100%{transform:rotateY(360deg)}
}
.stage {width: 300px;height: 300px;float: left;margin: 15px;position: relative;background: url(http://www.w3cplus.com/sites/default/files/blogs/2013/1311/bg.jpg) repeat center center;-webkit-perspective: 1200px;-moz-perspective: 1200px;-ms-perspective: 1200px;-o-perspective: 1200px;perspective: 1200px;
}
.container {position: relative;height: 230px;width: 100px;top: 50%;left: 50%;margin: -100px 0 0 -50px;-webkit-transform-style: preserve-3d;-moz-transform-style: preserve-3d;-ms-transform-style: preserve-3d;-o-transform-style: preserve-3d;transform-style: preserve-3d;
}
.container:hover{-moz-animation:spin 5s linear infinite;-o-animation:spin 5s linear infinite;-webkit-animation:spin 5s linear infinite;animation:spin 5s linear infinite;
}
.side {font-size: 20px;font-weight: bold;height: 100px;line-height: 100px;color: #fff;position: absolute;text-align: center;text-shadow: 0 -1px 0 rgba(0,0,0,0.2);text-transform: uppercase;width: 100px;
}
.top {background: #9acc53;-webkit-transform: rotate(-45deg) skew(15deg, 15deg);-moz-transform: rotate(-45deg) skew(15deg, 15deg);-ms-transform: rotate(-45deg) skew(15deg, 15deg);-o-transform: rotate(-45deg) skew(15deg, 15deg);transform: rotate(-45deg) skew(15deg, 15deg);
}
.left {background: #8ec63f;-webkit-transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);-moz-transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);-ms-transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);-o-transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);
}
.right {background: #80b239;-webkit-transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);-moz-transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);-ms-transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);-o-transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);
}

效果如下:

上例通过三个面,使用多个2D变形,制作的一个3D立方体,接着我们在来使用3D多重变形制作一个3D立方体。

html:

<div class="stage"><div class="container"><div class="side front">1</div><div class="side back">2</div><div class="side left">3</div><div class="side right">4</div><div class="side top">5</div><div class="side bottom">6</div></div>
</div>

css:

@-webkit-keyframes spin{0%{-webkit-transform:rotateY(0deg);transform:rotateY(0deg)}100%{-webkit-transform:rotateY(360deg);transform:rotateY(360deg)}}@-moz-keyframes spin{0%{-moz-transform:rotateY(0deg);transform:rotateY(0deg)}100%{-moz-transform:rotateY(360deg);transform:rotateY(360deg)}}@-ms-keyframes spin{0%{-ms-transform:rotateY(0deg);transform:rotateY(0deg)}100%{-ms-transform:rotateY(360deg);transform:rotateY(360deg)}}@-o-keyframes spin{0%{-o-transform:rotateY(0deg);transform:rotateY(0deg)}100%{-o-transform:rotateY(360deg);transform:rotateY(360deg)}}@keyframes spin{0%{transform:rotateY(0deg)}100%{transform:rotateY(360deg)}}.stage {width: 300px;height: 300px;margin: 15px auto;position: relative;background: url(http://www.w3cplus.com/sites/default/files/blogs/2013/1311/bg.jpg) repeat center center;-webkit-perspective: 300px;-moz-perspective: 300px;-ms-perspective: 300px;-o-perspective: 300px;perspective: 300px;}.container {top: 50%;left: 50%;margin: -100px 0 0 -100px;position: absolute;-webkit-transform: translateZ(-100px);-moz-transform: translateZ(-100px);-ms-transform: translateZ(-100px);-o-transform: translateZ(-100px);transform: translateZ(-100px);-webkit-transform-style: preserve-3d;-moz-transform-style: preserve-3d;-ms-transform-style: preserve-3d;-o-transform-style: preserve-3d;transform-style: preserve-3d;}.container:hover{-moz-animation:spin 5s linear infinite;-o-animation:spin 5s linear infinite;-webkit-animation:spin 5s linear infinite;animation:spin 5s linear infinite;}.side {background: rgba(142,198,63,0.3);border: 2px solid #8ec63f;font-size: 60px;font-weight: bold;color: #fff;height: 196px;line-height: 196px;position: absolute;text-align: center;text-shadow: 0 -1px 0 rgba(0,0,0,0.2);text-transform: uppercase;width: 196px;}.front {-webkit-transform: translateZ(100px);-moz-transform: translateZ(100px);-ms-transform: translateZ(100px);-o-transform: translateZ(100px);transform: translateZ(100px);}.back {-webkit-transform: rotateX(180deg) translateZ(100px);-moz-transform: rotateX(180deg) translateZ(100px);-ms-transform: rotateX(180deg) translateZ(100px);-o-transform: rotateX(180deg) translateZ(100px);transform: rotateX(180deg) translateZ(100px);}.left {-webkit-transform: rotateY(-90deg) translateZ(100px);-moz-transform: rotateY(-90deg) translateZ(100px);-ms-transform: rotateY(-90deg) translateZ(100px);-o-transform: rotateY(-90deg) translateZ(100px);transform: rotateY(-90deg) translateZ(100px);}.right {-webkit-transform: rotateY(90deg) translateZ(100px);-moz-transform: rotateY(90deg) translateZ(100px);-ms-transform: rotateY(90deg) translateZ(100px);-o-transform: rotateY(90deg) translateZ(100px);transform: rotateY(90deg) translateZ(100px);}.top {-webkit-transform: rotateX(90deg) translateZ(100px);-moz-transform: rotateX(90deg) translateZ(100px);-ms-transform: rotateX(90deg) translateZ(100px);-o-transform: rotateX(90deg) translateZ(100px);transform: rotateX(90deg) translateZ(100px);}.bottom {-webkit-transform: rotateX(-90deg) translateZ(100px);-moz-transform: rotateX(-90deg) translateZ(100px);-ms-transform: rotateX(-90deg) translateZ(100px);-o-transform: rotateX(-90deg) translateZ(100px);transform: rotateX(-90deg) translateZ(100px);}

效果如下所示:

案例实战:使用3D变形制作产品信息展示

在Web设计中有很多方法用来制作产品信息展示,例如当鼠标移动到产品图片上时,产品信息滑动出来甚至使用弹出框。在这里,我们将使用CSS3 3D变形来制作一个3D立方体翻转展示信息的效果。

在谈论技术之前,我们先来看要实现的效果(如下图)。默认情况之下只显示产品图片,而产品信息隐藏不可见。当用户鼠标悬浮在产品图像上时,产品图像慢慢往上旋转使产品信息展示出来,而产品图像慢慢隐藏起来,看起来就像是一个旋转的立方体。


该技术用于创建一个多维的数据,在这个实例中使用了两个元素用于正面和反面。前面用来放置产品图片,底部用来放置产品信息。默认情况下产品信息隐藏起来,同时鼠标悬停在产品图片上时,隐藏在底部的产品信息在X轴放置-90度和Z轴旋转,使底部的信息旋转置于顶部,从而达到我们需要的效果,产品图片隐藏,产品信息显示。如图所示:

使用两个标签包裹产品图片和产品信息,第一个主要用来设置3D视点perspective,旨在设置用户有画布的视距;第二个包裹容器主要用来包裹图片和产品信息。当鼠标悬浮在这个容器上时,会沿X轴旋转,将产品信息显示出来。在三维旋转中,我们常的一种结构

舞台=>div.wrapper
    容器=>div.item
        产品图片=>img
        产品信息=>span.information

在我们的实例中使用的结构是:

<div class="wrapper"><div class="item"><img src="data:images/contact.png" /><span class="information"><strong>Contact Form</strong> The easiest way to add a contact form to your shop.</span></div></div>

接下来完成这个实例的样式。首先给每个wrapper容器设置display:inline-block和perspective:4000px,同时给item设置transform-style:preserve-3d让他的子元素具有一个3D位置。并且为了效果能更加完美,在例中添加了CSS3的transition属性:

.wrapper {display: inline-block;width: 310px;height: 100px;vertical-align: top;margin: 1em 1.5em 2em 0;cursor: pointer;position: relative;font-family: Tahoma, Arial;-webkit-perspective: 4000px;-moz-perspective: 4000px;-ms-perspective: 4000px;-o-perspective: 4000px;perspective: 4000px;}.item {height: 100px;-webkit-transform-style: preserve-3d;-moz-transform-style: preserve-3d;-ms-transform-style: preserve-3d;-o-transform-style: preserve-3d;transform-style: preserve-3d;-webkit-transition: -webkit-transform .6s;-moz-transition: -moz-transform .6s;-ms-transition: -ms-transform .6s;-o-transition: -o-transform .6s;transition: transform .6s;}

接下来给产品图片设置一个Z轴位移,给产品信息设置一个X轴旋转和Z轴位移,为了效果更加完美,还添加了一些其他的装饰样式

.item img {display: block;position: absolute;top: 0;border-radius: 3px;box-shadow: 0px 3px 8px rgba(0,0,0,0.3);-webkit-transform: translateZ(50px);-moz-transform: translateZ(50px);-ms-transform: translateZ(50px);-o-transform: translateZ(50px);transform: translateZ(50px);-webkit-transition: all .6s;-moz-transition: all .6s;-ms-transition: all .6s;-o-transition: all .6s;transition: all .6s;
}
.item .information {display: block;position: absolute;top: 0;height: 80px;width: 290px;text-align: left;border-radius: 15px;padding: 10px;font-size: 12px;text-shadow: 1px 1px 1px rgba(255,255,255,0.5);box-shadow: none;background: rgb(236,241,244);background: -webkit-linear-gradient(to bottom,  rgba(236,241,244,1) 0%,rgba(190,202,217,1) 100%);background: -ms-linear-gradient(to bottom,  rgba(236,241,244,1) 0%,rgba(190,202,217,1) 100%);background: linear-gradient(to bottom,  rgba(236,241,244,1) 0%,rgba(190,202,217,1) 100%);-webkit-transform: rotateX(-90deg) translateZ(50px);-moz-transform: rotateX(-90deg) translateZ(50px);-ms-transform: rotateX(-90deg) translateZ(50px);-o-transform: rotateX(-90deg) translateZ(50px);transform: rotateX(-90deg) translateZ(50px);-webkit-transition: all .6s;-moz-transition: all .6s;-ms-transition: all .6s;-o-transition: all .6s;transition: all .6s;
}

最后来完成用户鼠标悬浮在产品图片上时,旋转隐藏产品图片,同时产品信息旋转显示出来:

.item:hover {-webkit-transform: translateZ(-50px) rotateX(95deg);-moz-transform: translateZ(-50px) rotateX(95deg);-ms-transform: translateZ(-50px) rotateX(95deg);-o-transform: translateZ(-50px) rotateX(95deg);transform: translateZ(-50px) rotateX(95deg);
}.item:hover img {box-shadow: none;border-radius: 15px;}.item:hover .information {box-shadow: 0px 3px 8px rgba(0,0,0,0.3);border-radius: 3px;}

要想实现3D的效果,其实非常简单,只需指定一个元素为容器并设置transform-style:preserve-3d,那么它的后代元素便会有3D效果。不过有很多需要注意的地方,这里把我学习的方法,过程分享给大家。再讲知识点之前,还是先弄清楚3D的坐标系吧,从网上搜了一张经典坐标系图,供大家回顾一下。

二、3D试图

  transform-style:flat(默认,二维效果) / preserve-3d(三维效果)。设置一个元素的transform-style:preserve-3d;只影响这个元素的子元素(如果孙元素也有3d效果,那么还必须给子元素设置preserve-3d)。这样所有子元素都可以相对与父元素的平面进行3d变形操作。和二维变形一样,三维变形可以使用transform属性来设置。可以通过制定的函数或者通过三维矩阵来对元素变型。列举几个函数:

  translate3d(x,y,z) 使元素在这三个纬度中移动,也可以分开写,如:translateX(length),translateY(length), translateZ(length)。注意z轴的值只能为px;

  scale3d(number,number,number) 使元素在这三个纬度中缩放,也可分开写,如:scaleX(),scaleY(),scaleY()。

  rotateX(angle) 是元素依照x轴旋转;

  rotateY(angle) 是元素依照y轴旋转;

  rotateZ(angle) 是元素依照z轴旋转。

三、透视/景深效果

  perspective(length) 为一个元素设置三维透视的距离。仅作用于元素的后代,而不是其元素本身。当perspective:none/0;时,相当于没有设perspective(length)。比如你要建立一个小立方体,长宽高都是200px。如果你的perspective < 200px ,那就相当于站在盒子里面看的结果,如果perspective 非常大那就是站在非常远的地方看(立方体已经成了小正方形了)。

  当元素没有设置perspective(length)时,所有后代元素被压缩在同一个二维平面上,不存在景深的效果。如果设置perspective(length)后,将会看到三维的效果。默认的透视视角中心在容器(是perspective所在的元素,不是他的后代元素)的中点,也就是perspective-origin: 50% 50%。当然你也可以自己设置,比如:左上角-webkit-perspective-origin: 0px 0px;。

下面CSS中的简单3D效果更容易理解

四、必不可少的perspective属性

perspective的中文意思是:透视,视角!

perspective属性的存在与否决定了你所看到的是2次元的还是3次元的,也就是是2D transform还是3D transform. 这不难理解,没有透视,不成3D.

我们初中学美术,或者学建筑的同学肯定接触过透视的一些东西:

不过,CSS3 3D transform中的透视的透视点与上面两张示例图是不同的:CSS3 3D transform的透视点是在浏览器的前方

或者这么理解吧:显示器中3D效果元素的透视点在显示器的上方(不是后面),近似就是我们眼睛所在方位!

五、translateZ帮你寻找透视位置

如果说rotateX/rotateY/rotateZ可以帮助理解三维坐标,则translateZ则可以帮你理解透视位置。

我们都知道近大远小的道理,对于没有rotateX以及rotateY的元素,translateZ的功能就是让元素在自己的眼前或近或远。比方说,我们设置元素perspective为201像素,如下:

perspective: 201px;

则其子元素,设置的translateZ值越小,则子元素大小越小(因为元素远去,我们眼睛看到的就会变小);translateZ值越大,该元素也会越来越大,当translateZ值非常接近201像素,但是不超过201像素的时候(如200像素),该元素的大小就会撑满整个屏幕(如果父辈元素没有类似overflow:hidden的限制的话)。因为这个时候,子元素正好移到了你的眼睛前面,所谓“一叶蔽目,不见泰山”,就是这么回事。当translateZ值再变大,超过201像素的时候,该元素看不见了——这很好理解:我们是看不见眼睛后面的东西的!

再生动的文字描述也不如一个实例来得直观,您可以狠狠地点击这里:translateZ方法辅助理解perspective视角demo

建议Chrome浏览器下访问,可以使用range控件,演示效果更赞,如下截图:-100时候最小,200时候超级满屏(垂直方向因特殊布局限制没有显示),250的时候因为元素已经在视点之外,因此是一片空白(看不见)。

六、perspective属性的两种书写

perspective属性有两种书写形式,一种用在舞台元素上(动画元素们的共同父辈元素);第二种就是用在当前动画元素上,与transform的其他属性写在一起。如下代码示例:

.stage {perspective: 600px;
}

以及:

#stage .box {transform: perspective(600px) rotateY(45deg);
}

可以点击这里:perspective属性的两种书写demo

结果如下缩略图:

从上图我们貌似可以看到,虽然书写的形式,属性名称不一致,但是,效果貌似是一样的~~果真是这样吗???

实际上不然,上面的demo上下两个效果之所以会一样,是因为舞台上只有一个元素,因此,发生了巧合,其正好表现一样了。如果,如果舞台上有很多个元素,则两种书写形式的表现差异就会立马显示出来了!

您可以狠狠地点击这里:舞台多元素下的perspective两种书写对比demo

demo页面效果缩略图如下(因背景色随机,可能与下图有差异):

好吧,图中的效果其实不难理解。上面舞台整个作为透视元素,因此,显然,我们看到的每个子元素的形体都是不一样的;而下面,每个元素都有一个自己的视点,因此,显然,因为rotateY的角度是一样的,因此,看上去的效果也就一模一样了!

关于Chrome浏览器以及透视盲区
在Chrome浏览器下,要想看到完整的3D效果,还需要3D变换元素正好在窗体的垂直居中位置,因此,在Chrome浏览器下,生成了两个位置居中的按钮,帮助您看到想要的效果:

当我们改变第一个range控件值为200的时候,您会发现右侧第三个元素看不见了:

这不难理解,前面一排门,每个门都是1米,你距离门2米,显示,当所有门都开了45°角的时候,此时,距离中间门右侧的第二个门正好与你的视线平行,这个门的门面显然就什么也看不到。这就是为什么上面右侧第三个门一片空白的元素——特定的视角以及距离形成的视觉盲区。

七、理解perspective-origin

下面为立方体的实际应用透视效果图:

perspective-origin: 25% 75%;

八、transform-style: preserve-3d

transform-style属性也是3D效果中经常使用的,其两个参数,flat|preserve-3d. 前者flat为默认值,表示平面的;后者preserve-3d表示3D透视。

九、backface-visibility

在显示世界中,我们无法穿过元素A看到其身后的元素B或C或D;但是,在CSS3的3D世界中,默认情况下,我们是可以看到背后的元素

因此,为了切合实际,我们常常会这样设置,使后面元素不可见:

backface-visibility:hidden;

十、实际应用-图片的旋转木马效果

您可以点击这里:图片的旋转木马效果demo

建议在足够新版本的FireFox浏览器或Safari浏览器下观看,Chrome可能需要居中定位查看,下图为效果缩略图:

原理:

首先HTML结构,如下:

舞台容器图片图片图片...

对于舞台,很简单,加个视距,比方说800像素:

 perspective: 800px;

对于容器,很简单,加个3D视图声明,如下:

transform-style: preserve-3d;

然后就是图片们了。为了不至于产生类似DNA的螺旋状效果,我们让所有图片position:absolute,公用同一个中心点。

显然,图片旋转木马是类似钢管舞旋转的运动,因此,我们关心的是rotateY的大小。

因为要正好绕成一个圈,因此,图片rotateY值正好0~360等分,于是,如果有9张图片,则每个图片的旋转角度累加40(360 / 9 = 40)度即可。因此有:

img:nth-child(1) { transform: rotateY(   0deg ); }
img:nth-child(2) { transform: rotateY(  40deg ); }
img:nth-child(3) { transform: rotateY(  80deg ); }
img:nth-child(4) { transform: rotateY( 120deg ); }
img:nth-child(5) { transform: rotateY( 160deg ); }
img:nth-child(6) { transform: rotateY( 200deg ); }
img:nth-child(7) { transform: rotateY( 240deg ); }
img:nth-child(8) { transform: rotateY( 280deg ); }
img:nth-child(9) { transform: rotateY( 320deg ); }

这样就好了吗?No!虽然9张图片每个人的方位不一样,但都站在同一个点上,早就挤作一团,显然是不行的(见下图只设置rotateY)!我们需要拉开空间~~

如何拉开空间,很简单。

想想看那:9个美女,分别面朝东南西北共9个不同方位,她们只要每个人向前走个4~5步,美女们之间的空间不久拉开了,呈现圆形了!想象一下夜空中,礼花绽开的场景~~

这里的向前走4~5步,聪明的人应该已经知道了,就是本文提到的translateZ, 当translateZ为正值的时候,元素会向其面对的方向走去;如果元素无旋转,就会朝显示器走来!!

现在只剩下一个问题了,美女们要向前走多远呢??

这个距离是有计算公式滴!

拿本demo距离,每张图片的宽度是128像素,因此,有如下理想方位效果图:

上图中红色标注的r就是的demo页面中图片要translateZ的理想值(该值可以让所有图片无缝围成一个圆)!

r的计算很简单,有初中数学水平的人应该都会:

r = 64 / Math.tan(20 / 180 * Math.PI) ≈ 175.8

demo页面为了好看,图片之间留了点间距,使用的translateZ的值为175.8 + 20 = 195.8.

最后的最后,要让木马旋转起来,只要让容器每次旋转40度就可以了。

节省篇幅,具体的JavaScript操作代码就不展示了,您有兴趣可以查看demo页面源代码。

类似的还有: 这种效果,实现原理也是类似的



本文转自:http://www.w3cplus.com/css3/css3-3d-transform.html

http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/

http://www.cnblogs.com/duanhuajian/archive/2012/08/30/2664026.html

CSS3 Transform 【3D 】相关推荐

  1. 31.CSS3变形效果【下】

    第二十四章  CSS3变形效果[下] 一.3D变形简介 [上]讲的是2D,本章讲的是3D(在二维基础上多出一个z轴). 属性值                              说明 tran ...

  2. CSS3 transform动画 3D旋转立体正方形

    CSS3 transform动画 3D旋转立体正方形 在一个大的div里放置六个小div,分别向前后,向左右,向上下移动相等位置,再将平面div旋转,添加animation动画 <!DOCTYP ...

  3. 狂神css3笔记,【CSS】CSS3学习笔记(一)——选择器

    ✨CSS 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不 ...

  4. Transform【变形】属性

    来源:http://www.w3cplus.com/content/css3-transform 今天开始我们一起来学习有关于CSS3制作动画的几个属性:变形(transform).转换(transi ...

  5. 【3D】常见的3D模型格式介绍

    OBJ OBJ文件是Alias | Wavefront公司为它的一套基于工作站的3D建模和动画软件"AdvancedVisualizer"开发的一种标准3D模型文件格式. OBJ文 ...

  6. 【3D】几何物体——三角网格的表示与显示(obj)

    OBJ文件格式 OBJ是一种标准的3D模型文件格式:软件:3dsMax,LightWare,Maya都支持OBJ文件的读写: OBJ是以纯文本的形式存储了模型的顶点.法线和纹理坐标和材质使用信息: 格 ...

  7. css3 凹角,【CSS】这种凹角用css3如何实现

    回答: Title .outer{ position: absolute; left: 100px; top: 100px; width: 300px; height: 500px; backgrou ...

  8. 【3D】Blender设置指南

    1. 界面语言切换 Blender启动默认为英语界面,如何切换成中文显示? 菜单: File | User Perferences | 弹出设置窗口 切换到"system"标签页, ...

  9. 【UIKit】UIView基础学习

    UIView基础介绍 官网文档: View programming Guide for iOS UIView Class Reference [常用属性和方法] UIKit User Interfac ...

最新文章

  1. redis和mysql内存数据库性能_Redis高性能内存数据库
  2. fast nms YOLACT
  3. android 开源网站
  4. 分布式系统原理 之5 日志技术
  5. Vaadin介绍与开发练习之二(创建第一个Vaadin类)
  6. JavaMail操作的总结(2)
  7. delphi mysql 连接_Delphi 使用之连接数据库
  8. 新手电脑硬件软件故障解答(三)
  9. php uchome,Uchome1.2 1.5 代码学习 common.php
  10. android-长度单位-解析
  11. 计算机科学与专业大学排名,计算机科学与技术专业大学排名
  12. 用虚拟串口实现串口数据收发
  13. 51蛋骗鸡数码管显示A-Z字母
  14. 上海落户计算机水平毕业研究生,2021应届生落户上海打分标准,部分毕业生可直接落户上海...
  15. 价值7000万的商业模式,羊毛出在狗身上,猪来买单
  16. 本地摄像头应用到远程计算机,3个可在iPad / iPhone上远程查看网络摄像头的应用 | MOS86...
  17. Unity使用UIWebView导致iOS审核被拒的解决方案
  18. uniapp开发APP之真机调试
  19. Scala之set方法(超详细)
  20. Unity之数据持久化——Json

热门文章

  1. SEO网站的推广怎么做?
  2. 上海理工大学计算机博士点科学技术,上海理工大学博士点有哪些
  3. 10.8 富士康java开发 微信视频面试(HR+技术面 两个女面试官)
  4. 【2017.9-2018.2】年终总结--打破常规,放飞自我
  5. 不可重复读和幻读 重
  6. python四级中考有用的_大学英语4级我初中英语还可以,中考120能考106,高中英语水平基本上荒废,现在在上大学,所以现在的水平就停留在初中左右...
  7. 【文末福利】CSDN深圳城市开发者社区第一波线下技术交流活动,蓄势启航,本周六0617为你揭开神秘面纱
  8. Echarts 切换地图下钻各省份地市
  9. 欠阻尼谐振腔模型状态转移矩阵计算
  10. 页面撕裂DeadLink:Pages Torn Mac游戏介绍