本章節是我們將提到CSS中基本的動畫呈現。透過實作一個月球軌道旋轉效果。
首先,先確定我們在 HTML 中要使用到的元素,分別是地球、軌道和月球,以下是HTML程式碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
<title>Moon Orbit</title>
</head>
<body>
<div class="space">
<div class="earth"></div>
<div class="orbit">
<div class="moon"></div>
</div>
</div>
</body>
</html>
好,接著我們為body區塊和space空間設定CSS樣式:
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #000;
}
.space {
width: 200px;
height: 200px;
position: relative; /* 為後續的元素設定參考點以供參考 */
background-color: #fff; /* 這行之後可以自行刪掉 */
}
呈現效果:
接著我們設定地球的CSS樣式,他應該置中於space。
.earth {
width: 100px;
height: 100px;
background-color: #0077be;
border-radius: 50%;
position: absolute;
left: 50%;
top: 50%;
}
呈現效果:
這邊你可以發現: 地球並沒有位於中心,這是因為left: 50%
和 top: 50%
是相對於父元素的。
所以我們要添加transform: translate(-50%, -50%);
這行語句,這裡的 translate
是基於元素自身尺寸的(水平向左偏移 50%,垂直向上偏移 50%)。
.earth {
width: 100px;
height: 100px;
background-color: #0077be;
border-radius: 50%;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
呈現效果:
好,接著要為軌道設定CSS樣式:
.orbit {
background-color: pink;
z-index: -1;
width: 200px;
height: 200px;
position: absolute;
transform: translate(-50%, -50%);
}
z-index
設為 -1 ,讓我們方便觀察效果。這時候,我們來為月球設定CSS樣式,
.moon {
width: 30px;
height: 30px;
background-color: #c0c0c0;
border-radius: 50%;
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
}
呈現效果:
這時候,讀者可以想像將粉紅色方塊一直旋轉時(固定右下角並順時針旋轉),月球就像是在繞著地球轉動,且保持了一個適當的距離做旋轉。
那我們當然要把旋轉的效果做出來,這時候就需要了解動畫如何運作了。
CSS 動畫分為兩大類:過渡(Transitions) 和 關鍵影格動畫(Keyframes Animation)。以下是詳細介紹:
CSS 過渡允許當元素的屬性值發生變化時,逐步地進行過渡效果。
transition: property duration timing-function delay;
color
、background-color
、transform
)。1s
)。ease
、linear
、ease-in
、ease-out
)。0.5s
)。而另一種就是我現在要使用的,CSS 關鍵影格動畫允許開發者定義多個動畫狀態,並根據時間進行控制,實現複雜的動畫效果。
語法:
@keyframes animation-name {
0% { /* 起始狀態 */ }
50% { /* 中間狀態 */ }
100% { /* 結束狀態 */ }
}
selector {
animation: animation-name duration timing-function delay iteration-count direction fill-mode;
}
infinite
表示無限循環)。normal
、reverse
)。forwards
保留最後狀態)。這邊我們直接實作一個簡單的轉動動畫效果 :
定義一個名為orbit
的動畫,實現了物體旋轉的效果。
@keyframes orbit {
0% {
transform: rotate(0deg) translate(-50%, -50%);
}
100% {
transform: rotate(360deg) translate(-50%, -50%);
}
}
0%
和 100%
)表示動畫的起始和結束狀態。0%
(動畫的起始狀態):
transform: rotate(0deg)
: 元素初始旋轉角度為 0度
,即沒有旋轉。translate(-50%, -50%)
: 讓粉紅色方塊的右下角對齊 space 中心點位置。100%
(動畫的結束狀態):
transform: rotate(360deg)
: 元素完成一整圈旋轉(360 度),回到起始角度。translate(-50%, -50%)
: 一樣讓粉紅色方塊的右下角對齊 space 中心點位置。好,最後我們只要再做一步就可以讓動畫運作了,將以下語句插入到 .orbit 選擇器中:
animation: orbit 5s linear infinite;
animation-name: orbit;
animation-duration: 5s;
animation-timing-function: linear;
animation-iteration-count: infinite;
.orbit {
background-color: pink; /* 讀者可以自行刪掉這行 */
z-index: -1; /* 讀者可以自行刪掉這行 */
width: 200px;
height: 200px;
position: absolute;
transform: translate(-50%, -50%); /* 當動畫開始後讀者可以刪掉這行,這邊只是為了觀察月球是否保持了一個適當的距離 */
animation: orbit 5s linear infinite;
}
這時候,動畫的效果就完成了,應該會呈現月球繞著地球轉動的動畫效果。