條狀的進度條我們見得太多了,實現起來比較簡單,它總是長方形的,在方形的地區裡擺放就不太好看了。隨著css3的出現,圓環狀的進度條開始用得越來越多,不過由於IE6/7/8不支援css3,我們只能換其它方法來實現。本文就採用Raphael來畫一個,這個組件對svg和vml進行了一個統一的封裝,根據瀏覽器使用不同的技術實現繪製,因此IE也能用。
先上:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/12250H2B-0.png" border="0" alt="" />
效果還不錯吧?代碼其實也不複雜,拋磚引玉一下:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
- <html xmlns="http://www.w3.org/1999/xhtml" >
- <head>
- <title>圓形進度條</title>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
- <script src="jquery-1.4.2.js"></script>
- <script src="raphael-min.js"></script>
- <style>
- #txt{
- width:74px;
- height:74px;
- line-height:74px;
- position:absolute;
- margin-top:-74px;
- text-align:center;
- color:#9e9fa3;
- font-size:18px;
- font-family:Arial;
- }
- </style>
- <script>
-
- var demo = {
-
- paper: null,
-
- init: function(){
- //初始化Raphael畫布
- this.paper = Raphael("bg", 74, 74);
-
- //把底圖先畫上去
- this.paper.image("progressBg.png", 0, 0, 74, 74);
-
- //進度比例,0到1,在本例中我們畫65%
- //需要注意,下面的演算法不支援畫100%,要按99.99%來畫
- var percent = 0.65,
- drawPercent = percent >= 1 ? 0.9999 : percent;
-
- //開始計算各點的位置,見後圖
- //r1是內圓半徑,r2是外圓半徑
- var r1 = 26, r2 = 31, PI = Math.PI,
- p1 = {
- x:37,
- y:69
- },
- p4 = {
- x:p1.x,
- y:p1.y - r2 + r1
- },
- p2 = {
- x:p1.x + r2 * Math.sin(2 * PI * (1 - drawPercent)),
- y:p1.y - r2 + r2 * Math.cos(2 * PI * (1 - drawPercent))
- },
- p3 = {
- x:p4.x + r1 * Math.sin(2 * PI * (1 - drawPercent)),
- y:p4.y - r1 + r1 * Math.cos(2 * PI * (1 - drawPercent))
- },
- path = [
- 'M', p1.x, ' ', p1.y,
- 'A', r2, ' ', r2, ' 0 ', percent > 0.5 ? 1 : 0, ' 1 ', p2.x, ' ', p2.y,
- 'L', p3.x, ' ', p3.y,
- 'A', r1, ' ', r1, ' 0 ', percent > 0.5 ? 1 : 0, ' 0 ', p4.x, ' ', p4.y,
- 'Z'
- ].join('');
-
- //用path方法畫圖形,由兩段圓弧和兩條直線組成,畫弧線的演算法見後
- this.paper.path(path)
- //填滿漸層色,從#3f0b3f到#ff66ff
- .attr({"stroke-width":0.5, "stroke":"#c32ec3", "fill":"90-#3f0b3f-#ff66ff"});
-
- //顯示進度文字
- $("#txt").text(Math.round(percent * 100) + "%");
- }
-
- };
-
- $(function(){
- demo.init();
- });
- </script>
- </head>
- <body>
-
- <!-- 承載圖形主體 -->
- <div id="bg"></div>
- <!-- 承載進度文字 -->
- <div id="txt"></div>
-
- </body>
- </html>
進度條由兩部分組成,首先是底圖 progressBg.png,74×74的png圖片,把它用Raphael的image方法先畫上去:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/12250L102-1.png" border="0" alt="" />
其次是用Raphael畫進度部分,由兩條圓弧和兩條線段組成,見:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/12250M527-2.png" border="0" alt="" />
先從p1畫順時針圓弧到p2,然後直線到p3,然後逆時針畫圓弧到p4,再直線收回p1。之後用漸層色填充一下。以65%時為例,描述這個圖形的path如下(基本上就是svg的文法):
- M37 69
- A31 31 0 1 1 62.079526825623375 19.778657178933337
- L58.03444185374863 22.7175834403957
- A26 26 0 1 0 37 64
- Z
看起來有點嚇人,其實分成幾部分來看就簡單了:
◆ 第一行表示移動到(37, 69)這個點作為起點,也就是p1;
◆ 第二行表示畫一段圓弧,就是p1到p2之間的這一段;
◆ 第三行表示畫一條直線,就是p2到p3之間的這一段;
◆ 第四行表示畫一段圓板,已經p3到p4之間的這一段;
◆ 第五行表示封閉圖形,相當於從p4連回p1;
這其中比較複雜的是圓弧的參數,其參數是這樣的:
- A rx ry x-axis-rotation large-arc-flag sweep-flag x y
以第一段弧為例,各參數說明如下:
◆ rx和ry:弧的半長軸和半短軸長度,由於我們畫的是正圓,所以我們用的都是31;
◆ x-axix-rotation:此段弧的x軸與水平方向夾角,由於我們畫的是正圓,所以此參數沒用,填了0;
◆ large-arc-flag:大角度弧線還是小角度弧線,簡單點說就是畫圓的哪半邊,1表示大角度。由於我們畫的是65%的弧,是比較大的那半個弧,所以填了1。程式裡是做了判斷的;
◆ sweep-flag:繞中心的方向,1表示順時針,0表示逆時針。我們的第一段弧是順時針的,第二段是逆時針的;
◆ x和y:弧的終點座標;
想深入瞭解的同學可以參考一下這篇文章:http://www.cnblogs.com/dxy1982/archive/2012/04/06/2395729.html,講得挺不錯的。
PS:如果不需要漸層,直接畫一比較粗的圓弧就可以了,要簡單得多。
PPS:不一定要畫正圓,小修改一下,我們也可以畫橢圓形的進度條。
本文出自 “兔子窩” 部落格,請務必保留此出處http://boytnt.blog.51cto.com/966121/1074215