CSS3 动画与变换 - transform 属性
1. 什么是 transform 属性?
transform 属性是 CSS3 中用于对元素进行几何变换的强大工具,它允许你对元素进行旋转(rotate)、缩放(scale)、平移(translate)、倾斜(skew)等操作,而不会影响文档流中的其他元素。通过 transform 属性,你可以创建各种丰富的视觉效果和动画。
2. 语法
transform: none | <transform-function> [ <transform-function> ]*;取值说明
none:不应用任何变换(默认值)<transform-function>:一个或多个变换函数,按顺序应用
3. 常用变换函数
3.1 平移(translate)
translate(tx, ty):沿 X 和 Y 轴平移元素translateX(tx):仅沿 X 轴平移元素translateY(ty):仅沿 Y 轴平移元素
3.2 旋转(rotate)
rotate(angle):绕元素原点旋转指定角度
3.3 缩放(scale)
scale(sx, sy):沿 X 和 Y 轴缩放元素scaleX(sx):仅沿 X 轴缩放元素scaleY(sy):仅沿 Y 轴缩放元素
3.4 倾斜(skew)
skew(ax, ay):沿 X 和 Y 轴倾斜元素skewX(ax):仅沿 X 轴倾斜元素skewY(ay):仅沿 Y 轴倾斜元素
3.5 矩阵变换(matrix)
matrix(a, b, c, d, tx, ty):使用 2D 变换矩阵进行变换
3.6 3D 变换
translate3d(tx, ty, tz):沿 X、Y 和 Z 轴平移元素rotate3d(x, y, z, angle):绕指定 3D 轴旋转元素scale3d(sx, sy, sz):沿 X、Y 和 Z 轴缩放元素perspective(d):设置透视效果
4. 基础示例
示例 1:基本变换效果
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>transform 基础示例</title>
<style>
.container {
display: flex;
gap: 20px;
margin: 50px;
}
.box {
width: 100px;
height: 100px;
background-color: #3498db;
color: white;
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.3s ease;
}
.translate:hover {
transform: translate(20px, 20px);
}
.rotate:hover {
transform: rotate(45deg);
}
.scale:hover {
transform: scale(1.5);
}
.skew:hover {
transform: skew(15deg, 5deg);
}
.combined:hover {
transform: translate(10px, 10px) rotate(15deg) scale(1.2);
}
</style>
</head>
<body>
<div class="container">
<div class="box translate">平移</div>
<div class="box rotate">旋转</div>
<div class="box scale">缩放</div>
<div class="box skew">倾斜</div>
<div class="box combined">组合变换</div>
</div>
</body>
</html>示例 2:变换原点
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>transform-origin 示例</title>
<style>
.container {
display: flex;
gap: 40px;
margin: 50px;
}
.box {
width: 100px;
height: 100px;
background-color: #e74c3c;
color: white;
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.5s ease;
}
.origin-center {
transform-origin: center;
}
.origin-top-left {
transform-origin: top left;
}
.origin-bottom-right {
transform-origin: bottom right;
}
.box:hover {
transform: rotate(45deg);
}
</style>
</head>
<body>
<div class="container">
<div>
<p>变换原点:center(默认)</p>
<div class="box origin-center">旋转</div>
</div>
<div>
<p>变换原点:top left</p>
<div class="box origin-top-left">旋转</div>
</div>
<div>
<p>变换原点:bottom right</p>
<div class="box origin-bottom-right">旋转</div>
</div>
</div>
</body>
</html>5. 实际应用场景
场景 1:按钮交互效果
.button {
padding: 10px 20px;
background-color: #3498db;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.button:hover {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.button:active {
transform: translateY(0);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}场景 2:卡片翻转效果
<div class="card-container">
<div class="card">
<div class="card-front">
<h3>卡片正面</h3>
<p>这是卡片的正面内容</p>
</div>
<div class="card-back">
<h3>卡片背面</h3>
<p>这是卡片的背面内容</p>
</div>
</div>
</div>
<style>
.card-container {
perspective: 1000px;
width: 300px;
height: 200px;
}
.card {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d;
transition: transform 0.6s;
}
.card-container:hover .card {
transform: rotateY(180deg);
}
.card-front, .card-back {
width: 100%;
height: 100%;
position: absolute;
backface-visibility: hidden;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.card-front {
background-color: #3498db;
color: white;
}
.card-back {
background-color: #e74c3c;
color: white;
transform: rotateY(180deg);
}
</style>场景 3:加载动画
.loader {
width: 50px;
height: 50px;
border: 5px solid #f3f3f3;
border-top: 5px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}6. 注意事项
浏览器兼容性:
- 现代浏览器(Chrome、Firefox、Safari、Edge)都支持
transform属性 - 对于旧版本浏览器,可能需要添加浏览器前缀(如
-webkit-、-moz-、-o-)
- 现代浏览器(Chrome、Firefox、Safari、Edge)都支持
性能考虑:
transform属性会触发 GPU 加速,通常比改变top、left等属性性能更好- 对于频繁的变换操作,建议使用
transform而不是定位属性
变换顺序:
- 多个变换函数的顺序会影响最终效果,因为变换是按顺序应用的
- 例如:
transform: rotate(45deg) translate(50px)与transform: translate(50px) rotate(45deg)会产生不同的结果
变换原点:
- 默认的变换原点是元素的中心点(
50% 50%) - 可以使用
transform-origin属性修改变换原点
- 默认的变换原点是元素的中心点(
3D 变换:
- 要使用 3D 变换,需要设置
transform-style: preserve-3d和perspective属性
- 要使用 3D 变换,需要设置
7. 总结
transform 属性是 CSS3 中创建丰富视觉效果的强大工具,它允许你:
- 对元素进行平移、旋转、缩放、倾斜等基本变换
- 组合多个变换函数创建复杂效果
- 配合
transition和animation属性创建平滑的动画效果 - 使用 3D 变换创建立体效果
- 通过
transform-origin控制变换的中心点
通过合理使用 transform 属性,你可以创建更加生动、交互式的网页界面,提升用户体验。