用純 HTML + CSS 畫出圓餅圖
爬了很多文,終於做出不用外掛的純 HTML + CSS 的圓餅圖。
在 AC 的課程作業中有練習為鋼鐵人製作簡單的名片及介紹網頁,我在做的時候就一直想著之後也要為自己做網頁版名片和履歷!
上網搜尋看到別人的作品用圓餅圖或是長條圖來呈現技能熟練度,我原本想說:「喔,就放幾張圖片就好了。」,準備要開始用 AI 畫圖之前,覺得先用 Devtools 看一下那個人的圖是怎麼做的好了,看一下完全佩服耶!人家是用語法寫的,不是放圖片!
我看到的履歷畫面類似這樣
(圖片截自網路上別人的作品)

當時看到這個呈現方式就非常想學,上網查了很多關鍵字,但網路上的文章很多都是用外掛套件做的,很少用純 HTML + CSS 做,我有查到原作者做這個圓餅圖的原理跟教學,同一篇也有教長條圖和其他圖的畫法,非常實用,但我覺得原理有點複雜,後來我又找到了幾篇覺得比較好理解的,我會一併把參考文章放在最後呦!
跟著實作了之後我做了兩款不同的樣子,一種是單純圓餅圖,字要放外面;另一種是外框顯示比例,中間可以放字。
看看成品
以 50% 作為區分,50% 以下和 50% 以上的作法有一點點不一樣,所以有四個圓餅圖。

先做單純的圓餅圖,字要放外面,開始第一步啦~
先畫出兩個 Div 區塊,這不是圓餅圖本體,只是為了讓圓餅圖整齊排好所以先做的排版,背景色設定淺紫色是方便看區塊的位置及大小,也可以用別的顏色或是不要設定背景顏色。

程式碼
1 | <div>不會動的圓餅圖<br>(小於50%)</div> |
1 | div { |
接下來是圓餅圖了,兩個圓餅長一樣,所以用同一個CSS 的選擇器。
1 | .pie1, .pie2 { |

文章講述的原理是利用漸層背景的方式製作出圓餅圖,先把圓餅圖切一半,上面再利用一個圖層遮罩偽元素讓增減的百分比顯示或隱藏。
兩個圓餅圖共同一個選擇器,添加線性漸層的背景,顏色一半是背景色,另一半則是可以自訂的顏色。
1 | background-image: /* 背景為線性漸層 */ linear-gradient( |
添加線性漸層的背景,將圓餅圖切半,寫完之後會長這樣。

線性漸層的撰寫方式
background:linear-gradient(方向, 顏色1 位置, 顏色2 位置);
接下來用偽元素覆蓋在兩個圓餅圖上層,做出圓餅圖不同的 % 數,到這裡因為兩個圓餅圖的 % 數不同了,所以選擇器要分開寫喔~
1 | /* 加入上方遮罩偽元素 <50% */ |

到這邊就完成單純的圓餅圖了,文字要放外面,如果想要做外框顯示比例,中間可以放字的圓餅圖的話,我在圓餅圖中間再加上一個圓形。
來做外框顯示比例,中間可以放字的圓餅圖

1 | <div> |

1 | .pie1-m, |
到這裡會緊張,為什麼上面的圓形不在圓餅圖正中間?
沒關係!在上面的 CSS 裡我們已經把這個圓形區塊定位方式設定成 absolute 絕對定位了,接下來要利用上下左右距離,把上面的圓形區塊推到正中間,或是也可以利用這種方式把圓形推到其他想放的位置。

1 | .pie1-m { |
這裡要注意的是,依照我的排版方式,我的圓形跟上方和左方的距離是這樣的數值.如果排版的方式改變了,距離也會改變,所以要依照自己的排版去調整上下左右的距離數值喔!
調整完就得到好看的圓餅圖了!
(上面背景利用淺紫色、圓形用淺藍色,是為了讓區塊看得清楚,做完之後也可以再調整~)

附上圓餅圖們的 Codepen ~
參考資料:
純 HTML + CSS 的圓餅圖參考這篇(有包含長條圖畫法)
hahow好學校 - 動畫互動網頁程式入門 (HTML/CSS/JS)
這裡練習的是參考這兩篇(兩篇原理相同,但詳細度和講解方法不同。)
Secret 14: 簡單的圓餅圖 (CSS transforms)
用css能實現一個圓等分12份的樣子嗎?

