本文將說明如何建立 CodePen 上一些熱門動畫。這些動畫都使用本節其他文章中討論的高效能技術。
如要瞭解這些建議背後的理論,請參閱「為什麼部分動畫會變慢?」,如需實用提示,請參閱「動畫指南」。
精靈載入動畫
這個載入動畫完全是以 CSS 建構而成。 圖片和所有動畫都是以 CSS 和 HTML 建立,沒有圖片或 JavaScript。如要瞭解該廣告的建立方式和成效,可以使用 Chrome 開發人員工具。
使用 Chrome 開發人員工具檢查動畫
在動畫執行時,開啟 Chrome 開發人員工具中的「效能」分頁,並錄製幾秒的動畫。 您應該會在「摘要」中看到,執行這項動畫時,瀏覽器不會執行任何版面配置或繪製作業。

如要瞭解如何達成這項動畫效果,且不會導致版面配置和繪製作業,請在 Chrome 開發人員工具中檢查任何移動的元素。您可以使用「動畫」面板找出各種動畫元素,點選任一元素即可在 DOM 中醒目顯示。

舉例來說,選取三角形,然後觀察元素方塊在空中旋轉並返回起始位置的過程中,如何變形。
在元素仍處於選取狀態時,查看「樣式」面板。 您可以在該處查看繪製三角形形狀的 CSS,以及使用的動畫。
運作方式
三角形是使用 ::after
虛擬元素新增產生的內容,並使用邊框建立形狀。
.triangle {
position: absolute;
bottom: -62px;
left: -10px;
width: 110px;
height: 110px;
border-radius: 50%;
}
.triangle::after {
content: "";
position: absolute;
top: 0;
right: -10px;
width: 0;
height: 0;
border-style: solid;
border-width: 0 28px 48px 28px;
border-color: transparent transparent #89beb3 transparent;
}
動畫會透過下列 CSS 程式碼新增:
animation: path_triangle 10s ease-in-out infinite;
在 Chrome 開發人員工具中,向下捲動「樣式」面板,即可找到關鍵影格。您會發現動畫是透過 transform
變更元素位置並旋轉元素所建立。
transform
屬性是動畫指南中說明的其中一個屬性,不會導致瀏覽器執行版面配置或繪製作業 (這是動畫緩慢的主要原因)。
@keyframes path_triangle {
0% {
transform: translateY(0);
}
10% {
transform: translateY(-172px) translatex(10px) rotate(-10deg);
}
55% {
transform: translateY(-172px) translatex(10px) rotate(-365deg);
}
58% {
transform: translateY(-172px) translatex(10px) rotate(-365deg);
}
63% {
transform: rotate(-360deg);
}
}
這項動畫的每個不同移動部分都使用類似技術。因此可順暢執行複雜動畫。
閃爍圓圈
這類動畫有時會用來吸引使用者注意網頁上的某個項目。 如要瞭解動畫,可以使用 Firefox 開發人員工具。
使用 Firefox 開發人員工具檢查動畫
動畫執行時,開啟 Firefox 開發人員工具中的「效能」分頁,並錄製幾秒的動畫。 停止錄製,您應該會在瀑布圖中看到「Recalculate Style」沒有任何項目。您現在知道這個動畫不會導致樣式重新計算,因此也不會導致版面配置和繪製作業。

在 Firefox 開發人員工具中,檢查圓圈,瞭解動畫的運作方式。
類別為 pulsating-circle
的 <div>
會標示圓圈的位置,但不會自行繪製圓圈。
.pulsating-circle {
position: absolute;
left: 50%;
top: 50%;
transform: translateX(-50%) translateY(-50%);
width: 30px;
height: 30px;
}
可見的圓圈和動畫是使用 ::before
和 ::after
虛擬元素達成。
::before
元素會建立延伸至白色圓圈外的不透明圓環,並使用名為 pulse-ring
的動畫,為 transform: scale
和 opacity
製作動畫。
.pulsating-circle::before {
content: '';
position: relative;
display: block;
width: 300%;
height: 300%;
box-sizing: border-box;
margin-left: -100%;
margin-top: -100%;
border-radius: 45px;
background-color: #01a4e9;
animation: pulse-ring 1.25s cubic-bezier(0.215, 0.61, 0.355, 1) infinite;
}
@keyframes pulse-ring {
0% {
transform: scale(0.33);
}
80%, 100% {
opacity: 0;
}
}
如要查看動畫屬性,也可以在 Firefox 開發人員工具中選取「動畫」面板。 接著,您會看到所用動畫的視覺化效果,以及動畫屬性。
白色圓圈本身是使用 ::after
虛擬元素建立及動畫化的。動畫 pulse-dot
會使用 transform: scale
在動畫期間放大及縮小圓點。
.pulsating-circle::after {
content: '';
position: absolute;
left: 0;
top: 0;
display: block;
width: 100%;
height: 100%;
background-color: white;
border-radius: 15px;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.3);
animation: pulse-dot 1.25s cubic-bezier(0.455, 0.03, 0.515, 0.955) -0.4s infinite;
}
@keyframes pulse-dot {
0% {
transform: scale(0.8);
}
50% {
transform: scale(1);
}
100% {
transform: scale(0.8);
}
}
這類動畫可用於應用程式的各種位置,但請務必確保這些細微的變化不會影響應用程式的整體效能。
純 CSS 3D 球體
在 CodePen 上查看 Pure CSS 3D Sphere
這項動畫看似非常複雜,但其實是使用先前範例中已見過的技術。複雜度來自於大量元素的動畫。
開啟 Chrome 開發人員工具,然後選取其中一個類別為 plane
的元素。
球體由一組旋轉平面和輪輻組成。
這些平面和輻條位於包裝函式 <div>
內,而這個元素會使用 transform: rotate3d
旋轉。
.sphere-wrapper {
transform-style: preserve-3d;
width: 300px;
height: 300px;
position: relative;
animation: rotate3d 10s linear infinite;
}
@keyframes rotate3d {
0% {
transform: rotate3d(1, 1, 1, 0deg);
}
25% {
transform: rotate3d(1, 1, 1, 90deg);
}
50% {
transform: rotate3d(1, 1, 1, 180deg);
}
75% {
transform: rotate3d(1, 1, 1, 270deg);
}
100% {
transform: rotate3d(1, 1, 1, 360deg);
}
}
點會巢狀內嵌在 plane
和 spoke
元素中,並使用動畫來縮放及平移這些點。這會產生脈衝效果。
.spoke-15 .dot,
.spoke-21 .dot {
animation: pulsate 0.5s infinite 0.83333333s alternate both;
background-color: #55ffee;
}
@-webkit-keyframes pulsate {
0% {
transform: rotateX(90deg) scale(0.3) translateZ(20px);
}
100% {
transform: rotateX(90deg) scale(1) translateZ(0px);
}
}
製作這段動畫時,我們需要掌握正確的時間點,並建立轉動和脈衝效果。動畫本身相當簡單,且使用的效能極佳的方法。
如要查看這個動畫的執行效能,請開啟 Chrome 開發人員工具,並在動畫執行時記錄效能。 初始載入後,動畫不會觸發版面配置或繪製,而且會順暢執行。
結論
從這些範例中,您可以看到如何使用高效能方法為幾個屬性製作動畫,創造出非常酷炫的動畫。 預設使用動畫指南中說明的效能良好方法,您就能將時間花在建立所需效果上,不必擔心網頁速度變慢。