CSS3 @keyframes 规则详解
核心知识点
什么是 @keyframes 规则?
@keyframes 是 CSS3 中用于定义动画关键帧的规则。它允许开发者指定动画序列中的关键状态,浏览器会自动计算并插入这些关键帧之间的过渡效果,从而创建平滑的动画。
语法
/* 基本语法 */
@keyframes <animation-name> {
<keyframe-selector> { <css-properties>; }
/* 更多关键帧... */
}<animation-name>: 动画的名称,用于在animation-name属性中引用<keyframe-selector>: 关键帧的选择器,可以是百分比值(如0%、50%、100%)或关键字(from等同于0%,to等同于100%)<css-properties>: 在该关键帧处的 CSS 属性值
关键帧选择器
from或0%: 动画的开始状态to或100%: 动画的结束状态- 百分比值(如
25%、50%、75%): 动画过程中的中间状态
浏览器兼容性
- Chrome: 43+
- Firefox: 16+
- Safari: 9+
- Edge: 12+
实用案例分析
案例 1: 基本动画定义
代码示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基本动画定义</title>
<style>
/* 定义动画 */
@keyframes move {
from {
transform: translateX(0);
}
to {
transform: translateX(200px);
}
}
.box {
width: 100px;
height: 100px;
background-color: #4CAF50;
/* 应用动画 */
animation-name: move;
animation-duration: 2s;
animation-timing-function: ease;
animation-iteration-count: infinite;
animation-direction: alternate;
}
</style>
</head>
<body>
<div class="box"></div>
<p>观察方块的左右移动动画</p>
</body>
</html>效果分析:
- 定义了一个名为
move的动画,从transform: translateX(0)过渡到transform: translateX(200px) - 应用了该动画到方块元素,设置了 2 秒的持续时间,无限循环,且交替方向
- 实现了方块从左到右再从右到左的平滑移动效果
案例 2: 多关键帧动画
代码示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>多关键帧动画</title>
<style>
/* 定义多关键帧动画 */
@keyframes bounce {
0% {
transform: translateY(0);
}
50% {
transform: translateY(-100px);
}
100% {
transform: translateY(0);
}
}
.ball {
width: 100px;
height: 100px;
background-color: #2196F3;
border-radius: 50%;
/* 应用动画 */
animation-name: bounce;
animation-duration: 1s;
animation-timing-function: ease;
animation-iteration-count: infinite;
}
</style>
</head>
<body>
<div class="ball"></div>
<p>观察球体的弹跳动画</p>
</body>
</html>效果分析:
- 定义了一个名为
bounce的动画,包含三个关键帧:- 0%: 初始位置( translateY(0) )
- 50%: 弹跳至最高点( translateY(-100px) )
- 100%: 回到初始位置( translateY(0) )
- 应用了该动画到球体元素,设置了 1 秒的持续时间,无限循环
- 实现了球体的上下弹跳效果
案例 3: 复杂动画效果
代码示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>复杂动画效果</title>
<style>
/* 定义复杂动画 */
@keyframes pulse {
0% {
transform: scale(1);
background-color: #ff5722;
border-radius: 0;
}
25% {
transform: scale(1.2);
background-color: #ff9800;
border-radius: 25%;
}
50% {
transform: scale(1);
background-color: #4CAF50;
border-radius: 50%;
}
75% {
transform: scale(1.2);
background-color: #2196F3;
border-radius: 25%;
}
100% {
transform: scale(1);
background-color: #ff5722;
border-radius: 0;
}
}
.box {
width: 100px;
height: 100px;
/* 应用动画 */
animation-name: pulse;
animation-duration: 3s;
animation-timing-function: ease;
animation-iteration-count: infinite;
}
</style>
</head>
<body>
<div class="box"></div>
<p>观察方块的缩放、颜色变化和形状变化动画</p>
</body>
</html>效果分析:
- 定义了一个名为
pulse的复杂动画,包含五个关键帧,每个关键帧都有不同的transform、background-color和border-radius值 - 应用了该动画到方块元素,设置了 3 秒的持续时间,无限循环
- 实现了方块的缩放、颜色变化和形状变化的综合动画效果
实际应用场景
1. 加载动画
在页面或内容加载时,使用 @keyframes 定义加载动画,如旋转的 spinner、跳动的点等,提供视觉反馈。
2. 交互反馈
在用户交互时,使用 @keyframes 定义反馈动画,如按钮点击时的缩放效果、表单提交时的成功动画等。
3. 页面元素动画
在页面滚动或元素进入视口时,使用 @keyframes 定义入场动画,如淡入、滑动、旋转等效果,提升页面的视觉吸引力。
4. 游戏和交互应用
在游戏或复杂的交互应用中,使用 @keyframes 定义角色动画、场景过渡动画等,增强用户体验。
代码优化建议
1. 动画名称命名
- 使用语义化的名称: 动画名称应该清晰地描述动画的效果,如
bounce、fadeIn、slideIn等 - 避免使用通用名称: 避免使用过于通用的名称,如
animation1、move等,以免与其他动画冲突
2. 关键帧选择
- 合理设置关键帧: 根据动画的复杂度,合理设置关键帧的数量。简单动画可以只使用
from和to,复杂动画需要更多的关键帧 - 使用百分比值: 对于复杂动画,使用百分比值可以更精确地控制动画的进度
3. 性能优化
- 优先使用 transform 和 opacity: 这两个属性的动画性能最好,不会触发重排(reflow)
- 避免使用布局属性: 如 width、height、margin、padding 等,这些属性的动画会触发重排,影响性能
- 使用 will-change 属性: 对于需要动画的元素,可以使用
will-change属性提前告知浏览器,优化渲染性能
/* 优化前 */
@keyframes resize {
from { width: 100px; }
to { width: 200px; }
}
/* 优化后 */
@keyframes scale {
from { transform: scale(1); }
to { transform: scale(2); }
}
.box {
will-change: transform;
}4. 浏览器兼容性
- 添加浏览器前缀: 对于旧版本浏览器,需要添加浏览器前缀
- 降级处理: 对于不支持 CSS 动画的浏览器,确保基本功能正常
/* 带浏览器前缀的 @keyframes 定义 */
@-webkit-keyframes bounce {
/* 关键帧定义 */
}
@-moz-keyframes bounce {
/* 关键帧定义 */
}
@-o-keyframes bounce {
/* 关键帧定义 */
}
@keyframes bounce {
/* 关键帧定义 */
}小结
@keyframes规则用于定义 CSS3 动画的关键帧- 可以使用
from/to关键字或百分比值来指定关键帧 - 支持在每个关键帧中定义多个 CSS 属性
- 是 CSS3 动画系统的核心,与
animation属性配合使用 - 广泛应用于加载动画、交互反馈、页面元素动画和游戏等场景
- 性能优化的关键是优先使用
transform和opacity属性
通过精心设计和使用 @keyframes 规则,可以创建出丰富多样的动画效果,提升网页的视觉吸引力和用户体验。