在 CSS 中,transform
是用于用于用于对元素进行几何变换的属性,可实现旋转、缩放、平移、倾斜等效果,且不会影响其他元素的布局(不会触发重排)。以下是其核心用法和特性:
1. 基本语法
element {
transform: 变换函数1(参数) 变换函数2(参数); /* 多个变换可叠加 */
transform-origin: x-axis y-axis; /* 变换原点(默认中心) */
transition: transform 0.3s; /* 配合过渡实现平滑动画 */
}
2. 常用变换函数
(1)平移(translate
)
- 沿 X/Y 轴移动元素,不影响布局。
.box { transform: translate(50px, 30px); /* X轴+50px,Y轴+30px */ transform: translateX(50px); /* 仅X轴 */ transform: translateY(30px); /* 仅Y轴 */ transform: translateZ(100px); /* 3D Z轴(需配合perspective) */ }
百分比基于元素自身尺寸:translate(50%, 50%)
表示移动自身宽高的一半。
(2)旋转(rotate
)
- 绕原点旋转元素,单位为
deg
(度)或rad
(弧度)。.box { transform: rotate(45deg); /* 顺时针旋转45度 */ transform: rotate(-30deg); /* 逆时针旋转30度 */ transform: rotateX(60deg); /* 3D 绕X轴旋转 */ transform: rotateY(60deg); /* 3D 绕Y轴旋转 */ }
- 配合
transform-origin: left top;
可改变旋转中心(如绕左上角旋转)。
(3)缩放(scale
)
- 放大或缩小元素,默认以中心为基准。
.box { transform: scale(1.5); /* 宽高均放大1.5倍 */ transform: scaleX(0.8); /* 仅宽度缩小到80% */ transform: scaleY(1.2); /* 仅高度放大到120% */ }
- 负值会翻转元素(如
scaleX(-1)
水平翻转)。
(4)倾斜(skew
)
- 沿 X/Y 轴倾斜元素,产生扭曲效果。
.box { transform: skew(20deg, 10deg); /* X轴倾斜20度,Y轴倾斜10度 */ transform: skewX(30deg); /* 仅X轴 */ transform: skewY(15deg); /* 仅Y轴 */ }
(5)矩阵变换(matrix
)
- 用矩阵值一次性定义复杂变换(较少直接使用)。
.box { transform: matrix(1, 0, 0, 1, 50, 30); /* 等价于translate(50px, 30px) */ }
3. 关键特性
(1)不影响布局
transform
变换后的元素仍占据原位置(不会改变文档流),避免了 margin
或 top/left
带来的重排性能问题。
(2)叠加变换
多个变换函数可按顺序叠加(从右到左执行):
/* 先旋转45度,再平移50px(注意顺序影响结果) */
.box {
transform: translate(50px) rotate(45deg);
}
4. 应用场景
(1)悬停动画
.button {
transition: transform 0.3s;
}
.button:hover {
transform: scale(1.05) translateY(-3px); /* 轻微放大+上移 */
}
(2)居中对齐
/* 未知尺寸元素水平垂直居中 */
.box {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%); /* 基于自身尺寸偏移 */
}
(3)3D 卡片效果
.card {
transition: transform 0.5s;
transform-style: preserve-3d;
}
.card:hover {
transform: rotateY(180deg); /* 翻转卡片 */
}
(4)滚动动画
结合 JavaScript 监听滚动,动态改变 transform
:
window.addEventListener('scroll', function() {
const scrollY = window.scrollY;
document.querySelector('.box').style.transform = `translateY(${scrollY * 0.5}px)`;
});