搜尋

純 CSS 製作不規則形狀動畫

通常製作 CSS 動畫時,都只是單純的位移、旋轉或放大縮小,但如果透過 path() 函式搭配 clip-path,就能展現更多 CSS 動畫的創意,這篇教學會介紹如何建立「可以製作動畫」的路徑,以及透過 clip-path 和 animation 製作不規則形狀動畫。

快速導覽:

CSS 教學 - 純 CSS 製作不規則形狀動畫

如何繪製路徑?

在 CSS 中使用的路徑,基本上和 SVG 的路徑相同,差別只在於 SVG 多了許多填色、粗細、視圖等圖形專用的屬性,但對於 CSS 而言,只需要有「路徑」的編碼,就可以開心的透過路徑創造出各種效果,通常要繪製路徑,通常都會使用 Adobe Illustrator 等向量繪圖軟體繪製,幾乎不會有人透過撰寫程式碼繪製 ( 參考「認識路徑 path 」),如果手邊沒有 Adobe Illustrator,也可以透過免費的線上向量繪圖工具 Vectorpea 繪製,從下方的連結開啟 Vectorpea。

開啟 Vectorpea:https://www.vectorpea.com/

CSS 教學 - 純 CSS 製作不規則形狀動畫 - 開啟 Vectorpea

啟 Vectorpea 之後,點擊「新增專案」,建立一個尺寸為 300x300 的空白檔案,尺寸可以按照個人需求調整,不過因為是網頁動畫圖片,建議不需要太大尺寸 ( 使用 Illustrator 也是同樣做法 )。

CSS 教學 - CSS 路徑 path  ( 函式類型 ) - Vectorpea 新增專案

使用左側「鋼筆 Pen」工具,在畫布中點擊繪製路徑,單純點擊可以產生直線 ( 使用 Illustrator 也是同樣做法 )。

CSS 教學 - CSS 路徑 path  ( 函式類型 ) - Vectorpea 鋼筆繪製直線

如果點擊時壓著滑鼠不放,就可以繪製貝茲曲線 ( 使用 Illustrator 也是同樣做法 )。

CSS 教學 - CSS 路徑 path  ( 函式類型 ) - Vectorpea 鋼筆繪製貝茲曲線

編輯路徑後,用滑鼠拖拉節點調整鈕就能調整貝茲曲線形狀,連續點擊節點就能變成「尖角」或「圓角」。

CSS 教學 - CSS 路徑 path  ( 函式類型 ) - 用滑鼠拖拉節點調整鈕調整貝茲曲線形狀

繪製完成後,從左上選單 File 裡選擇「Export as > SVG」,將檔案輸出為 SVG 格式 ( 勾選 minify )。

CSS 教學 - CSS 路徑 path  ( 函式類型 ) - Vectorpea 將檔案輸出為 SVG 格式

使用瀏覽器打開 SVG 觀察原始碼,就可以看見 SVG 的 path 元素,當中的 d 參數就是路徑,進行到這個步驟後就已經完成了路徑繪製。

CSS 教學 - CSS 路徑 path  ( 函式類型 ) - 看見 SVG 的 path 元素當中的 d 參數

製作 CSS 動畫專用的路徑

知道如何繪製路徑之後,接著要繪製「CSS 動畫專用」的路徑,所謂動畫專用需要符合下列幾種條件:

  • 節點數需要相同
  • 調整控制點數量需要相同

舉例來說,下方是一個單純四邊形的路徑,以及一個單純圓形的路徑,由於四邊形的四個點沒有「貝茲曲線調整控制點」,因此路徑編碼和圓形的路徑編碼截然不同

CSS 教學 - 純 CSS 製作不規則形狀動畫 - 單純四邊形的路徑編碼和圓形的路徑編碼截然不同

如果節點、調整控制點的數量不同,進行動畫 animatino 或轉場 transition 效果時,由於 CSS 無法計算需要加入的補間值,就會發生「忽略補間值」,直接從開頭跳到結尾的現象,下方的例子會使用上述的四邊形和圓形路徑編碼,當滑鼠移動到四邊形上方時,可以發現完全沒有補間動畫效果,直接從正方形變成了圓形,原本設定的 transition: .5s 也由於沒有補間動畫,變成了延遲 0.5 秒。

線上展示:https://codepen.io/oxxo/pen/yyBKdqR

<!-- HTML 程式碼 -->
<div></div>

<!-- CSS 程式碼 -->
<style>
  div {
    width: 200px;
    height: 200px; 
    background: orange;
    transition: .5s;
    clip-path: path("m173 24v147h-147v-147z");
  }
  div:hover {
    clip-path: path("m99.5 178c-43.4 0-78.5-35.1-78.5-78.5 0-43.4 35.1-78.5 78.5-78.5 43.4 0 78.5 35.1 78.5 78.5 0 43.4-35.1 78.5-78.5 78.5z");
  }
</style>

CSS 教學 - 純 CSS 製作不規則形狀動畫 - 節點與調整點數量不同,無法產生補間動畫

