摘要:最終效果圖下面代碼只有一個難點怎么算橫軸縱軸坐標位置其余就容易多了,有一個注意問題,我其實寫復雜了各種位置都是動態算的,因為實際項目你用寫死的數值瀏覽器適配就會出問題。
上一篇文章我已經說過數據準備好畫圖就非常簡單了,如果你擔心不回話好辦,我給你個最簡單的小例子,
你先練練。
這個很簡單吧,什么面向對象什么的都不用,你就先用最粗暴的方式擼出來。
然后,你在看下面我寫的代碼就容易了。最終效果圖
下面代碼只有一個難點:
1.怎么算橫軸、縱軸label坐標位置
其余就容易多了,有一個注意問題,我其實寫復雜了各種位置都是動態算的,因為實際項目你用 寫死的數值瀏覽器適配就會出問題。不說了上代碼,先耐著性子敲一遍,然后在一點點研究。
/** 此處可以寫一些裝13的東西 盡可能用英文,不會可以自己百度, 例如: Author:leo lau desc:ni shishibushiwozuitengaideren ,ni weisha bushuo hua **/ "use strict"; //模仿 http://echarts.baidu.com/demo.html#bar-gradient window.onload = function(){ var data = [ {"label":"一月","value":getRandomInt(0,400)}, {"label":"二月","value":getRandomInt(1,400)}, {"label":"三月","value":getRandomInt(1,400)}, {"label":"四月","value":getRandomInt(0,400)}, {"label":"五月","value":getRandomInt(1,400)} ]; var targetId = "div1"; var cw = 600; var ch = 450; //為啥用面向對象方式,因為顯得拽唄 // function Bcharts(targetId,cw,ch,data){ //基礎信息 var c = this;//為啥這么做?我懶,c = chart = this; c.configureChart(targetId,cw,ch,data); c.init(); } Bcharts.prototype.configureChart = function(targetId,cw,ch,data){ var c = this; c.setCanvasParameters(targetId,cw,ch,data); c.setChartParameters(targetId,cw,ch,data); }; Bcharts.prototype.setCanvasParameters = function(targetId,cw,ch,data){ var c = this; c.id = targetId; c.cw = cw; c.ch = ch; c.data = data; }; Bcharts.prototype.setChartParameters = function(targetId,cw,ch,data){ var c = this; c.axeRadio = 10;//定義一個比例,為啥是10,看圖大體是這個隨便定的,別忒離譜就好 c.horGap = (c.cw*c.axeRadio)/100; c.verGap = (c.ch*c.axeRadio)/100; //標識準備 c.fontRadio = 3;//原因同上 c.horFontSize = (c.cw*c.fontRadio)/100; c.verFontSize = (c.ch*c.fontRadio)/100; }; //初始化 Bcharts.prototype.init = function(){ var c = this; c.createCanvas(); //這里只是把后臺給你的數據整理好了,并不是圖表直接能畫的數據 //比如最大值是234,其實我們要花240,不可能是不整齊的 c.handleData(); //所以需要處理數據 c.prepareData(); //開畫 c.draw(); }; Bcharts.prototype.createCanvas = function(){ var c = this; var canvas = document.createElement("canvas"); canvas.id = c.id + "-" + Math.random(); canvas.width = c.cw; canvas.height = c.ch; document.getElementById(c.id).innerHTML = ""; document.getElementById(c.id).appendChild(canvas); c.canvas = canvas; c.context = c.canvas.getContext("2d"); }; Bcharts.prototype.handleData = function(){ //因為后臺肯定給你標準的數組格式一堆,但是你沒法直接用,得自己666一把 var c = this; c.label = [];//這個數組放循環內容的名字,比如[一月,二月] c.values = [];//放值[200,45……] c.data.forEach(function(item){ c.label.push(item.label); c.values.push(item.value); }); }; Bcharts.prototype.prepareData = function(){ var c = this; c.itemNum = c.data.length; c.MaxValue = Math.max.apply(null,c.values); c.MinValue = Math.min.apply(null,c.values); //算坐標寬高 c.horAxiWidth = c.cw - 2*c.horGap; c.verAxiWidth = c.ch - 2*c.verGap; //計算最大上邊界,比如最大數是234,坐標得到240,而不是234 //確定橫豎格寬度 c.verBound = Math.ceil(c.MaxValue/10)*10; c.verFeq = c.verBound/c.itemNum; c.horFeq = c.horAxiWidth/c.itemNum; }; Bcharts.prototype.draw = function(){ var c = this; c.drawX();//x軸 c.drawY();//y軸 c.drawYLabel();//y坐標字兒 c.drawXLabel();//y坐標字兒 c.HorGuideLines(); c.verGuideLines(); c.drawBars(); }; Bcharts.prototype.drawX = function(){ var c = this; var gd = c.context; gd.beginPath(); gd.moveTo(c.horGap,c.ch -c.verGap); gd.lineTo(c.cw -c.horGap,c.ch -c.verGap); gd.lineWidth = 2; gd.stroke(); }; Bcharts.prototype.drawY = function(){ var c = this; var gd = c.context; gd.beginPath(); gd.moveTo(c.horGap,c.ch -c.verGap); gd.lineTo(c.horGap,c.verGap); gd.lineWidth = 2; gd.stroke(); }; Bcharts.prototype.drawYLabel = function(){ var c = this; var gd = c.context; for(var i = 0;i<=c.itemNum;i++){ var labelYText = c.verBound - i*c.verFeq; var labelPosX = c.horGap - c.horGap/c.axeRadio; var scaleReq = (c.verAxiWidth/c.verBound)*c.verFeq; var labelPosY = c.verGap+i*scaleReq; gd.textAlign = "right"; gd.fillText(labelYText,labelPosX,labelPosY); } Bcharts.prototype.drawXLabel = function(){ var c = this; var gd = c.context; for(var i = 0;iPS:里面很多基礎函數要會,其實畫canvas考驗的不是canvas技術,而是數學和基礎知識,一定要打好基礎。
整個代碼git地址:
https://github.com/leolau2012...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/90344.html
摘要:弄了一堆線方塊和函數,感覺挺玄乎,然并卵。我們直接寫個項目看看。一個比較拽的應用就是圖表和游戲,我們從淺入深,先玩圖表,圖表我們今天說一個最簡單柱狀圖。第三件事,數據我用的模擬,實際項目一般是后臺提供。 弄了一堆線方塊和函數,感覺挺玄乎,然并卵。我們直接寫個項目看看。 canvas一個比較拽的應用就是圖表和游戲,我們從淺入深,先玩圖表,圖表我們今天說一個最簡單柱狀圖。showImg(h...
摘要:我們提前做些準備工作,比如畫圖前先把坐標邊距做出來,還有各種字體大小算出來。最終代碼如下,模仿一月一月一月基礎信息為啥這么做我懶,定義一個比例為啥是,看圖大體是這個隨便定的,別忒離譜就好標識準備原因同上初始化偷個懶,基礎函數不寫了 我們提前做些準備工作,比如畫圖前先把坐標邊距做出來,還有各種字體大小算出來。 這里需要一點面向對象的知識, use strict; //模仿 http://...
閱讀 2351·2021-11-24 11:16
閱讀 2038·2021-09-30 09:47
閱讀 2006·2021-09-10 10:51
閱讀 1323·2019-08-30 14:08
閱讀 3141·2019-08-30 13:47
閱讀 1528·2019-08-30 13:02
閱讀 3233·2019-08-29 12:29
閱讀 3198·2019-08-26 17:05