JavaScript+Canvas實(shí)現(xiàn)簡(jiǎn)單的柱狀圖
筆者之所以想要深入了解 Canvas
,是因?yàn)樽罱鼛状蔚膶?shí)習(xí)部門都屬于 Data
這個(gè)門類下面,所以用echarts
之類的圖標(biāo)庫(kù)會(huì)很多很多,那么當(dāng)然要好好學(xué)一下其間的底層原理了。
那么讓我們好好聊聊,如何實(shí)現(xiàn)一個(gè)柱狀圖
如何實(shí)現(xiàn)一個(gè)柱狀圖
Step1
首先創(chuàng)建一個(gè)叫做barchart.html
的新文件,并且在其中寫入如下代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <canvas width="500" height="500" id="canvas"></canvas> </body> <script> var data = [16, 68, 20, 30, 54]; </script> </html>
Tips 我們知道canvas
可以使用fillRect
來實(shí)現(xiàn)一個(gè)矩形。
fillRect(x, y, xWidth, yHeight)
fillRect有四個(gè)參數(shù),分別是x的坐標(biāo),y的坐標(biāo),寬度與高度。
Step2
我們創(chuàng)建文件包含了 canvas
和 script
元素,對(duì)canvas
來說,我們標(biāo)注了他的寬高,它類似于DOM
中的DIV
元素,我們可以為其添加樣式和移動(dòng)位置。
data
變量呢則是一系列的數(shù)據(jù)集,我們將用這些變量來畫柱狀圖。
接下來我們將獲取canvas
元素,并且繪制一個(gè)底層色(灰色)
//get a reference to the canvas var canvas = document.getElementById('canvas'); //get a reference to the drawing context var c = canvas.getContext('2d'); //draw c.fillStyle = "gray"; c.fillRect(0,0,500,500);
Step3
在我們的基本條件都具備了之后,我們可以添加數(shù)據(jù)了,這里采用一個(gè)循環(huán)來添加。
//draw data c.fillStyle = "blue"; for(var i=0; i<data.length; i++) { var dp = data[i]; c.fillRect(25 + i*100, 30, 50, dp*5); }
效果如下:
但是這里有一個(gè)問題,我們的柱狀圖,反了!怎么讓他正起來呢?
Step4
我們知道,fillRect
的前兩個(gè)參數(shù)是我們的起點(diǎn)x和y的坐標(biāo),那么為了實(shí)現(xiàn)“正”的效果,我們可以移動(dòng)起點(diǎn)的位置。
//draw data c.fillStyle = "blue"; for(var i=0; i<data.length; i++) { var dp = data[i]; c.fillRect(25 + i*100, 500-dp*5 - 30 , 50, dp*5); }
效果如下:
是不是看起來很舒服啦?
但是現(xiàn)在還有一個(gè)問題,我們的坐標(biāo)軸去哪了???
Step5
現(xiàn)在,讓我們一起來畫一個(gè)坐標(biāo)軸
首先需要畫x
軸和y
軸
//draw axis lines c.fillStyle = "black"; c.lineWidth = 2.0; c.beginPath(); c.moveTo(30,10); c.lineTo(30,460); c.lineTo(490,460); c.stroke();
然后我們要新增y
軸標(biāo)記點(diǎn)和文本
//draw text and vertical lines c.fillStyle = "black"; for(var i=0; i<6; i++) { c.fillText((5-i)*20 + "",4, i*80+60); c.beginPath(); c.moveTo(25,i*80+60); c.lineTo(30,i*80+60); c.stroke(); }
最后新增x
軸文本
var labels = ["JAN","FEB","MAR","APR","MAY"]; //draw horiz text for(var i=0; i<5; i++) { c.fillText(labels[i], 50+ i*100, 475); }
效果如下:
看起來有部分問題,讓我們?cè)賮碜鲆恍┱{(diào)整!
Step6
將背景色改成白色 & 把起點(diǎn)做一下變更。
//draw background c.fillStyle = "white"; c.fillRect(0,0,500,500); //draw data c.fillStyle = "blue"; for(var i=0; i<data.length; i++) { var dp = data[i]; c.fillRect(40 + i*100, 460-dp*5 , 50, dp*5); }
噔噔噔噔,我們的柱狀圖就這樣寫好啦~
到此這篇關(guān)于JavaScript+Canvas實(shí)現(xiàn)簡(jiǎn)單的柱狀圖的文章就介紹到這了,更多相關(guān)JavaScript Canvas柱狀圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js for循環(huán),為什么一定要加var定義i變量
我知道,有些人(譬如之前的我)寫js的for循環(huán)時(shí),都不習(xí)慣加上var,這當(dāng)然是語法允許的。2010-06-06js實(shí)現(xiàn)按鈕開關(guān)單機(jī)下拉菜單效果
這篇文章主要介紹了js實(shí)現(xiàn)按鈕開關(guān)單機(jī)下拉菜單效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11uniapp實(shí)現(xiàn)滾動(dòng)觸底加載項(xiàng)目實(shí)戰(zhàn)
這篇文章主要為大家介紹了uniapp實(shí)現(xiàn)滾動(dòng)觸底加載項(xiàng)目實(shí)戰(zhàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09HTML+CSS+JavaScript實(shí)現(xiàn)放大鏡效果
這篇文章主要為大家詳細(xì)介紹了HTML+CSS+JavaScript實(shí)現(xiàn)放大鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07js 計(jì)算圖片內(nèi)點(diǎn)個(gè)數(shù)的示例代碼
這篇文章主要介紹了js 計(jì)算圖片內(nèi)點(diǎn)個(gè)數(shù)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Clipboard.js 無需Flash的JavaScript復(fù)制粘貼庫(kù)
這篇文章主要介紹了JavaScript 內(nèi)容復(fù)制(無需flash) Clipboard.js使用方法,需要的朋友可以參考下2015-10-10webpack dll打包重復(fù)問題優(yōu)化的解決
在使用dll plugin過程中出現(xiàn)的一個(gè)包依賴問題,這個(gè)問題導(dǎo)致打出來的包會(huì)包含重復(fù)的代碼。這篇文章主要介紹了webpack dll打包重復(fù)問題優(yōu)化的解決,感興趣的小伙伴們可以參考一下2018-10-10