因此如果要做到具有補間動畫效果,就必須在向量繪圖軟體中,將正方形的四個節點修改成「有調整控制點」的路徑,且控制點的數量也需要和圓形相同,都是一個節點搭配兩個控制點

CSS 教學 - 純 CSS 製作不規則形狀動畫 - 將正方形的四個節點修改成「有調整控制點」的路徑

完成後儲存成 SVG 並讀取原始碼取的路徑,替換正方形的路徑之後,就能產生漂亮的補間動畫效果,如果發生「位移較大」的狀況,通常是「起點位置」不同所導致,修改路徑起點就能解決這個狀況

線上展示:https://codepen.io/oxxo/pen/ZYzxdjw

<!-- HTML 程式碼 -->
<div></div>

<!-- CSS 程式碼 -->
<style>
  div {
    width: 200px;
    height: 200px; 
    background: orange;
    transition: .5s;
    clip-path: path("m26 173c0-52.1 0.1-104.5 0.1-147 39.7 0 117 0.1 147 0.1 0 40.9-0.1 114.7-0.1 147-30 0-117-0.1-147-0.1z");
  }
  div:hover {
    clip-path: path("m99.5 178c-43.4 0-78.5-35.1-78.5-78.5 0-43.4 35.1-78.5 78.5-78.5 43.4 0 78.5 35.1 78.5 78.5 0 43.4-35.1 78.5-78.5 78.5z");
  }
</style>

CSS 教學 - 純 CSS 製作不規則形狀動畫 - 將節點與控制點數量改為一致,產生漂亮的補間動畫效果

運用同樣的方式,在「固定節點與控制點」的前提下,將正方形改成愛心圖案,並記下愛心圖案的路徑編碼。

CSS 教學 - 純 CSS 製作不規則形狀動畫 - 將正方形改成愛心圖

修改剛剛的程式碼,將圓形的路徑編碼換成愛心路徑編碼,執行後當滑鼠移動到四邊形上方時,就會看見變成愛心圖案的效果。

線上展示:https://codepen.io/oxxo/pen/JoPLQeo

<!-- HTML 程式碼 -->
<div></div>

<!-- CSS 程式碼 -->
<style>
  div {
    width: 200px;
    height: 200px; 
    background: orange;
    transition: .5s;
    clip-path: path("m26 173c0-52.1 0.1-104.5 0.1-147 39.7 0 117 0.1 147 0.1 0 40.9-0.1 114.7-0.1 147-30 0-117-0.1-147-0.1z");
  }
  div:hover {
    clip-path: path("m101 171.2c-79.9-14.5-97-110.2-72.9-125.5 30.2-19.3 57.7-8.2 72.9 23 18.9-32 42.4-55 74.8-25.8 20.2 18.1 0.4 100-74.8 128.3z");
  }
</style>

CSS 教學 - 純 CSS 製作不規則形狀動畫 - 四邊形變成愛心的動畫效果

製作不規則形狀動畫

了解繪製 CSS 動畫路徑的原理之後,就可以開始著手製作「不規則形狀動畫」,首先繪製一個圓形,接著在圓形的邊緣上新增一些節點 ( 根據個人喜好新增 ),將圓形另存為 SVG 產生路徑編碼後,利用「節點調整」工具調整節點位置,使其變成另外一個形狀,依此類推產生兩個形狀,並都另存為 SVG 產生路徑編碼

CSS 教學 - 純 CSS 製作不規則形狀動畫 - 產生三個形狀的路徑編碼

三個圖形的路徑編碼完成後,使用下方範例,利用 CSS animation 製作動畫,就能產生漂亮的不規則形狀動畫。

參考:CSS 動畫 animationclip-path 使用 path 繪製不規則形狀

線上展示:https://codepen.io/oxxo/pen/QwLmXXV

<!-- HTML 程式碼 -->
<div></div>

