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

首頁 > 開發 > HTML5 > 正文

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

2024-09-05 07:19:25
字體:
來源:轉載
供稿:網友

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

先來看效果圖

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

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

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

1.先用canvas畫實心圓

//偽代碼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>

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久久国产91| 精品亚洲aⅴ在线观看| 日韩欧美在线第一页| 国产成人黄色av| 曰本色欧美视频在线| 亚洲人高潮女人毛茸茸| 中文在线资源观看视频网站免费不卡| 精品欧美aⅴ在线网站| 最新国产精品亚洲| 亚洲国产精彩中文乱码av| 国产精品麻豆va在线播放| 亚洲人成欧美中文字幕| 国产啪精品视频网站| 亚洲成色777777在线观看影院| 欧美日韩精品在线| 国产91精品网站| 欧美老女人在线视频| 欧洲成人午夜免费大片| 欧美另类极品videosbest最新版本| 久久视频精品在线| 中文字幕在线视频日韩| 91极品视频在线| 欧美一级淫片aaaaaaa视频| 中文字幕视频一区二区在线有码| 国产精品自在线| 亚洲人在线观看| 91精品久久久久久久久不口人| 国产视频久久久久| 精品福利免费观看| 亚洲国产成人久久综合一区| 亚洲日韩中文字幕| 中文字幕在线精品| 亚洲男人天堂古典| 色综合色综合久久综合频道88| 伊人激情综合网| 国产美女高潮久久白浆| 美女少妇精品视频| www.欧美视频| 亚洲人成在线播放| 日韩国产一区三区| 中文欧美日本在线资源| 亚洲精品国产精品自产a区红杏吧| 精品国内产的精品视频在线观看| 亚洲深夜福利视频| 欧美尤物巨大精品爽| 国产午夜精品免费一区二区三区| 色偷偷9999www| 国产精品毛片a∨一区二区三区|国| 欧美精品xxx| 亚洲аv电影天堂网| 97高清免费视频| 国产精品久久久久久久久久免费| 亚洲美女激情视频| 亚洲精品电影久久久| 国产亚洲a∨片在线观看| 少妇av一区二区三区| 日韩欧美中文在线| 国产精品久久久久久久电影| 2020国产精品视频| 亚洲性视频网站| 亚洲va欧美va国产综合剧情| 91精品国产九九九久久久亚洲| 国产性色av一区二区| 亚洲精品美女视频| 国产精品国产自产拍高清av水多| 日本精品一区二区三区在线播放视频| 久久成人av网站| 欧美老肥婆性猛交视频| 成人欧美在线视频| 欧美电影《睫毛膏》| 国产又爽又黄的激情精品视频| 国产精品成人一区二区三区吃奶| 日韩精品亚洲元码| 国产日韩欧美在线看| 欧美最近摘花xxxx摘花| 日本午夜精品理论片a级appf发布| 国产最新精品视频| 亚洲精品aⅴ中文字幕乱码| 欧美香蕉大胸在线视频观看| 成人情趣片在线观看免费| 色婷婷综合久久久久中文字幕1| 欧美激情视频在线观看| 久久亚洲精品成人| 欧美黑人性视频| 中文字幕av一区二区三区谷原希美| 亚洲美女性生活视频| 成人写真福利网| 久久久精品久久久| 精品久久香蕉国产线看观看亚洲| 在线观看91久久久久久| 亚洲永久在线观看| 一区二区三区美女xx视频| 亚洲伊人一本大道中文字幕| 久久免费精品视频| 奇门遁甲1982国语版免费观看高清| 久久人体大胆视频| 国产精品第2页| 日韩成人在线网站| 伊人伊成久久人综合网站| 国产精品一区二区电影| 国产亚洲成精品久久| 久久夜色精品亚洲噜噜国产mv| 国产精品久久久久影院日本| 97视频在线观看视频免费视频| 久久精品国产2020观看福利| 亚洲人线精品午夜| 国产剧情久久久久久| 亚洲国产小视频| www.欧美免费| 欧美精品精品精品精品免费| 亚洲欧美日韩国产中文专区| 精品亚洲永久免费精品| 日韩网站免费观看| 中文字幕精品一区久久久久| 国产精品美腿一区在线看| 亚洲一区二区三区777| 欧美日韩亚洲精品内裤| 国产精品亚洲一区二区三区| 日韩av在线免费观看一区| 久久久久成人精品| 亚洲欧美三级伦理| 伊人久久五月天| 亚洲www永久成人夜色| 国产亚洲成av人片在线观看桃| 亚洲人成网站777色婷婷| 欧美老女人bb| 欧美亚洲免费电影| 欧美极品欧美精品欧美视频| 欧美日韩在线免费观看| 在线色欧美三级视频| 狠狠色狠狠色综合日日五| 成人中文字幕在线观看| 亚洲国产另类久久精品| 欧美中文字幕在线播放| 亚洲影视中文字幕| 欧美在线欧美在线| 国产一区二区日韩| 一区二区亚洲精品国产| 亚洲自拍偷拍视频| 久久精品视频中文字幕| 人人爽久久涩噜噜噜网站| 欧美韩国理论所午夜片917电影| 久久国产精品网站| 亚洲bt欧美bt日本bt| 久久精品91久久久久久再现| 色综合老司机第九色激情| 97视频免费看| 久久久国产精彩视频美女艺术照福利| 久久国产天堂福利天堂| 色yeye香蕉凹凸一区二区av| 久久久久久久久久亚洲| 亚洲精品91美女久久久久久久| 久久久精品国产亚洲| 亚洲免费人成在线视频观看| 久久中文字幕在线视频| 亚洲va码欧洲m码| 日韩欧美一区二区三区久久| 成人性生交大片免费观看嘿嘿视频| 国产亚洲精品91在线| 成人综合国产精品| 成人久久一区二区| 日韩精品视频在线观看免费| 久久久久久伊人| 欧美亚洲视频在线看网址|