过渡动画用于简单的状态变化,帧动画用于更复杂的动画序列,而变换用于改变元素的位置和外观,这三个部分共同构成了 CSS 动画的核心
变换包括
2D变换
与3D变换
。2D变换
在平面中操作,3D变换
在空间中操作,2D
与3D
的概念相信很多同学都知道。变换可理解为将节点复制一份并生成新图层,原节点隐藏,在新图层中使用新节点进行变换操作。声明
transform-style
可实现2D变换
与3D变换
间的切换,transform-style
在父节点中声明,即发生变换的节点的父节点。flat:所有变换效果在平面中呈现(
默认
)preserve-3d:所有变换效果在空间中呈现
一、API概览
transform
包括六大函数,每个函数包括以下参数。translate():位移
- 默认:XYZ轴不声明默认是
0
- 单位:
Length
长度,可用任何长度单位,允许负值
- 正值:沿X轴向右位移/沿Y轴向上位移/沿Z轴向外位移
- 负值:沿X轴向左位移/沿Y轴向下位移/沿Z轴向内位移
- 函数:
translate(x,y):2D位移
translate3d(x,y,z):3D位移
translateX(x):X轴位移,等同于
translate(x,0)
或translate3d(x,0,0)
translateY(y):Y轴位移,等同于
translate(0,y)
或translate3d(0,y,0)
translateZ(z):Z轴位移,等同于
translate3d(0,0,z)
scale():缩放
- 默认:XYZ轴不声明默认是
1
或100%
- 单位:
Number
数值或Percentage
百分比,允许负值
- 正值:
0<(x,y,z)<1
沿X轴缩小/沿Y轴缩小/沿Z轴变厚,(x,y,z)>1
沿X轴放大/沿Y轴放大/沿Z轴变薄
- 负值:
1<(x,y,z)<0
翻转沿X轴缩小/沿Y轴缩小/沿Z轴变厚,(x,y,z)<-1
翻转沿X轴放大/沿Y轴放大/沿Z轴变薄
- 函数:
scale(x,y):2D缩放
scale3d(x,y,z):3D缩放
scaleX(x):X轴缩放,等同于
scale(x,1)
或scale3d(x,1,1)
scaleY(y):Y轴缩放,等同于
scale(1,y)
或scale3d(1,y,1)
scaleZ(z):Z轴缩放,等同于
scale3d(1,1,z)
skew():扭曲
- 默认:XY轴不声明默认是
0
- 单位:
Angle
角度或Turn
周
- 正值:沿X轴向左扭曲/沿Y轴向下扭曲
- 负值:沿X轴向右扭曲/沿Y轴向上扭曲
- 函数:
skew(x,y):2D扭曲
skewX(x):X轴扭曲,等同于
skew(x,0)
skewY(y):Y轴扭曲,等同于
skew(0,y)
rotate():旋转
- 默认:XYZ轴不声明默认是
0
- 单位:
Angle
角度或Turn
周
- 正值:2D旋转时顺时针旋转
- 负值:2D旋转时逆时针旋转
- 函数:
rotate():2D旋转
rotate3d(x,y,z,a):3D旋转,
[x,y,z]
是一个向量,数值都是0~1
rotateX(a):X轴旋转,等同于
rotate(1,0,0,a)
,正值时沿X轴向上逆时针旋转,负值时沿X轴向下顺时针旋转rotateY(a):3D Y轴旋转,等同于
rotate(0,1,0,a)
,正值时沿Y轴向右逆时针旋转,负值时沿Y轴向左顺时针旋转rotateZ(a):3D Z轴旋转,等同于
rotate(0,0,1,a)
,正值时沿Z轴顺时针旋转,负值时沿Z轴逆时针旋转matrix():矩阵
matrix(a,b,c,d,e,f):2D矩阵(位移、缩放、扭曲和旋转的综合函数)
matrix(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p):3D矩阵(位移、缩放、扭曲和旋转的综合函数)
perspective():视距
- 默认:
0
- 单位:
Length
长度,可用任何长度单位
应用
transform
的场景很多,不局限于某种指定场景,若结合transition
与animation
使用还需注意性能问题。二、使用&注意
- 元素的初始位置是不会改变的,改变的只是视觉位置。它的好处是,无论是流式布局(Flow)、Flexbox 布局还是 Grid 布局,它都不会影响 Web 上其他元素的布局
translate()
函数的参数是个百分比值时,该百分比值是相对于元素自身的大小计算,而不是父容器尺寸计算
translateZ()
函数的值等于或大于perspective()
函数的值,它会导致位移消失。你可以随时在translateZ()
函数中设置一个无限小的值,但反之则不成立。一旦超过perspective()
函数的值,元素将不再可见。
perspective(0px)
会导致translateZ()
效果被忽略。任何非零的perspective()
函数,translateZ()
都会有效