CSS3中的transform属性2D3D转换
前言
CSS 的 Transform(转换) 用于改变元素的视觉位置、角度、大小和形状,而不改变元素原本在文档流中占据的空间。主要分为两类:
- 2D 转换:在平面上移动、旋转、缩放、倾斜。
- 3D 转换:在三维空间中移动、旋转、缩放,实现透视和立体效果。
旋转变形
旋转变形用于让元素围绕某个中心点进行旋转。
基本语法:
transform: rotate(角度);| 属性值 | 说明 |
|---|---|
rotate(45deg) | 顺时针旋转 45° |
rotate(-45deg) | 逆时针旋转 45° |
rotate(90deg) | 顺时针旋转 90° |
rotate(180deg) | 顺时针旋转 180° |
rotate(360deg) | 顺时针旋转一圈 |
代码示例:
.box { width: 100px; height: 100px; background-color: red;
transform: rotate(45deg);}设置旋转中心点
默认情况下,元素围绕自身中心旋转。
可以使用 transform-origin 修改旋转中心。
.box { transform-origin: center center; /* 默认中心 */ transform: rotate(45deg);}常见属性值:
| 属性值 | 说明 |
|---|---|
center | 中心点,默认值 |
top left | 左上角 |
top right | 右上角 |
bottom left | 左下角 |
bottom right | 右下角 |
50% 50% | 中心点 |
0 0 | 左上角 |
注意:transform-origin 不仅影响旋转,也会影响缩放、斜切等变形效果。
缩放变形
缩放变形用于放大或缩小元素。
基本语法:
transform: scale(x, y);x:水平方向的缩放倍数。y:垂直方向的缩放倍数。- 只传一个参数时,两个方向采用相同的缩放倍数。
| 属性值 | 说明 |
|---|---|
scale(1) | 原始大小 |
scale(1.5) | 放大至 1.5 倍 |
scale(0.5) | 缩小至 0.5 倍 |
scale(2, 1) | 宽度变为 2 倍,高度不变 |
scaleX(2) | 仅水平方向放大 2 倍 |
scaleY(0.5) | 仅垂直方向缩小一半 |
scale(-1, 1) | 水平镜像翻转 |
代码示例:
.box { width: 100px; height: 100px; background-color: red;
transform: scale(1.5);}缩放与 width、height 的区别
/* 修改元素布局尺寸 */.box { width: 200px; height: 200px;}
/* 仅改变视觉大小 */.box { width: 100px; height: 100px; transform: scale(2);}两种方法视觉上都可能得到 200px × 200px 的盒子,但它们有本质区别:
width、height:改变元素布局尺寸,可能影响其他元素的排列。scale():不会改变元素原有的布局占位。
实际应用: 图片悬停放大、按钮交互、卡片放大动画等。
斜切变形
斜切变形用于让元素沿水平或垂直方向发生倾斜。
基本语法:
transform: skew(x角度, y角度);| 属性值 | 说明 |
|---|---|
skew(20deg) | 水平方向斜切 20° |
skew(20deg, 10deg) | 水平和垂直方向同时斜切 |
skewX(20deg) | 仅沿 X 轴方向斜切 |
skewY(20deg) | 仅沿 Y 轴方向斜切 |
skewX(-20deg) | 沿 X 轴反向斜切 |
代码示例:
.box { width: 100px; height: 100px; background-color: red;
transform: skewX(20deg);}skewX 与 skewY 的区别
skewX():改变元素不同高度处的水平偏移,使左右边倾斜。skewY():改变元素不同水平位置处的垂直偏移,使上下边倾斜。
注意:skew() 是斜切,不是旋转。斜切通常会改变元素原有的角度和形状,而旋转会保持其形状不变。
实际应用: 倾斜按钮背景、装饰卡片、几何图形、特殊视觉效果等。
位移变形
位移变形用于让元素沿 X 轴或 Y 轴移动。
基本语法:
transform: translate(x, y);x:水平方向位移,正数向右,负数向左。y:垂直方向位移,正数向下,负数向上。
| 属性值 | 说明 |
|---|---|
translate(50px, 20px) | 向右 50px,向下 20px |
translateX(100px) | 向右移动 100px |
translateX(-100px) | 向左移动 100px |
translateY(50px) | 向下移动 50px |
translateY(-50px) | 向上移动 50px |
translate(50%, 50%) | 向右、向下各移动自身对应尺寸的 50% |
代码示例:
.box { width: 100px; height: 100px; background-color: red;
transform: translate(50px, 20px);}1. translate 百分比的计算规则
这一点非常重要。
.box { width: 200px; height: 100px;
transform: translate(50%, 50%);}结果:
- 水平位移:200 × 50% = 100px。
- 垂直位移:100 × 50% = 50px。
translate 的百分比通常是相对于元素自身的尺寸,而不是父元素。 这里讨论的是普通 HTML 元素默认的变形参考盒。
使用 translate 实现绝对定位居中
.parent { position: relative; width: 500px; height: 500px;}
.child { position: absolute; top: 50%; left: 50%;
transform: translate(-50%, -50%);}原理:
top: 50%:让子元素的顶部移动到父元素高度的 50% 处。left: 50%:让子元素的左侧移动到父元素宽度的 50% 处。translate(-50%, -50%):再向左、向上移动子元素自身宽高的一半。
这样就实现了水平和垂直居中。
现代开发中,如果只是实现普通容器居中,通常使用 Flex 或 Grid 更简单。
3D旋转
前面介绍的旋转、缩放、斜切和位移主要属于 2D 变形。3D 变形在原有 X、Y 轴的基础上引入 Z 轴(深度方向)。
rotateX:绕 X 轴旋转
.box { transform: rotateX(45deg);}元素围绕水平轴旋转,可以理解为上下翻转的效果。
rotateY:绕 Y 轴旋转
.box { transform: rotateY(45deg);}元素围绕垂直轴旋转,可以理解为左右翻转的效果。
rotateZ:绕 Z 轴旋转
.box { transform: rotateZ(45deg);}元素围绕垂直于屏幕的轴旋转。
在常见的平面元素上,rotateZ(45deg) 的视觉效果与 rotate(45deg) 相同。
rotate3d:自定义旋转轴
transform: rotate3d(x, y, z, angle);前三个参数指定旋转轴的方向,最后一个参数指定旋转角度。
/* 绕 X 轴 */transform: rotate3d(1, 0, 0, 45deg);
/* 绕 Y 轴 */transform: rotate3d(0, 1, 0, 45deg);
/* 绕 Z 轴 */transform: rotate3d(0, 0, 1, 45deg);
/* 绕 X、Y 都有分量的斜轴 */transform: rotate3d(1, 1, 0, 45deg);perspective:设置透视距离
单纯使用 3D 旋转,并不一定能看到明显的立体效果。
通常需要配合 perspective 实现透视。
代码示例:
<div class="scene"> <div class="box">3D BOX</div></div>.scene { perspective: 800px;}
.box { width: 200px; height: 200px; background-color: red;
transform: rotateY(45deg);}perspective 表示观察者与投影平面之间的距离:
perspective: 400px:透视效果较强。perspective: 800px:透视效果相对柔和。perspective: 1500px:透视效果较弱。
需要注意,示例使用的是父元素的 perspective 属性。如果改用 transform: perspective(800px) rotateY(45deg),透视函数和旋转函数都写在元素自身的 transform 中。
另外,制作嵌套 3D 场景时,还经常需要:
transform-style: preserve-3d;backface-visibility: hidden;分别用于保留子元素的 3D 空间关系、隐藏元素朝向背面的表面。
transform 组合使用
前面五种变形并不是只能单独使用,还可以组合。
.box { transform: translateX(100px) rotate(45deg) scale(1.5);}该代码组合了位移、旋转和缩放。
但是要注意:变形函数的顺序非常重要。
例如:
/* 位移距离不会被 scale 放大 */transform: translateX(100px) scale(2);
/* 位移效果也会被 scale 放大 */transform: scale(2) translateX(100px);理解时,可以把变形函数视为从右向左依次作用于元素。调换函数的顺序,最终效果可能完全不同。
另外,同一规则中连续书写两个 transform 声明,不会自动合并:
.box { transform: rotate(45deg); transform: scale(1.5);}最终只会应用 scale(1.5),因为后面的声明覆盖了前面的声明。
总结:CSS3 变形属性速记
| 类型 | 函数 | 主要用途 |
|---|---|---|
| 旋转 | rotate() | 2D 平面旋转 |
| 缩放 | scale() | 水平、垂直同时缩放 |
| 缩放 | scaleX() | 水平缩放 |
| 缩放 | scaleY() | 垂直缩放 |
| 斜切 | skew() | 水平、垂直斜切 |
| 斜切 | skewX() | 水平斜切 |
| 斜切 | skewY() | 垂直斜切 |
| 位移 | translate() | 水平、垂直位移 |
| 位移 | translateX() | 水平位移 |
| 位移 | translateY() | 垂直位移 |
| 3D 旋转 | rotateX() | 绕 X 轴旋转 |
| 3D 旋转 | rotateY() | 绕 Y 轴旋转 |
| 3D 旋转 | rotateZ() | 绕 Z 轴旋转 |
| 3D 旋转 | rotate3d() | 绕自定义 3D 轴旋转 |
| 辅助属性 | transform-origin | 设置变形中心点 |
| 辅助属性 | perspective | 设置透视距离 |
| 辅助属性 | transform-style | 控制子元素是否保留 3D 空间关系 |
| 辅助属性 | backface-visibility | 控制背面是否可见 |
实际开发中,最值得优先掌握的是 translate()、scale() 和 rotate()。 它们在按钮交互、图片展示、卡片动画、抽屉菜单等场景中很常见。
最后要区分两个概念:
transform:决定元素变成什么样。transition:决定元素从原始状态变成目标状态时如何平滑过渡。
例如:
.box { transition: transform 0.3s ease;}
.box:hover { transform: translateY(-10px) scale(1.05);}鼠标悬停时,盒子会在 0.3 秒内向上移动 10px,并放大到 1.05 倍。这就是现代网页中非常常见的卡片悬停交互效果。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!














