亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

利用html5 canvas動態畫餅狀圖的示例代碼

2024-08-26 00:20:35
字體:
來源:轉載
供稿:網友

本文介紹了利用html5 canvas動態畫餅狀圖的示例代碼,分享給大家,具體如下:

先來看效果圖

canvas,畫餅狀圖,html5,餅狀圖

這里并沒引用jquery等第三方庫,只是用dom操作和canvas的特性編寫的。

canvas畫圓大體分為實心圓和空心圓。

根據需求分析知道該圓為實心圓。

1.先用canvas畫實心圓

canvas,畫餅狀圖,html5,餅狀圖

//偽代碼var canvas = document.createElement("canvas");var ctx = canvas.getContext('2d');ctx.beginPath();ctx.arc(圓心x軸坐標,圓心y軸坐標,半徑,開始角,結束角);ctx.fillStyle = 'green';ctx.closePath();ctx.fill();

2.根據不同顏色繪制餅狀圖

//偽代碼var canvas = document.createElement("canvas");var ctx = canvas.getContext('2d');ctx.beginPath();ctx.arc(圓心x軸坐標,圓心y軸坐標,半徑,綠色開始角,綠色結束角);ctx.fillStyle = 'green';ctx.closePath();ctx.fill();ctx.beginPath();ctx.arc(圓心x軸坐標,圓心y軸坐標,半徑,紅色開始角,紅色結束角);ctx.fillStyle = 'red';ctx.closePath();ctx.fill();ctx.beginPath();ctx.arc(圓心x軸坐標,圓心y軸坐標,半徑,黃色開始角,黃色結束角);ctx.fillStyle = 'yellow';ctx.closePath();ctx.fill();ctx.beginPath();ctx.arc(圓心x軸坐標,圓心y軸坐標,半徑,紫色開始角,紫色結束角);ctx.fillStyle = 'purple';ctx.closePath();ctx.fill();

3.動態繪制餅狀圖

動態繪制圓網上普遍推薦三種方法:requestAnimationFrame、setInterval(定時)、還有動態算角度的。

這里我用的是第一種requestAnimationFrame方式。

在編寫的過程中發現一個問題,就是動態畫圓時并不是以圓心的坐標畫的。為了解決這一問題,需要在每次畫圓時重新將canvas的畫筆的坐標定義為最初圓心的坐標。