<!-- CSS 程式碼 -->
<style>
  div {
    background: orange;
    width: 200px;
    height: 200px;
    animation: oxxo 2s infinite;
  }

  @keyframes oxxo {
    0% {clip-path: path("m100 178c-18 0-34.6-6.1-47.8-16.3-10.8-8.4-19.4-19.6-24.6-32.5-3.6-9-5.6-18.9-5.6-29.2 0-14.3 3.8-27.7 10.6-39.3 7.3-12.5 18-22.8 30.9-29.7 10.9-5.7 23.3-9 36.5-9 17.9 0 34.5 6 47.6 16.2 10.7 8.2 19.2 19.2 24.4 31.8 3.9 9.2 6 19.4 6 30 0 14.4-3.9 28-10.7 39.6-6.8 11.4-16.3 20.9-27.7 27.7-11.6 6.8-25.2 10.7-39.6 10.7z");}
    25% {clip-path: path("m96.7 113.1c-18 0-31.3 58.8-44.5 48.6-10.8-8.4 30.1-41.4 24.9-54.3-3.6-9.1-55.1 2.9-55.1-7.4 0-14.3 49.6-0.4 56.3-12 7.3-12.5-27.7-50.1-14.8-57 10.9-5.7 23.3 54.3 36.5 54.3 17.9 0 34.5-57.3 47.6-47.1 10.7 8.2-35.5 40.3-30.2 53 3.8 9.2 60.6-1.8 60.6 8.8 0 14.4-59.1-5.4-65.9 6.2-6.8 11.4 38.9 54.3 27.5 61.1-11.6 6.8-28.5-54.2-42.9-54.2z");}
    50% {clip-path: path("m100 178c-18 0 6.2-50.2-7-60.5-10.8-8.4-60.2 24.6-65.4 11.7-3.6-9 52.1-22.1 52.1-32.4 0-14.3-53.9-24.5-47.1-36.1 7.3-12.5 41.4 21.2 54.3 14.4 10.8-5.8-0.1-53.1 13.1-53.1 17.9 0 1.9 39.1 15 49.2 10.7 8.3 51.8-13.8 57-1.2 3.9 9.2-47.8 15.2-47.8 25.8 0 14.5 49.9 32.2 43.1 43.8-6.8 11.4-41.4-28.3-52.9-21.6-11.6 6.8 0 60-14.4 60z");}
    75% {clip-path: path("m96.7 113.1c-18 0-31.3 58.8-44.5 48.6-10.8-8.4 30.1-41.4 24.9-54.3-3.6-9.1-55.1 2.9-55.1-7.4 0-14.3 49.6-0.4 56.3-12 7.3-12.5-27.7-50.1-14.8-57 10.9-5.7 23.3 54.3 36.5 54.3 17.9 0 34.5-57.3 47.6-47.1 10.7 8.2-35.5 40.3-30.2 53 3.8 9.2 60.6-1.8 60.6 8.8 0 14.4-59.1-5.4-65.9 6.2-6.8 11.4 38.9 54.3 27.5 61.1-11.6 6.8-28.5-54.2-42.9-54.2z");}
    100% {clip-path: path("m100 178c-18 0-34.6-6.1-47.8-16.3-10.8-8.4-19.4-19.6-24.6-32.5-3.6-9-5.6-18.9-5.6-29.2 0-14.3 3.8-27.7 10.6-39.3 7.3-12.5 18-22.8 30.9-29.7 10.9-5.7 23.3-9 36.5-9 17.9 0 34.5 6 47.6 16.2 10.7 8.2 19.2 19.2 24.4 31.8 3.9 9.2 6 19.4 6 30 0 14.4-3.9 28-10.7 39.6-6.8 11.4-16.3 20.9-27.7 27.7-11.6 6.8-25.2 10.7-39.6 10.7z");}
  }
</style>

CSS 教學 - 純 CSS 製作不規則形狀動畫 - 不規則形狀動畫

小結

透過 CSS 製作不規則形狀的程式碼其實相當簡單,最困難的其實是「繪製路徑」,除了要精準控制節點和控制點數量,如何繪製出漂亮的形狀以及掌握補間動畫效果才是重點,不過只要多次嘗試練習,就可以做出漂亮的不規則形狀效果囉。

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則 CSS 常用樣式屬性

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 使用巢狀結構語法 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

關鍵字與文字數值 長度與角度單位 位置名稱與時間單位

規則與定義

變數 ( Variables ) 媒體查詢 ( @media ) 容器查詢 ( @container ) 自訂屬性值 ( @property ) 匯入樣式 ( @import ) 分層優先順序 ( @layer )

函式類型

數學計算 文字與清單計數 形狀與線段 路徑 ( path ) 生成內容與引號

顏色與濾鏡

顏色單位 色彩模型 漸層色 影像濾鏡 ( filter ) 背景濾鏡 ( backdrop-filter ) 混合模式 ( mix-blend-mode )

文字與段落

設定字型 ( font-family ) 使用外部字型 定義字型 ( @font-face ) 文字尺寸 文字樣式 ( 常用 ) 文字樣式 ( 其他實用 ) 文字樣式 ( 特殊用途 ) 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 文字自動分欄

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬度與高度 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 ( border-radius ) 影像邊框 ( border-image ) 輪廓 ( outline ) 內容溢出與裁切 ( overflow ) 內容範圍 ( contain ) 可見性與透明度

背景與陰影

背景顏色 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 定義計數規則 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 定位 ( position )

Flexbox 彈性排版

Flexbox 彈性盒子 Flexbox 對齊方式 Flexbox 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 自訂動畫路徑 ( offset ) 動畫觸發事件 多重動畫的權重與順序

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask ) 物件填滿方式與定位 轉換函式 ( transform ) 平移、旋轉與縮放 3D 轉換與透視 3D 正多面體

視窗與使用者行為

捲軸樣式 ( scrollbar ) 滑鼠游標圖示 ( cursor ) 滑鼠事件 ( pointer-events ) 使用者選取 ( user-select ) 捲動行為 ( scroll、overscroll )

範例效果

CSS 圓餅圖 CSS 跑馬燈 Google 載入動畫 漸層色的轉場與動畫 電子時鐘數字 不規則形狀動畫