CSS 動畫怎麼做?從基礎到進階的完整入門指南

快速解答
CSS 動畫主要有兩種方法:transition(過渡)用於簡單的狀態變化如 hover 效果,animation 搭配 @keyframes 用於複雜的動畫序列。掌握這兩個屬性就能製作大部分的網頁動畫。
為什麼要學習 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 動畫技巧,你就能為網站創造出既美觀又實用的動畫效果!記住,好的動畫應該服務於用戶體驗,而不是單純的炫技。