<!DOCTYPE html><html><head>    <meta charset="utf-8">    <title></title>    <style>        #graph {/*            border: 1px solid black;            height: 100%;            width: 100%;            box-sizing: border-box;*/        }    </style></head><body><div id="circle" style="width: 500px;float: left;"></div></body></html><script type="text/javascript">(function(window,undefined){    var data = [        {"product":"產品1","sales":[192.44 ,210.54 ,220.84 ,230.11 ,220.85 ,210.59 ,205.49 ,200.55 ,195.71 ,187.46 ,180.66 ,170.90]},        {"product":"產品2","sales":[122.41 ,133.16 ,145.65 ,158.00 ,164.84 ,178.62 ,185.70 ,190.13 ,195.53 ,198.88 ,204.32 ,210.91]},        {"product":"產品3","sales":[170.30 ,175.00 ,170.79 ,165.10 ,165.62 ,160.92 ,155.92 ,145.77 ,145.17 ,140.27 ,135.99 ,130.33]},        {"product":"產品4","sales":[165.64 ,170.15 ,175.10 ,185.32 ,190.90 ,190.01 ,187.05 ,183.74 ,177.24 ,181.90 ,179.54 ,175.98]}    ]            var dom_circle = document.getElementById('circle');    if(dom_circle != undefined && dom_circle != null)    {        var canvas = document.createElement("canvas");        dom_circle.appendChild(canvas);        var ctx = canvas.getContext('2d');        var defaultStyle = function(Dom,canvas){            if(Dom.clientWidth <= 300)            {                canvas.width = 300;                Dom.style.overflowX = "auto";            }            else{                canvas.width = Dom.clientWidth;            }            if(Dom.clientHeight <= 300)            {                canvas.height = 300;                Dom.style.overflowY = "auto";            }            else            {                canvas.height = Dom.clientHeight;            }            //坐標軸區域            //注意,實際畫折線圖區域還要比這個略小一點            return {                p1:'green',                p2:'red',                p3:'yellow',                p4:'purple',                x: 0 ,    //坐標軸在canvas上的left坐標                y: 0 ,    //坐標軸在canvas上的top坐標                maxX: canvas.width ,   //坐標軸在canvas上的right坐標                maxY: canvas.height ,   //坐標軸在canvas上的bottom坐標                r:(canvas.width)/2,  //起點                ry:(canvas.height)/2,  //起點                cr: (canvas.width)/4, //半徑                startAngle:-(1/2*Math.PI),               //開始角度                endAngle:(-(1/2*Math.PI)+2*Math.PI),     //結束角度                xAngle:1*(Math.PI/180)                   //偏移量            };        }        //畫圓        var tmpAngle = -(1/2*Math.PI);        var ds = null;        var sum = data[0]['sales'][0]+data[0]['sales'][1]+data[0]['sales'][2]+data[0]['sales'][3]        var percent1 = data[0]['sales'][0]/sum * Math.PI * 2 ;        var percent2 = data[0]['sales'][1]/sum * Math.PI * 2 + percent1;        var percent3 = data[0]['sales'][2]/sum * Math.PI * 2 + percent2;        var percent4 = data[0]['sales'][3]/sum * Math.PI * 2 + percent3;        console.log(percent1);        console.log(percent2);        console.log(percent3);        console.log(percent4);        var tmpSum = 0;        var drawCircle = function(){                                    if(tmpAngle >= ds.endAngle)            {                return false;            }            else if(tmpAngle+ ds.xAngle > ds.endAngle)            {                tmpAngle = ds.endAngle;            }            else{                tmpAngle += ds.xAngle;                tmpSum += ds.xAngle            }            // console.log(ds.startAngle+'***'+tmpAngle);            // console.log(tmpSum);            // ctx.clearRect(ds.x,ds.y,canvas.width,canvas.height);                        if(tmpSum > percent1 && tmpSum <percent2)            {                ctx.beginPath();                ctx.moveTo(ds.r,ds.ry);                ctx.arc(ds.r,ds.ry,ds.cr,ds.startAngle+percent1,tmpAngle);                            ctx.fillStyle = ds.p2;            }            else if(tmpSum > percent2 && tmpSum <percent3)            {                ctx.beginPath();                ctx.moveTo(ds.r,ds.ry);                ctx.arc(ds.r,ds.ry,ds.cr,ds.startAngle+percent2,tmpAngle);                ctx.fillStyle = ds.p3;            }            else if(tmpSum > percent3 )            {                ctx.beginPath();                ctx.moveTo(ds.r,ds.ry);                ctx.arc(ds.r,ds.ry,ds.cr,ds.startAngle+percent3,tmpAngle);                ctx.fillStyle = ds.p4;            }            else{                ctx.beginPath();                ctx.moveTo(ds.r,ds.ry);                ctx.arc(ds.r,ds.ry,ds.cr,ds.startAngle,tmpAngle);                ctx.fillStyle = ds.p1;            }            ctx.closePath();            ctx.fill();            requestAnimationFrame(drawCircle);        }        this.toDraw = function(){            ds= defaultStyle(dom_circle,canvas);            // console.log(tmpAngle);            // console.log(ds.xAngle)            ctx.clearRect(ds.x,ds.y,canvas.width,canvas.height);            drawCircle();        }        this.toDraw();        var self = this;        window.onresize = function(){            self.toDraw()        }    }})(window);    </script>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线网址| 91老司机在线| 国产精品一区专区欧美日韩| 亚洲精选在线观看| 中文字幕欧美精品日韩中文字幕| 久久久精品电影| 91极品女神在线| 亚洲国产日韩精品在线| 91免费视频国产| 美日韩精品免费观看视频| 亚洲va欧美va国产综合久久| 久久精品亚洲精品| 最近中文字幕日韩精品| 欧美激情一区二区三区成人| 亚洲一区二区三区视频| 亚洲精品一区二区网址| 精品国产欧美一区二区五十路| 性夜试看影院91社区| 欧美xxxwww| 亚洲精品美女免费| 欧美激情欧美激情在线五月| 久久久久久久一区二区三区| 国产精品久久久久秋霞鲁丝| 精品久久香蕉国产线看观看亚洲| 日韩av在线一区二区| 亚洲国产精品电影| 欧美大秀在线观看| 日韩中文字幕网站| 久久久久久亚洲精品| 国产一区二区三区18| 国产v综合ⅴ日韩v欧美大片| 亚洲女在线观看| 九色91av视频| 国产成人97精品免费看片| 国产日韩欧美在线视频观看| 欧美成年人视频网站| 亚洲一区二区免费| 国产精品亚洲欧美导航| 欧美尤物巨大精品爽| 国产一区二区三区在线看| 亚洲视频在线免费观看| 亚洲自拍偷拍第一页| 欧美精品电影在线| 精品国产依人香蕉在线精品| 2019国产精品自在线拍国产不卡| 国产欧美日韩丝袜精品一区| 国产深夜精品福利| 91欧美激情另类亚洲| 国产精品久久久久高潮| 国产精品永久在线| 岛国av一区二区在线在线观看| 中国人与牲禽动交精品| www.亚洲一二| 国产精品视频999| 成人在线中文字幕| 国产成人精品久久久| 亚洲欧美在线x视频| 欧美乱大交xxxxx| 国产亚洲视频中文字幕视频| 久久香蕉国产线看观看网| 国产精品91视频| 亚洲人成在线电影| 精品无人区乱码1区2区3区在线| 亚洲人av在线影院| 国产亚洲欧洲黄色| 成人午夜激情网| 亚洲第一福利在线观看| 51精品国产黑色丝袜高跟鞋| 91精品久久久久| 久久全国免费视频| 色av吧综合网| 国产一区二区三区网站| 亚洲综合自拍一区| 日韩视频免费在线观看| 久热99视频在线观看| 国产色综合天天综合网| 国产精品影片在线观看| 成人黄色影片在线| 欧美一区三区三区高中清蜜桃| 久久久国产在线视频| 91在线|亚洲| 欧美精品激情视频| 欧美性猛交xxxx偷拍洗澡| 韩国一区二区电影| 国产欧美精品在线| 日韩电影中文字幕在线| 亚洲免费视频观看| 亚洲精品黄网在线观看| 亚洲国产成人久久综合一区| 久久精品成人一区二区三区| 在线视频一区二区| 狠狠久久亚洲欧美专区| 久久久国产在线视频| 欧美激情国产高清| 亚洲另类图片色| 尤物yw午夜国产精品视频明星| 亚洲另类图片色| 激情成人中文字幕| 国产精品久久二区| 精品福利一区二区| 97婷婷涩涩精品一区| 全球成人中文在线| 国产成人av在线| 亚洲成人免费网站| 亚洲亚裔videos黑人hd| 亚洲香蕉av在线一区二区三区| 国产精品入口日韩视频大尺度| 国内精品久久久久| 黑人巨大精品欧美一区二区| 激情成人中文字幕| 97久久精品人人澡人人爽缅北| 国产精品va在线播放我和闺蜜| 国产一区二区三区在线视频| 亚洲欧美激情四射在线日| 亚洲白虎美女被爆操| 欧美高清视频在线| 国产成人在线一区二区| 亚洲成年人在线| 韩国精品美女www爽爽爽视频| 欧美理论电影在线播放| 欧美性生活大片免费观看网址| 精品国产乱码久久久久久天美| 视频直播国产精品| 日韩欧美中文第一页| 午夜精品久久久久久久白皮肤| 日韩乱码在线视频| 亚洲男人的天堂网站| 午夜精品蜜臀一区二区三区免费| 国产精品久久久久久久久借妻| 国产精品69精品一区二区三区| 一本一道久久a久久精品逆3p| 日韩成人在线视频| 自拍亚洲一区欧美另类| 国产97在线观看| 中文字幕在线看视频国产欧美在线看完整| 欧美精品中文字幕一区| 视频在线观看一区二区| 亚洲色图综合久久| 欧美华人在线视频| 国产成人一区二区三区小说| 精品美女永久免费视频| 美女扒开尿口让男人操亚洲视频网站| 欧美日韩激情视频| 亚洲免费一在线| 中日韩美女免费视频网站在线观看| 日韩国产在线看| 69av视频在线播放| 国产精品久久久久久久久久久久久| 欧美激情成人在线视频| 国产亚洲日本欧美韩国| 国产精品夜间视频香蕉| 久久久精品中文字幕| 九九精品在线视频| 九九视频这里只有精品| 国产国产精品人在线视| 亚洲人成网站色ww在线| 成人免费xxxxx在线观看| 亚洲 日韩 国产第一| 97香蕉超级碰碰久久免费软件| 欧美猛交免费看| 国产69精品久久久| 亚洲福利视频在线| 欧美电影在线播放| 亚洲一区国产精品|