变换是缩放、位移、旋转、透视、斜切等的总称。
- 仅适用于块级元素
- 可以一次应用多次变换,但顺序不同,效果可能不同
- transform 和裁剪相关样式(如 clip,clip-path)同时存在时,会先裁剪,再变换。
- 如果父元素设置了 transform 变换,则子元素的固定定位 position:fixed 效果就会失效,样式表现就会类似于绝对定位。解决方法是使用嵌套——外层元素负责固定定位,内层元素负责实现动画。
- 默认情况下,父元素的overflow: hidden;对绝对定位的子元素无效,但若父元素的transform不为none,则将生效。
- transform属性值不为none的元素也可以作为绝对定位元素的包含块。
- 父元素添加transform后,子元素也会transform,若想消除父元素的transform对子元素的影响,需将子元素的transform设置为none,或子元素上添加相反的transform
【常用】位移 translate()
- 参数为百分比时,相对于自身移动
- 正值:向右,向下,向高层
- 负值:向左,向上,向低层
【实战】水平垂直居中
但绝对定位的元素,推荐用margin完成偏移,预留出transform来实现动画。
缩放/翻转 scale()
缩放
参数为正值时为缩放
如果只写一个值就是等比例缩放
大于1表示放大,小于1表示缩小,不能为百分比
翻转缩放
参数为负值时会翻转后缩放
水平翻转
垂直翻转
背面可见 backface-visibility
- backface-visibility: visible; 【默认值】元素翻转时背面可见,表现为元素的镜像
- backface-visibility: hidden; 元素翻转时背面不可见
效果见 https://demo.cssworld.cn/new/5/2-5.php
旋转 rotate()
正值为顺时针旋转,负值为逆时针旋转,360度一个轮回
- transform: rotateX(360deg); //绕 X 轴旋转360度
- transform: rotateY(360deg); //绕 Y 轴旋转360度
- transform: rotateZ(360deg); //绕 Z 轴旋转360度
以下值都是表示顺时针旋转45度
一般只需要使用 deg 单位
CSS 的角度单位
单位 | 含义 |
deg | degrees, 角度 0-360 正值顺时针,负值逆时针 |
grad | grads, 百分度,相对于1/400个整圆进行换算,如 |
rad | radians, 弧度,1弧度 = 180/π度,约等于57.3度。 |
turn | turns, 圈数,1圈=360度 |
三维旋转 rotate3d()
表示元素绕着坐标(0,0,0)和坐标(1,1,1)连成的向量线旋转45度
斜切skew()
180度是一个轮回。
只有一个参数时,为水平斜切,即skew(10deg)同skew(10deg,0)同skewX(10deg)。
【实战】箭头步骤条/导航
透视 perspective
有两种写法:
- 作为一个属性,设置给父元素,作用于所有3D转换的子元素
- 作为 transform 属性的一个值,作用于元素自身。
两种写法的效果区别详见链接
https://demo.cssworld.cn/new/5/2-3.php
translateZ()的值与perspective的值相等时,元素将占满整个屏幕,详见链接,帮你理解透视原理。
https://demo.cssworld.cn/new/5/2-1.php
perspective-origin
表示我们的眼睛相对3D变换元素的位置,可以用于改变元素的3D渲染效果。
perspective-origin属性初始值是50% 50%,表示默认的透视点是舞台或元素的中心。若需要让透视角度偏上或者偏下,便可以通过设置perspective-origin属性值实现。
变换类型 transform-style
只能用于3D变换元素的父元素上
区别详见链接效果 https://demo.cssworld.cn/new/5/2-4.php
变换原点 transform-origin
transform-origin属性可以用来改变元素变换的中心坐标点,共三个参数,分别是x轴,y轴和z轴的变换中心点
- z 轴只能是数值。
- x 轴和 y 轴支持百分比值、数值和关键字属性值(
left | center | right | top | bottom
)。 - 关键字属性值自带方位,因此 y 轴关键字写在前面也是合法的
使用场景:
(1)模拟现实世界物体的运动。例如,我以前做项目的时候实现过蜡烛火焰摆动的效果,该效果需要设置火焰元素的transform-origin属性值为bottom,这样火焰摆动的时候才自然。又如实现钟摆运动的动画效果,需要设置transform-origin属性值为top,这样钟摆顶部就会固定,下方会摆动。
(2)布局与定位。例如,在Chrome浏览器中想要实现10px大小的字符,可以先设置12px大小的字符,然后缩放一下:
但是这样做有一个问题,transform
变换的时候元素的原始位置是保留的,这会导致元素缩小后原本设定的间距变大,此时可以使用transform-origin
属性优化一下。