[分享]VML实现的饼图

以前收集的VML实现的饼图vml_pie.html,感谢提供该代码的前辈,现将代码分享,代码如下:

  1. <htmlxmlns:v="urn:schemas-microsoft-com:vml"xmlns:o="urn:schemas-microsoft-com:office:office">
  2. <head>
  3. <title></title>
  4. <metaname="GENERATOR"content="MicrosoftVisualStudio.NET7.1">
  5. <metaname="ProgId"content="VisualStudio.HTML">
  6. <metaname="Originator"content="MicrosoftVisualStudio.NET7.1">
  7. <STYLE>v/:*{BEHAVIOR:url(#default#VML)}
  8. o/:*{BEHAVIOR:url(#default#VML)}
  9. .shape{BEHAVIOR:url(#default#VML)}
  10. </STYLE>
  11. <scriptlanguage="javascript">
  12. functionAdd(){
  13. varshape=document.createElement("v:shape");
  14. shape.type="#tooltipshape";
  15. shape.style.width="150px";
  16. shape.style.height="150px";
  17. shape.coordsize="21600,21600";
  18. shape.fillcolor="infobackground";
  19. vartextbox=document.createElement("v:textbox");
  20. textbox.style.border="1pxsolidred";
  21. textbox.style.innerHTML="测试";
  22. shape.appendChild(textbox);
  23. document.body.appendChild(shape);
  24. }
  25. functionVMLPie(pContainer,pWidth,pHeight,pCaption){
  26. this.Container=pContainer;
  27. this.Width=pWidth||"400px";
  28. this.Height=pHeight||"250px";
  29. this.Caption=pCaption||"VMLChart";
  30. this.backgroundColor="";
  31. this.Shadow=false;
  32. this.BorderWidth=0;
  33. this.BorderColor=null;
  34. this.all=newArray();
  35. this.RandColor=function(){
  36. return"rgb("+parseInt(Math.random()*255)+","+parseInt(Math.random()*255)+","+parseInt(Math.random()*255)+")";
  37. }
  38. this.VMLObject=null;
  39. }
  40. VMLPie.prototype.Draw=function(){
  41. //画外框
  42. varo=document.createElement("v:group");
  43. o.style.width=this.Width;
  44. o.style.height=this.Height;
  45. o.coordsize="21600,21600";
  46. //添加一个背景层
  47. varvRect=document.createElement("v:rect");
  48. vRect.style.width="21600px"
  49. vRect.style.height="21600px"
  50. o.appendChild(vRect);
  51. varvCaption=document.createElement("v:textbox");
  52. vCaption.style.fontSize="24px";
  53. vCaption.style.height="24px"
  54. vCaption.style.fontWeight="bold";
  55. vCaption.innerHTML=this.Caption;
  56. vCaption.style.textAlign="center";
  57. vRect.appendChild(vCaption);
  58. //设置边框大小
  59. if(this.BorderWidth){
  60. vRect.strokeweight=this.BorderWidth;
  61. }
  62. //设置边框颜色
  63. if(this.BorderColor){
  64. vRect.strokecolor=this.BorderColor;
  65. }
  66. //设置背景颜色
  67. if(this.backgroundColor){
  68. vRect.fillcolor=this.backgroundColor;
  69. }
  70. //设置是否出现阴影
  71. if(this.Shadow){
  72. varvShadow=document.createElement("v:shadow");
  73. vShadow.on="t";
  74. vShadow.type="single";
  75. vShadow.color="graytext";
  76. vShadow.offset="4px,4px";
  77. vRect.appendChild(vShadow);
  78. }
  79. this.VMLObject=o;
  80. this.Container.appendChild(o);
  81. //开始画内部园
  82. varoOval=document.createElement("v:oval");
  83. oOval.style.width="15000px";
  84. oOval.style.height="14000px";
  85. oOval.style.top="4000px";
  86. oOval.style.left="1000px";
  87. oOval.fillcolor="#d5dbfb";
  88. //本来计划加入3D的效果,后来感觉确实不好控制,就懒得动手了
  89. //varo3D=document.createElement("o:extrusion");
  90. varformatStyle='<v:fillrotate="t"angle="-135"focus="100%"type="gradient"/>';
  91. //formatStyle+='<o:extrusionv:ext="view"color="#9cf"on="t"rotationangle="-15"';
  92. //formatStyle+='viewpoint="0,34.72222mm"viewpointorigin="0,.5"skewangle="105"';
  93. //formatStyle+='lightposition="0,50000"lightposition2="0,-50000"/>';
  94. formatStyle+='<o:extrusionv:ext="view"backdepth="1in"on="t"viewpoint="0,34.72222mm"viewpointorigin="0,.5"skewangle="90"lightposition="-50000"lightposition2="50000"type="perspective"/>';
  95. oOval.innerHTML=formatStyle;
  96. o.appendChild(oOval);
  97. this.CreatePie(o);
  98. }
  99. VMLPie.prototype.CreatePie=function(vGroup){
  100. varmX=Math.pow(2,16)*360;
  101. //这个参数是划图形的关键
  102. //AExywidthheightstartangleendangle
  103. //xy表示圆心位置
  104. //widthheight形状的大小
  105. //startangleendangle的计算方法如下
  106. //2^16*度数
  107. varvTotal=0;
  108. varstartAngle=0;
  109. varendAngle=0;
  110. varpieAngle=0;
  111. varprePieAngle=0;
  112. varobjRow=null;
  113. varobjCell=null;
  114. for(i=0;i<this.all.length;i++){
  115. vTotal+=this.all[i].Value;
  116. }
  117. varobjLegendRect=document.createElement("v:rect");
  118. varobjLegendTable=document.createElement("table");
  119. objLegendTable.cellPadding=0;
  120. objLegendTable.cellSpacing=3;
  121. objLegendTable.width="100%";
  122. with(objLegendRect){
  123. style.left="17000px";
  124. style.top="4000px";
  125. style.width="4000px";
  126. style.height="12000px";
  127. fillcolor="#e6e6e6";
  128. strokeweight="1px";
  129. }
  130. objRow=objLegendTable.insertRow();
  131. objCell=objRow.insertCell();
  132. objCell.colSpan="2";
  133. //objCell.style.border="1pxoutset";
  134. objCell.style.backgroundColor="black";
  135. objCell.style.padding="5px";
  136. objCell.style.color="window";
  137. objCell.style.font="caption";
  138. objCell.innerText="总数:"+vTotal;
  139. varvTextbox=document.createElement("v:textbox");
  140. vTextbox.appendChild(objLegendTable);
  141. objLegendRect.appendChild(vTextbox);
  142. varvShadow=document.createElement("v:shadow");
  143. vShadow.on="t";
  144. vShadow.type="single";
  145. vShadow.color="graytext";
  146. vShadow.offset="2px,2px";
  147. objLegendRect.appendChild(vShadow);
  148. vGroup.appendChild(objLegendRect);
  149. varstrAngle="";
  150. for(i=0;i<this.all.length;i++){//顺序的划出各个饼图
  151. varvPieEl=document.createElement("v:shape");
  152. varvPieId=document.uniqueID;
  153. vPieEl.style.width="15000px";
  154. vPieEl.style.height="14000px";
  155. vPieEl.style.top="4000px";
  156. vPieEl.style.left="1000px";
  157. vPieEl.coordsize="1500,1400";
  158. vPieEl.strokecolor="white";
  159. vPieEl.id=vPieId;
  160. pieAngle=this.all[i].Value/vTotal;
  161. startAngle+=prePieAngle;
  162. prePieAngle=pieAngle;
  163. endAngle=pieAngle;
  164. //strAngle+=this.all[i].Name+":"+this.all[i].Value+"Start:"+startAngle+"End:"+endAngle+"/n";
  165. vPieEl.path="M750700AE750700750700"+parseInt(mX*startAngle)+""+parseInt(mX*endAngle)+"xe";
  166. vPieEl.title=this.all[i].Name+"/n所占比例:"+endAngle*100+"%/n详细描述:"+this.all[i].TooltipText;
  167. //vPieEl.innerHTML='<v:fillrotate="t"angle="-135"focus="100%"type="gradient"/>';
  168. varobjFill=document.createElement("v:fill");
  169. objFill.rotate="t";
  170. objFill.focus="100%";
  171. objFill.type="gradient";
  172. objFill.angle=parseInt(360*(startAngle+endAngle/2));
  173. vPieEl.appendChild(objFill);
  174. varobjTextbox=document.createElement("v:textbox");
  175. objTextbox.border="1pxsolidblack";
  176. objTextbox.innerHTML=this.all[i].Name+":"+this.all[i].Value;
  177. //vPieEl.appendChild(objTextbox);
  178. varvColor=this.RandColor();
  179. vPieEl.fillcolor=vColor;//设置颜色
  180. //开始画图例
  181. objRow=objLegendTable.insertRow();
  182. objRow.style.height="16px";
  183. varobjColor=objRow.insertCell();//颜色标记
  184. objColor.style.backgroundColor=vColor;
  185. objColor.style.width="16px";
  186. objColor.PieElement=vPieId;
  187. objColor.attachEvent("onmouseover",LegendMouseOverEvent);
  188. objColor.attachEvent("onmouseout",LegendMouseOutEvent);
  189. //objColor.οnmοuseοver="LegendMouseOverEvent()";
  190. //objColor.οnmοuseοut="LegendMouseOutEvent()";
  191. objCell=objRow.insertCell();
  192. objCell.style.font="icon";
  193. objCell.style.padding="3px";
  194. objCell.innerText=this.all[i].Name+":"+this.all[i].Value;
  195. vGroup.appendChild(vPieEl);
  196. }
  197. }
  198. VMLPie.prototype.Refresh=function(){
  199. }
  200. VMLPie.prototype.Zoom=function(iValue){
  201. varvX=21600;
  202. varvY=21600;
  203. this.VMLObject.coordsize=parseInt(vX/iValue)+","+parseInt(vY/iValue);
  204. }
  205. VMLPie.prototype.AddData=function(sName,sValue,sTooltipText){
  206. varoData=newObject();
  207. oData.Name=sName;
  208. oData.Value=sValue;
  209. oData.TooltipText=sTooltipText;
  210. variCount=this.all.length;
  211. this.all[iCount]=oData;
  212. }
  213. VMLPie.prototype.Clear=function(){
  214. this.all.length=0;
  215. }
  216. functionLegendMouseOverEvent(){
  217. vareSrc=window.event.srcElement;
  218. eSrc.border="1pxsolidblack";
  219. }
  220. functionLegendMouseOutEvent(){
  221. vareSrc=window.event.srcElement;
  222. eSrc.border="";
  223. }
  224. varobjPie=null;
  225. //以下是函数调用
  226. functionDrawPie(){
  227. objPie=newVMLPie(document.body,"600px","450px","人口统计图");
  228. //objPie.BorderWidth=3;
  229. //objPie.BorderColor="blue";
  230. //objPie.Width="800px";
  231. //objPie.Height="600px";
  232. objPie.backgroundColor="#ffffff";
  233. objPie.Shadow=true;
  234. objPie.AddData("北京",10,"北京的人口");
  235. objPie.AddData("上海",52,"上海的固定人口");
  236. objPie.AddData("天津",30,"天津的外地人口");
  237. objPie.AddData("西安",58,"西安城市人口");
  238. objPie.AddData("武汉",30,"武汉的外地人口");
  239. objPie.AddData("重庆",58,"重庆城市人口");
  240. objPie.Draw();
  241. //alert(document.body.outerHTML);
  242. }
  243. </script>
  244. </head>
  245. <bodyοnlοad="DrawPie()">
  246. <v:shapetypeid="tooltipshape"coordsize="21600,21600"o:spt="106"path="ar0,7165,4345,13110,1950,7185,1080,12690at475,11732,4835,17650,1080,12690,2910,17640at2387,9757,10107,20300,2910,17640,8235,19545at7660,12382,14412,21597,8235,19545,14280,18330at12910,11080,18695,18947,14280,18330,18690,15045at14822,5862,21597,15082,18690,15045,20895,7665at15772,2592,21105,9865,20895,7665,19140,2715at14330,0,19187,6595,19140,2715,14910,1170at10992,0,15357,5945,14910,1170,11250,1665at6692,650,12025,7917,11250,1665,7005,2580at1912,1972,8665,11162,7005,2580,1950,7185xear0,7165,4345,13110,1080,12690,2340,13080nfear475,11732,4835,17650,2910,17640,3465,17445nfear7660,12382,14412,21597,7905,18675,8235,19545nfear7660,12382,14412,21597,14280,18330,14400,17370nfear12910,11080,18695,18947,18690,15045,17070,11475nfear15772,2592,21105,9865,20175,9015,20895,7665nfear14330,0,19187,6595,19200,3345,19140,2715nfear14330,0,19187,6595,14910,1170,14550,1980nfear10992,0,15357,5945,11250,1665,11040,2340nfear1912,1972,8665,11162,7650,3270,7005,2580nfear1912,1972,8665,11162,1950,7185,2070,7890nfem@23@37qx@35@24@23@36@34@24@23@37xem@16@33qx@31@17@16@32@30@17@16@33xem@38@29qx@27@39@38@28@26@39@38@29xe"
  247. adj="1350,25920">
  248. <v:formulas>
  249. <v:feqn="sum#0010800"></v:f>
  250. <v:feqn="sum#1010800"></v:f>
  251. <v:feqn="cosatan210800@0@1"></v:f>
  252. <v:feqn="sinatan210800@0@1"></v:f>
  253. <v:feqn="sum@2108000"></v:f>
  254. <v:feqn="sum@3108000"></v:f>
  255. <v:feqn="sum@40#0"></v:f>
  256. <v:feqn="sum@50#1"></v:f>
  257. <v:feqn="mod@6@70"></v:f>
  258. <v:feqn="prod600111"></v:f>
  259. <v:feqn="sum@80@9"></v:f>
  260. <v:feqn="prod@1013"></v:f>
  261. <v:feqn="prod60031"></v:f>
  262. <v:feqn="sum@11@120"></v:f>
  263. <v:feqn="prod@13@6@8"></v:f>
  264. <v:feqn="prod@13@7@8"></v:f>
  265. <v:feqn="sum@14#00"></v:f>
  266. <v:feqn="sum@15#10"></v:f>
  267. <v:feqn="prod60081"></v:f>
  268. <v:feqn="prod@1121"></v:f>
  269. <v:feqn="sum@18@190"></v:f>
  270. <v:feqn="prod@20@6@8"></v:f>
  271. <v:feqn="prod@20@7@8"></v:f>
  272. <v:feqn="sum@21#00"></v:f>
  273. <v:feqn="sum@22#10"></v:f>
  274. <v:feqn="prod60021"></v:f>
  275. <v:feqn="sum#06000"></v:f>
  276. <v:feqn="sum#00600"></v:f>
  277. <v:feqn="sum#16000"></v:f>
  278. <v:feqn="sum#10600"></v:f>
  279. <v:feqn="sum@16@250"></v:f>
  280. <v:feqn="sum@160@25"></v:f>
  281. <v:feqn="sum@17@250"></v:f>
  282. <v:feqn="sum@170@25"></v:f>
  283. <v:feqn="sum@23@120"></v:f>
  284. <v:feqn="sum@230@12"></v:f>
  285. <v:feqn="sum@24@120"></v:f>
  286. <v:feqn="sum@240@12"></v:f>
  287. <v:feqn="sum#000"></v:f>
  288. <v:feqn="sum#100"></v:f>
  289. </v:formulas>
  290. <v:patho:connectlocs="67,10800;10800,21577;21582,10800;10800,1235;@38,@39"o:extrusionok="f"
  291. o:connecttype="custom"textboxrect="2977,3262,17087,17337"></v:path>
  292. <v:handles>
  293. <v:hposition="#0,#1"></v:h>
  294. </v:handles>
  295. <o:complexv:ext="view"></o:complex>
  296. </v:shapetype>
  297. <selectid="zoom"οnchange="objPie.Zoom(this.value)">
  298. <optionvalue="0.2"selected=true>20%</option>
  299. <optionvalue="0.25">25%</option>
  300. <optionvalue="0.4">40%</option>
  301. <optionvalue="0.5">50%</option>
  302. <optionvalue="0.75">75%</option>
  303. <optionvalue="0.8">80%</option>
  304. <optionvalue="1">原始大小</option>
  305. <optionvalue="1.25">125%</option>
  306. <optionvalue="1.5">150%</option>
  307. <optionvalue="2">200%</option>
  308. <optionvalue="3">300%</option>
  309. <optionvalue="4">400%</option>
  310. </select>
  311. </body>
  312. </html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值