使用css3畫餅圖

CSS3 Gradient介紹參考地址:css

http://www.cnblogs.com/lhb25/archive/2013/01/30/css3-linear-gradient.htmlhtml

http://www.zhangxinxu.com/wordpress/?p=3639css3

 

效果圖:算法

 

 

 

html:瀏覽器

<div class="colorWheel">
    <div class="piece"></div>
</div>

css:wordpress

.colorWheel {
  position: relative;
  width: 16em;
  height: 16em;
  background: linear-gradient(36deg, #7c1 42%, transparent 42%),linear-gradient(72deg, #999 75.48%, transparent 75.48% ),linear-gradient(-36deg, #479bf6 42%, transparent 42%) 100% 0,linear-gradient(-72deg, yellow 75.48%, transparent 75.48%) 100% 0,linear-gradient(-36deg, transparent 58%, #643 58%) 0 100%,linear-gradient(-72deg, transparent 24.52%, #8a1 24.52%) 0 100%,linear-gradient(36deg, transparent 58%, #90a 42%) 100% 100%,linear-gradient(72deg,transparent 24.52%, #099 24.52%) 100% 100%,#43a1cd linear-gradient(#ba3e2e, #ba3e2e) 50% 0;
  background-repeat: no-repeat;
  background-size: 50% 50%;
  border:1px solid #ccc;
  border-radius: 50%;
  margin: 30px;
}
.piece{
  position: absolute;
  left: 8%;
  top: -2.6%;
  width: 100%;
  height: 100%;
  background: linear-gradient(-36deg, #5454E3 42%, transparent 42%) 100% 0;
  background-repeat: no-repeat;
  background-size: 50% 50%;
  border-radius: 50%;
}

  


屢次對background設置linear-gradient值,已看暈。。。
那些角度和百分比究竟如何設置?
那塊餅又是怎麼被分出去的?
請看如下分析:
 
以背景中第一條liear-gradient設置爲例:
background:linear-gradient(36deg,#ff0 42%, transparent 42% );
效果圖以下:

  

第一個參數爲角度,如圖中將圓分爲10等分,那麼角度爲360/10=36°,「度」用deg表示。
爲了出現顏色驟停的直線而不是漸變色,在顏色過渡位置使用了屬性值transparent。
百分比計算的是顏色所佔整個區域的面積,計算公式爲:100*sin36/(sqrt(2)*cos9)
     sin36 中的36指每一個色塊的佔圓心角角度爲36°;
     cos9 中的9用45-36計算得來。
若是每一個色塊中圓心角的度數爲α, 計算面積公式轉化爲 100*sinα/(sqrt(2)*cos(45-α))

公式來源:spa

與梯度垂直的線上的全部點的顏色。從第三象限的頂點引出的垂直與梯度的直線是0% line,從第一象限的頂點引出的垂直線是100% line。畫一條通過原點、且與0% line和100% line垂直的直線,與0% line交點爲S,與100% line交點爲E,在長方形內任取一點P,假設這點在顏色變化的分界線上,從點P作一條垂直於直線SE的線,垂點爲I;線段SI和SE的比值爲P點所在分界線分開的面積佔整個面積的比例。
 
 
更直觀的線條圖,爲了畫圓截取的是正方形空間,有木有很熟悉的感受。。。
鏈接AB點,過點A做垂直於PI的直線交於D點,則AD長度等於IS長度。
設正方形邊長爲a,則OB長度爲a*sqrt(2)/2;
由數學知識可得,∠MOE=36°,∠EOB=9°;則OE=cos9*a*sqrt(2)/2;
另,IS=AD=sin36*a;
則:IS/SB=IS/2OE=sin36/(cos9*sqrt(2));

以P爲頂點,角度爲α的造成的面積佔正方形總面積的比例計算公式爲:100*sinα/(sqrt(2)*cos(45-α))
說了這麼一大堆,原來只用這個公式來計算就能夠了呢。
 
再來一個例子驗證一下,將圓分爲6等分:
每一個色塊角度爲:360/6=60,
每一個色塊佔所在正方形的面積比例爲:100*sin60/(sqrt(2)*cos(45-60)),強大的js已經有這些經常使用數學公式的算法,Math.sin()和Math.cos()的參數均爲弧度,將角度轉化爲弧度公式:弧度=角度*Π/180,代入上面公式,在瀏覽器調試面板中輸入計算, 100*Math.sin(60*Math.PI/180)/(Math.sqrt(2)*Math.cos(-15*Math.PI/180))=63.4;

html:調試

<div class="sixWheel"></div>

css:htm

.sixWheel{
  width:12rem;
  height:12rem;
  margin-left: 50px;
  background: linear-gradient(60deg, #93f 63.4%, transparent 63.4%), linear-gradient(-60deg, #3f9 63.4%, transparent 63.4%) 100% 0, linear-gradient(-60deg, transparent 36.6%, #f63 36.6%) 0 100%, linear-gradient(60deg, transparent 36.6%, #69c 36.6%, #69c) 100% 100%, #ff9 linear-gradient(#39f, #39f) 50% 0;
  background-repeat: no-repeat;
  background-size: 50% 50%;
  border-radius: 50%;
}

效果圖:blog

  

至此,餅已畫完。
 
那切出來的一塊又該怎麼寫呢?
 
見第一個栗子中的.piece元素,讓這個元素和其父級元素.colorWheel有相同大小,只給這個元素中須要分出來的部分設置背景色,設置方法同上。控制.piece的位置,可實現被切分出去效果。
怎樣移動位置才能使被切分的塊與兩側的塊距離相同是重點。要求的是下圖中OA(橫向移動距離)和AC(縱向移動距離)的長度。

  

如圖示,假設OM和ON圍成銳角爲原區域,CE和CF圍成的銳角爲移動後區域,由於CE到OM的距離等於CF到ON的距離,過C點,做垂直於OM的直線交點爲B點,做垂直與ON的直線交點爲A點,則CB=CA。由此得出∠BOC=∠COA。
若∠AOB=36°,則∠AOC=18°。AC/OA=tan∠AOC。
 
因此,.piece橫向移動位置和縱向移動位置的比例爲tan(α/2)。

 

文章是由看了文章Dig Deep Into CSS Linear Gradients引出的, 文中部分圖片來自此文中圖片,強烈推薦看原文!!!

相關文章
相關標籤/搜索