translateX(50%) <!--元素向右移动自身尺寸的一半-->
4.2 translate()
如果想同时沿x轴和y轴移动,使用 translate()更方便。第一个值代表x轴,第二个值代表y轴。translate()与translateX(),translateY()结合在一起的作用是一样的。
translate(2em) 等于translate(2em,0) 等于 translateX(2em) 。
4.3 translateZ()
translateZ()沿z轴平移元素,即在第三个维度中移动元素。translateZ()只接受长度值。其实任何有关z轴的值都不可以使用百分数。
4.4 translate3d()
translate3d()这个简写属性能同时指定x轴,y轴,z轴的平移量。3D平移过程如下图:
3D平移过程
图中箭头表示沿相应轴的移动,最终达到3D空间中的一点。与translate()不同,如果translate3d()的值少于3个,没有假定的默认值。因此类似translate3d(1em,-50px)操作是无效的,而不能假定为translate3d(1em,-50px,0)。
第五部分:缩放函数 scale()
缩放变形可以把元素放大或缩小。缩放函数的值都是无单位的实数,而且始终为正数。在2D平面中,可以分别在x轴或者y轴上缩放,也可以同时在两个轴上缩放。
5.1 三维空间缩放
能在二维空间缩放,也就能在三维空间缩放。css提供的scalez()函数仅在z轴上缩放,而scale3d()则能同时在三个轴上缩放。当然,仅当元素有深度时,这两个函数才有效果,而元素在默认情况下没有深度。如果让元素有一定的深度,例如绕x轴或y轴旋转,那么深度就可以缩放。使用scalez()或者scale3d()都可以。
和translate()一样,scale3d()的三个数都必须是有效的。不然将导致所属的整个变形值都失效。
第六部分:旋转函数 rotate()
旋转函数绕某个旋转轴元素,或者绕3D空间中的一个向量旋转元素。旋转变形有四个简单的函数,以及一个有些复杂,专门用于3D旋转的函数。
上面四个简单的函数都只接受一个值:角度。角度以一个数字(可正可负)和一个有效的角度单位(deg,grad,rad和turn)来表示。如果数字超出来相应单位的常规范围,将化为范围内的值。也就是说,437deg和77deg的效果是相同的,与-283deg的效果也是相同的。
但是仅当没有任何形式的动画,这样的换算才算等效的。如果以动画的形式旋转-20deg,元素稍微向左倾斜,而不转动。如果以动画的形式旋转340deg,元素将向右转动几乎一周。这两次动画的最终状态是一样的,但是每次旋转的过程是有差异的。
rotate()函数实施的是2D旋转,是我们最常用的旋转方式。它的效果等同于rotateZ(),因为都是绕z轴旋转(从显示器射出来,直指你的眼睛)旋转的。类似的,rotateX()绕x轴旋转,使元素向你倾斜或者远离你倾斜。rotateY()绕y轴旋转元素,像门的开合一样。如下图效果:
上图中有的例子涉及到3D效果。与后面章节的transform-style和perspective属性配和才能达到的效果。这篇文章涉及的3D变形都是如此。如果只应用现在提到的变形函数是得不到图中所展示的效果的。
6.1 rotate3d()
image
上图中rotate(45deg)在3D空间中,等价于rotate3d(0,0,1,45deg)。前三个数设定向量的三个分量,这个向量在x轴和y轴上的大小为0。在z轴上的大小为1。因此,这个向量在z轴上,指向正方向,即指向观察者。如果看向量的原点,元素是顺时针旋转的。
类似的,rotateX(45deg)等价于rotate3d(1,0,0,45deg)。这个向量在x轴上,指向正方向(右方)。如果站在向量的的终点看向原点,元素绕向量顺时针旋转45度,因此,站在常规的观察者位置上,元素的顶部远离观察者,元素的底部靠近观察者。
假如说旋转函数是rotate3d(-0.95,0.5,1,45deg)描述的向量。假设有个边长200像素的立方体,那么这个向量在x轴上的大小为190像素,指向左方。在y轴上的大小为100像素,指向下方。在z轴上的大小为200像素,指向观察者。这个向量从原点(0,0,0)指向(-190px,100px,200px)。如下图:
image
视域值必须是正数,而且不能为零。其他值都将导致 perspective()函数被忽略。 perspective()函数在变形函数列表中的位置十分重要。如果想在变形函数列表中设定视域值,一定要把 perspective()函数放在首位,只要也要放在以来视域的变形之前。
重要:transform函数的编写顺序十分重要。 perspective()函数与后面介绍的 perspective属性十分相似,但是二者的用法完全不同。一般来说,最好使用 perspective属性,不过也有需要使用 perspective()函数的例外情况。
第九部分:修改视域
视域其实由两个属性定义:一个定义视域属性距离,相当于前面讨论过的perspective()函数。另一个定义视域的原点。
9.1:定义视域 perspective 属性
perspective 属性的值是一个长度,定义视域锥体的深度。这么看来,它与前面讨论的 perspective()函数类似,不过两者之间有重要区别。
perspective
如果想创建特别深的视域,仿照变焦镜头的效果,可以声明perspective: 2500px。如果想让深度浅一些,可以声明perspective: 200px。
9.2: perspective 属性与perspective()函数的区别
perspective()函数只为目标元素定义视域,比如声明perspective(800px) rotateY(45deg)。那么只有应用这个规则的元素才能使用设定的视域。
而perspective 属性定义的视域深度应用到目标元素的所有子元素上。
这就是两者的重要区别。perspective 属性创建的3D空间为所有子元素共有,而perspective()函数只对目标元素有效果,而且要放在变形函数列表的开头或前面,多数时候,应该使用perspective属性。
9.3:移动视域原点 perspective-origin 属性
perspective-origin
css变形规范对matrix()函数做了严格规定:以6个值a-f确定变换矩阵指定2D平面中的变形。
matrix()函数的有效值是6个以逗号分隔的数字。不能多,也不能少。数字可以为正或负。matrix()函数的值所用的句法十分复杂,描述的是元素变形后的最终状态,可以涵盖其他所有变形类型(旋转,倾斜等)。最后,很少有人使用这个句法。
10.1 3D变形矩阵函数
matrix3d()
css变形规范对matrix3d()函数做了严格规定:以列主序排列一个4X4的齐次矩阵,用这个16个值指定3D变形。matrix3d()函数的值必须是16个以逗号分隔的数字,不能多也不能少。这些数字按列排列成一个4X4矩阵,第一列由第一组四个数构成,第二列由第二组四个数构成,以此类推。
本章只对矩阵函数进行简单介绍。
第十一部分:移动原点 transform-origin
目前所见的变形有个共同点,都以元素的绝对中心为变形的原点。例如,旋转元素时,是绕着中心旋转的,而不是绕着某一角度旋转的。这是默认行为,不过可以使用transform-origin属性修改。
transform-origin
取值语法看似复杂,但是实际使用起来还是不难的。transform-origin属性的值为两个或三个关键字,用于定义相对哪个点变形。第一个值针对横向,第二个值针对纵向,可选的第三个值是z轴上的长度。
横轴和纵轴可以使用英语关键字,百分数,长度。而z轴不能使用英语关键字或百分数。不过可以使用长度值。目前像素值是最常用的。
长度值设定的是距元素左上角的距离。所以,transform-origin: 5em 22px定义的变形原点距元素的左边5em,距元素的顶边22px。
百分数相对对应的轴和元素的尺寸计算。设定的是距元素左上角的偏移量。如:transform-origin: 67% 40%定义的元素距元素左边的距离为宽度的67%,距元素顶边的距离为高度的40%。如下图:
有种变形不怎么受变形原点的影响——平移。使用translate()移动元素,不管元素变形原点在哪,元素最终都被移动到相同的位置。
第十二部分:变形方式 transform-style
如果在一个三维空间中改变元素的形态,例如使用translate3d(),或许希望在3D空间中呈现元素。然而,这不是默认行为。默认情况下,不管怎么变形,得到的结果都是扁平的。但是可以使用transform-style修改。
transform-style
假如我们想在适中的视域下移动元素。使用下面css:
.inner {
transform: perspective(750px) translateZ(60px) rotateX(45deg);
<div class="outer">
<div class="inner">inner</div>
结果如下图:
image
但是,如果向某一边旋转外层div,结果就与我们设想的不一样了:内层div像粘在外层div上的照片一样,这与预期不符。因为transform-style默认值是flat。内层div的上部前倾,下部后靠,像是紧贴在外层div上的图像,随外层一起旋转。
.outer {
transform: perspective(750px) translateY(60px) rotateX(-20deg);
.inner {
transform: perspective(750px) translateZ(60px) rotateX(45deg);
<div class="outer">
<div class="inner">inner</div>
结果如下图:
.outer {
transform: perspective(750px) translateY(60px) rotateX(-20deg);
transform-style: perserve-3d;
.inner {
transform: perspective(750px) translateZ(60px) rotateX(45deg);
<div class="outer">
<div class="inner">inner</div>
改动后结果如下图:
transform-style设定的变形方式可能会被其他属性覆盖。这是因为那些属性的某些值要求元素及其子元素必须以扁平的方式呈现才能起作用。遇到这种情况,不管你把transform-style设为什么值,都会被强制重置为flat。
为了避免被覆盖,下面属性要设为给出的值(这些也都是属性的默认值):
overflow: visible
filter: none
clip: auto
clip-path: none
mask-image: none
mask-border-source: none
mix-blend-mode: normal
如果突然发现3D变形效果无效,根源就可能存在上述列表中的某个属性上。
第十三部分:处理背面 backface-visibility
在3D变形中,backface-visibility属性可以看到元素的背面。
backface-visibility
backface-visibility属性决定元素的背面朝向我们时是否渲染背面,仅此而已。
假设翻转两个元素,一个元素的backface-visibility属性设置为visible,另一个设置为hidden。
一个简单的卡片翻转效果演示 backface-visibility 的使用:
.card {
position: relative;
perspective: 800px;
transform-style: preserve-3d;
width:200px;
height:280px;
transition: all .6s;
border: 1px solid #000;
border-radius: 4px;
.card:hover {
transform: rotateY(180deg);
img {
position: absolute;
width:100%;
height: 100%;
transition: all .5s;
backface-visibility: hidden;
/*由于我们将两个图像都藏在了背面,所以另一面没有任何东西。 所以接下来需要再把.front-face翻转180度*/
.back-face {
transform: rotateY(180deg);
<div class="card">
<img class="front-face" src="1.jpg">
<img class="back-face" src="2.jpg">