CSS 动画怎么做?从基础到进阶的完整入门指南
为什么要学习 CSS 动画?
CSS 动画是现代网页设计的核心技能之一,能让静态页面瞬间变得生动有趣。无论是微妙的淡入效果,还是复杂的互动动画,都能大幅提升用户体验。
本指南将带你从最基础的概念开始,逐步掌握 CSS 动画的各种技巧。每个范例都包含完整的程式码说明,让你不只会用,更能理解背后的原理。
CSS 动画的两种方式
CSS 动画主要有两种实现方式:
- Transition(过渡):适合简单的状态变化
- Animation(动画):适合复杂的动画序列
让我们从最基础的透明度动画开始!
透明度动画:淡入淡出效果
将鼠标悬停在第一个方块上,点击第二个方块重新播放
透明度动画程式码解析
上方范例展示了三种不同的透明度动画实现方式:
1. Transition 淡化效果
.fade-transition {
opacity: 1;
transition: opacity 0.5s ease-in-out;
}
.fade-transition:hover {
opacity: 0.3;
}2. Animation 呼吸效果
.fade-animation {
animation: breathing 2s ease-in-out infinite;
}
@keyframes breathing {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.6; transform: scale(1.05); }
}3. 淡入动画
.fade-in {
opacity: 0;
animation: fadeIn 1.5s ease-out forwards;
}
@keyframes fadeIn {
0% { opacity: 0; transform: translateY(20px); }
100% { opacity: 1; transform: translateY(0); }
}关键概念:
transition:定义属性变化的过渡效果@keyframes:定义动画的关键帧animation:应用动画到元素上forwards:动画结束后保持最后一帧的状态
位移动画:滑动与弹跳效果
点击任意动画元素可重新播放该动画
位移动画程式码解析
位移动画是创造动感效果的基础,以下是三种常用的位移动画:
1. 左右滑动动画
.slide-box {
animation: slideLeftRight 3s ease-in-out infinite;
}
@keyframes slideLeftRight {
0%, 100% { left: 10px; }
50% { left: calc(100% - 70px); }
}2. 弹跳动画
.bounce-box {
animation: bounce 2s ease-in-out infinite;
}
@keyframes bounce {
0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
40% { transform: translateY(-30px); }
60% { transform: translateY(-15px); }
}3. 旋转滑动组合
.spin-slide-box {
animation: spinSlide 4s ease-in-out infinite;
}
@keyframes spinSlide {
0% { left: 10px; transform: rotate(0deg); }
25% { left: calc(100% - 70px); transform: rotate(180deg); }
75% { left: 10px; transform: rotate(360deg); }
}重点技巧:
- 使用
calc()计算动态位置 transform比left/top性能更好ease-in-out让动画更自然
复合动画:多重效果组合
使用控制按钮来操作动画播放,体验不同的动画控制方式
复合动画程式码解析
复合动画结合多种效果,创造出丰富的视觉体验:
1. 彩虹旋转球
.rainbow-spinner {
background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1);
background-size: 300% 300%;
animation: rainbowSpin 3s ease-in-out infinite;
}
@keyframes rainbowSpin {
0% {
transform: rotate(0deg) scale(1);
background-position: 0% 50%;
}
50% {
transform: rotate(180deg) scale(0.8);
background-position: 100% 50%;
}
100% {
transform: rotate(360deg) scale(1);
background-position: 0% 50%;
}
}2. 脉冲波纹效果
.pulse-wave {
animation: pulseWave 2s ease-out infinite;
}
.pulse-wave::before,
.pulse-wave::after {
content: '';
position: absolute;
border: 2px solid #8b5cf6;
border-radius: 50%;
animation: ripple 2s ease-out infinite;
}
@keyframes ripple {
0% { transform: scale(1); opacity: 1; }
100% { transform: scale(2.5); opacity: 0; }
}3. JavaScript 动画控制
// 暂停/播放动画
element.style.animationPlayState = 'paused'; // 暂停
element.style.animationPlayState = 'running'; // 播放
// 重置动画
element.style.animation = 'none';
element.offsetHeight; // 强制重排
element.style.animation = 'animationName 2s ease infinite';
// 调整动画速度
element.style.animationDuration = '1s'; // 加快速度CSS 动画最佳实践
性能优化技巧
-
优先使用 transform 和 opacity
- 这些属性不会触发重新布局,性能最佳
- 避免动画 width、height、top、left 等属性
-
合理设置动画时长
- 微互动:100-300ms
- 页面切换:300-500ms
- 装饰动画:1-3秒
-
使用 will-change 优化
.animated-element {
will-change: transform, opacity;
}用户体验考量
支援无障碍设计
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
}
}提供动画控制
- 对于循环动画,提供暂停选项
- 避免过于频繁或刺眼的动画
- 确保动画有明确的开始和结束状态
掌握这些 CSS 动画技巧,你就能为网站创造出既美观又实用的动画效果!记住,好的动画应该服务于用户体验,而不是单纯的炫技。