用Raphael在網頁中畫圓環進度條

來源:互聯網
上載者:User

條狀的進度條我們見得太多了,實現起來比較簡單,它總是長方形的,在方形的地區裡擺放就不太好看了。隨著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="" />


效果還不錯吧?代碼其實也不複雜,拋磚引玉一下:

 
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2.  
  3. <html xmlns="http://www.w3.org/1999/xhtml" > 
  4. <head> 
  5. <title>圓形進度條</title> 
  6. <meta http-equiv="Content-Type" content="text/html; charset=gb2312"/> 
  7. <script src="jquery-1.4.2.js"></script> 
  8. <script src="raphael-min.js"></script> 
  9. <style> 
  10. #txt{ 
  11.     width:74px; 
  12.     height:74px; 
  13.     line-height:74px; 
  14.     position:absolute; 
  15.     margin-top:-74px; 
  16.     text-align:center; 
  17.     color:#9e9fa3; 
  18.     font-size:18px; 
  19.     font-family:Arial; 
  20. </style> 
  21. <script> 
  22.  
  23. var demo = { 
  24.      
  25.     paper: null, 
  26.  
  27.     init: function(){ 
  28.         //初始化Raphael畫布 
  29.         this.paper = Raphael("bg", 74, 74); 
  30.  
  31.         //把底圖先畫上去 
  32.         this.paper.image("progressBg.png", 0, 0, 74, 74); 
  33.  
  34.         //進度比例,0到1,在本例中我們畫65% 
  35.         //需要注意,下面的演算法不支援畫100%,要按99.99%來畫 
  36.         var percent = 0.65, 
  37.             drawPercent = percent >= 1 ? 0.9999 : percent; 
  38.  
  39.         //開始計算各點的位置,見後圖 
  40.         //r1是內圓半徑,r2是外圓半徑 
  41.         var r1 = 26, r2 = 31, PI = Math.PI, 
  42.             p1 = { 
  43.                 x:37,  
  44.                 y:69 
  45.             }, 
  46.             p4 = { 
  47.                 x:p1.x, 
  48.                 y:p1.y - r2 + r1 
  49.             }, 
  50.             p2 = {  
  51.                 x:p1.x + r2 * Math.sin(2 * PI * (1 - drawPercent)), 
  52.                 y:p1.y - r2 + r2 * Math.cos(2 * PI * (1 - drawPercent)) 
  53.             }, 
  54.             p3 = { 
  55.                 x:p4.x + r1 * Math.sin(2 * PI * (1 - drawPercent)), 
  56.                 y:p4.y - r1 + r1 * Math.cos(2 * PI * (1 - drawPercent)) 
  57.             }, 
  58.             path = [ 
  59.                 'M', p1.x, ' ', p1.y, 
  60.                 'A', r2, ' ', r2, ' 0 ', percent > 0.5 ? 1 : 0, ' 1 ', p2.x, ' ', p2.y, 
  61.                 'L', p3.x, ' ', p3.y, 
  62.                 'A', r1, ' ', r1, ' 0 ', percent > 0.5 ? 1 : 0, ' 0 ', p4.x, ' ', p4.y, 
  63.                 'Z' 
  64.             ].join(''); 
  65.  
  66.         //用path方法畫圖形,由兩段圓弧和兩條直線組成,畫弧線的演算法見後 
  67.         this.paper.path(path) 
  68.             //填滿漸層色,從#3f0b3f到#ff66ff 
  69.             .attr({"stroke-width":0.5, "stroke":"#c32ec3", "fill":"90-#3f0b3f-#ff66ff"}); 
  70.  
  71.         //顯示進度文字 
  72.         $("#txt").text(Math.round(percent * 100) + "%"); 
  73.     } 
  74.  
  75. }; 
  76.  
  77. $(function(){ 
  78.     demo.init(); 
  79. }); 
  80. </script> 
  81. </head> 
  82. <body> 
  83.  
  84. <!-- 承載圖形主體 --> 
  85. <div id="bg"></div> 
  86. <!-- 承載進度文字 --> 
  87. <div id="txt"></div> 
  88.  
  89. </body> 
  90. </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的文法):

 
  1. M37 69
  2. A31 31 0 1 1 62.079526825623375 19.778657178933337
  3. L58.03444185374863 22.7175834403957
  4. A26 26 0 1 0 37 64

看起來有點嚇人,其實分成幾部分來看就簡單了:

 ◆ 第一行表示移動到(37, 69)這個點作為起點,也就是p1;
 ◆ 第二行表示畫一段圓弧,就是p1到p2之間的這一段;
 ◆ 第三行表示畫一條直線,就是p2到p3之間的這一段;
 ◆ 第四行表示畫一段圓板,已經p3到p4之間的這一段;
 ◆ 第五行表示封閉圖形,相當於從p4連回p1;

這其中比較複雜的是圓弧的參數,其參數是這樣的:

 
  1. 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

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.