
一、什么是CSS Animation?
CSS Animation是CSS3中引入的一种技术,允许我们创建复杂的、关键帧驱动的动画效果,无需依赖JavaScript就能实现流畅的动态效果。它提供了比transition更强大、更灵活的动画控制能力。
二、核心组件
CSS Animation主要由两个核心部分组成:
@keyframes 规则 - 定义动画的关键帧和过渡效果。
animation-* 系列属性 - 控制动画的播放方式。
2.1 @keyframes 规则详解
@keyframes 规则定义了动画在不同阶段的样式。格式如下:
@keyframes 动画名称 {
0% {
/* 初始状态样式 */
}
50% {
/* 中间状态样式 */
}
100% {
/* 结束状态样式 */
}
}也可以使用关键字:
@keyframes 动画名称 {
from {
/* 初始状态 */
}
to {
/* 结束状态 */
}
}2.2 Animation 属性详解
2.2.1. animation-name
指定要应用的@keyframes动画名称。
.element {
animation-name: fadeIn;
}2.2.2. animation-duration
指定动画完成一个周期所需的时间(秒或毫秒)。
.element {
animation-duration: 2s;
}2.2.3. animation-timing-function
定义动画的速度曲线,控制动画如何在各个阶段加速或减速。
常用值:
ease(默认)- 慢开始,然后加速,最后减速。
linear - 匀速运动。
ease-in - 慢开始。
ease-out - 慢结束。
ease-in-out - 慢开始和慢结束。
cubic-bezier(n,n,n,n) - 自定义贝塞尔曲线。
.element {
animation-timing-function: ease-in-out;
}2.2.4. animation-delay
指定动画开始前的延迟时间。
.element {
animation-delay: 1s;
}2.2.5. animation-iteration-count
定义动画播放的次数。
.element {
animation-iteration-count: 3; /* 播放3次 */
/* 或者 */
animation-iteration-count: infinite; /* 无限循环 */
}2.2.6. animation-direction
定义动画是否应该反向播放或交替方向播放。
常用值:
normal(默认)- 正向播放。
reverse - 反向播放。
alternate - 正向然后反向,交替进行。
alternate-reverse - 反向然后正向,交替进行。
.element {
animation-direction: alternate;
}2.2.7. animation-fill-mode
定义动画在播放前后如何应用样式。
常用值:
none(默认)- 动画结束后回到原始状态。
forwards - 保持结束状态的样式。
backwards - 应用第一个关键帧的样式。
both - 同时应用forwards和backwards。
.element {
animation-fill-mode: forwards;
}2.2.8. animation-play-state
控制动画的播放状态。
常用值:
running(默认)- 播放中
paused - 暂停
.element {
animation-play-state: paused;
}
.element:hover {
animation-play-state: running;
}三、动画属性简写语法
所有动画属性可以合并为一个 animation 简写属性:
.element {
animation: 动画名称 持续时间 时间函数 延迟 迭代次数 方向 填充模式 播放状态;
}例如:
.element {
animation: fadeIn 2s ease-in-out 0.5s infinite alternate forwards running;
}简写属性助记:
中文助记:名称时长 方式延迟 次数方向 填充状态
名称 = name(动画名称)。
时长 = duration(持续时间)。
方式 = timing-function(时间函数,控制动画进行方式)。
延迟 = delay(延迟时间)。
次数 = iteration-count(迭代次数)。
方向 = direction(播放方向)。
填充 = fill-mode(填充模式)。
状态 = play-state(播放状态)。
英文助记:Never Drink Tea During Important Dates For Peace
Never = name 。
Drink = duration 。
Tea = timing-functionDuring = delay 。
Important = iteration-count 。
Dates = direction 。
For = fill-mode 。
Peace = play-state 。
需要特别注意的点
时间值的顺序:当简写中出现两个时间值时,第一个总是duration,第二个总是delay。
必需的属性:name和duration是必需的,缺少其中任何一个,动画都不会运行。
可省略的属性:其他属性可以根据需要省略,会使用默认值。
animation: fadeIn 2s 1s; /* 2秒是duration,1秒是delay *//* 基础动画 - 只设置必需的两个属性 */
.fade-in {
animation: fadeIn 1s; /* name, duration */
}
/* 完整动画 - 设置所有属性 */
.bounce-effect {
animation: bounce 2s ease-in-out 0.5s infinite alternate forwards running;
/* 名称 时长 方式 延迟 次数 方向 填充 状态 */
}
/* 常用组合 */
.spinner {
animation: spin 1s linear infinite;
/* 名称 时长 方式 次数 */
}四、实际示例
4.1. 淡入淡出效果
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.fade-in {
animation: fadeIn 1s ease-in-out;
}4.2. 旋转动画
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.rotating {
animation: rotate 2s linear infinite;
}4.3. 弹跳效果
@keyframes bounce {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-30px);
}
60% {
transform: translateY(-15px);
}
}
.bounce {
animation: bounce 2s ease infinite;
}五、性能优化技巧
5.1. 使用GPU加速:优先使用 transform、opacity 属性进行动画,因为它们可以触发GPU加速,减少重绘和回流。
5.2. 避免使用以下属性进行动画:
width 和 height。
margin 和 padding。
top、left、right、bottom(使transform: translate()代替)。
5.3. 使will-change提示浏览器:
.animated-element {
will-change: transform, opacity;
}5.4. 使用适当的动画持续时间:根据用户体验设计合理的动画时间,避免过长或过短。
六、与JavaScript交互
虽然CSS Animation可以独立工作,但结合JavaScript可以实现更复杂的交互效果:
// 选择元素
const element = document.querySelector('.animated-element');
// 播放动画
element.style.animationPlayState = 'running';
// 暂停动画
element.style.animationPlayState = 'paused';
// 监听动画事件
element.addEventListener('animationstart', function() {
console.log('动画开始');
});
element.addEventListener('animationend', function() {
console.log('动画结束');
});
element.addEventListener('animationiteration', function() {
console.log('动画迭代');
});七、浏览器兼容性
现代浏览器对CSS Animation有很好的支持,但为了兼容旧版本浏览器,可以使用供应商前缀:
@keyframes fadeIn {
/* 标准语法 */
}
@-webkit-keyframes fadeIn {
/* Safari 和 Chrome */
}
@-moz-keyframes fadeIn {
/* Firefox */
}
@-o-keyframes fadeIn {
/* Opera */
}
.element {
animation: fadeIn 1s;
-webkit-animation: fadeIn 1s; /* Safari 和 Chrome */
-moz-animation: fadeIn 1s; /* Firefox */
-o-animation: fadeIn 1s; /* Opera */
}总结
CSS Animation是创建丰富动态界面的强大工具,通过结合 @keyframes 和 animation 属性,我们可以实现各种复杂的动画效果,提升用户体验。正确使用动画性能优化技巧,可以确保动画流畅运行,不会影响页面性能。