精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HTML5 進階系列:canvas 動態圖表

開發 開發工具
canvas 強大的功能讓它成為了 HTML5 中非常重要的部分,至于它是什么,這里就不需要我多作介紹了。而可視化圖表,則是 canvas 強大功能的表現之一。

[[195863]]

canvas 強大的功能讓它成為了 HTML5 中非常重要的部分,至于它是什么,這里就不需要我多作介紹了。而可視化圖表,則是 canvas 強大功能的表現之一。

現在已經有了很多成熟的圖表插件都是用 canvas 實現的,Chart.js、ECharts等可以制作出好看炫酷的圖表,而且幾乎覆蓋了所有圖表的實現。

有時候自己只想畫個柱狀圖,自己寫又覺得麻煩,用別人插件又感覺累贅,***打開百度,拷段代碼,粘貼上來修修改改。還不如自己擼一個呢。

效果

動畫效果圖片顯示不出來,可以到最下面找demo地址

分析

可以這個圖表由 xy軸、數據條形和標題組成。

  • 軸線:可以使用 moveTo() & lineTo() 實現
  • 文字:可以使用 fillText() 實現
  • 長方形:可以使用 fillRect() 實現

這樣看來,似乎并沒有多難。

實現

定義畫布

  1. <canvas id="canvas" width="600" height="500"></canvas> 

canvas 標簽只是個容器,真正實現畫圖的還是 JavaScript。

畫坐標軸

坐標軸就是兩條橫線,也就是canvas里最基礎的知識。

  • 由 ctx.beginPath() 開始一條新的路徑
  • ctx.lineWidth=1 設置線條寬度
  • ctx.strokeStyle=’#000000’ 設置線條顏色
  • ctx.moveTo(x,y) 定義線條的起點
  • ctx.lineTo(x1,y1) 定義線條的終點
  • *** ctx.stroke() 把起點和終點連成一條線
  1. var canvas = document.getElementById('canvas'); 
  2. var ctx = canvas.getContext('2d'); 
  3. var width = canvas.width; 
  4. var height = canvas.height; 
  5. var padding = 50;       // 坐標軸到canvas邊框的邊距,留邊距寫文字 
  6. ctx.beginPath(); 
  7. ctx.lineWidth = 1; 
  8. // y軸線 
  9. ctx.moveTo(padding + 0.5, height - padding + 0.5); 
  10. ctx.lineTo(padding + 0.5, padding + 0.5); 
  11. ctx.stroke(); 
  12. // x軸線 
  13. ctx.moveTo(padding + 0.5, height - padding + 0.5); 
  14. ctx.lineTo(width - padding + 0.5, height - padding + 0.5); 
  15. ctx.stroke(); 

畫坐標點

y軸上多少坐標點由自己來定義,需要獲取到數據的***值來計算y軸上的坐標值。x軸的點則由傳入的數據長度決定,坐標值由傳入數據的 xAxis 屬性決定。

  • 坐標值就是文字,由 ctx.fillText(value, x, y) 填充文字,value 為文字值,x y 為值的坐標
  • ctx.textAlign=’center’ 設置文字居中對齊
  • ctx.fillStyle=’#000000’ 設置文字填充顏色
  1. var yNumber = 5;                                                // y軸的段數 
  2. var yLength = Math.floor((height - padding * 2) / yNumber);     // y軸每段的真實長度 
  3. var xLength = Math.floor((width - padding * 2) / data.length);  // x軸每段的真實長度 
  4. ctx.beginPath(); 
  5. ctx.textAlign = 'center'
  6. ctx.fillStyle = '#000000'
  7. ctx.strokeStyle = '#000000'
  8. // x軸刻度和值 
  9. for (var i = 0; i < data.length; i++) { 
  10.     var xAxis = data[i].xAxis; 
  11.     var xlen = xLength * (i + 1); 
  12.     ctx.moveTo(padding + xlen, height - padding); 
  13.     ctx.lineTo(padding + xlen, height - padding + 5); 
  14.     ctx.stroke();                                       // 畫軸線上的刻度 
  15.     ctx.fillText(xAxis, padding + xlen - xLength / 2, height - padding + 15);   // 填充文字 
  16. // y軸刻度和值 
  17. for (var i = 0; i < yNumber; i++) { 
  18.     var y = yFictitious * (i + 1); 
  19.     var ylen = yLength * (i + 1); 
  20.     ctx.moveTo(padding, height - padding - ylen); 
  21.     ctx.lineTo(padding - 5, height - padding - ylen); 
  22.     ctx.stroke(); 
  23.     ctx.fillText(y, padding - 10, height - padding - ylen + 5); 

柱狀動畫

接下來要把數據通過柱狀的高低顯示出來,這里有個動畫效果,柱狀會從0升到對應的值。在 canvas 上實現動畫我們可以使用 setInterval、setTimeout 和 requestAnimationFrame。

requestAnimationFrame 不需要自己設置定時時間,而是跟著瀏覽器的繪制走。這樣就不會掉幀,自然就流暢。

requestAnimationFrame 原本只支持IE10以上,不過可以通過兼容的寫法實現兼容到IE6都行。

  1. function looping() { 
  2.     looped = requestAnimationFrame(looping); 
  3.     if(current < 100){       
  4.     // current 用來計算當前柱狀的高度占最終高度的百分之幾,通過不斷循環實現柱狀上升的動畫 
  5.         current = (current + 3) > 100 ? 100 : (current + 3); 
  6.         drawAnimation(); 
  7.     }else
  8.         window.cancelAnimationFrame(looped); 
  9.         looped = null
  10.     } 
  11. function drawAnimation() { 
  12.     for(var i = 0; i < data.length; i++) { 
  13.         var x = Math.ceil(data[i].value * current / 100 * yRatio); 
  14.         var y = height - padding - x; 
  15.         ctx.fillRect(padding + xLength * (i + 0.25), y, xLength/2, x); 
  16.         // 保存每個柱狀的信息 
  17.         data[i].left = padding + xLength / 4 + xLength * i; 
  18.         data[i].top = y; 
  19.         data[i].right = padding + 3 * xLength / 4 + xLength * i; 
  20.         data[i].bottom = height - padding; 
  21.     } 
  22. looping(); 
  • 柱狀即是畫矩形,由 ctx.fillRect(x, y, width, height) 實現,x y 為矩形左上角的坐標,width height 為矩形的寬高,單位為像素
  • ctx.fillStyle=’#1E9FFF’ 設置填充顏色

到這里,一個最基本的柱狀圖就完成了。接下來,我們可以為他添加標題。

標題

要放置標題,就會發現我們一大早定義的 padding 內邊距確實有用,總不能把標題給覆蓋到柱狀圖上吧。但是標題有的是在頂部,有的在底部,那么就不能寫死了。定一個變量 position 來判斷位置去畫出來。這個簡單。

  1. // 標題 
  2. if(title){                      // 也不一定有標題 
  3.     ctx.textAlign = 'center'
  4.     ctx.fillStyle = '#000000';  // 顏色,也可以不用寫死,個性化嘛 
  5.     ctx.font = '16px Microsoft YaHei' 
  6.     if(titlePosition === 'bottom' && padding >= 40){ 
  7.         ctx.fillText(title,width/2,height-5) 
  8.     }else
  9.         ctx.fillText(title,width/2,padding/2) 
  10.     } 

監聽鼠標移動事件

我們看到,有些圖表,把鼠標移上去,當前的柱狀就變色了,移開之后又變回原來的顏色。這里就需要監聽 mouseover 事件,當鼠標的位置位于柱狀的面積內,觸發事件。

那我怎么知道在柱狀里啊,發現在 drawAnimation() 里會有每個柱狀的坐標,那我干脆把坐標給保存到 data 里。那么鼠標在柱狀里的條件應該是:

  • ev.offsetX > data[i].left
  • ev.offsetX < data[i].right
  • ev.offsetY > data[i].top
  • ev.offsetY < data[i].bottom
  1. canvas.addEventListener('mousemove',function(ev){ 
  2.     var ev = ev||window.event; 
  3.     for (var i=0;i<data.length;i++){ 
  4.     for (var i=0;i<data.length;i++){ 
  5.         if(ev.offsetX > data[i].left && 
  6.         ev.offsetX < data[i].right && 
  7.         ev.offsetY > data[i].top && 
  8.         ev.offsetY < data[i].bottom){ 
  9.             console.log('我在第'+i+'個柱狀里。'); 
  10.         } 
  11.     } 
  12. }) 

總結

為了更方便的使用,封裝成構造函數。通過

  1. var chart = new sBarChart('canvas',data,{ 
  2.     title: 'xxx公司年度盈利',   // 標題 
  3.     titleColor: '#000000',      // 標題顏色 
  4.     titlePosition: 'top',       // 標題位置 
  5.     bgColor: '#ffffff',         // 背景色 
  6.     fillColor: '#1E9FFF',       // 柱狀填充色 
  7.     axisColor: '#666666',       // 坐標軸顏色 
  8.     contentColor: '#a5f0f6'     // 內容橫線顏色 
  9. }); 

參數可配置,很簡單就生成一個個性化的柱狀圖。代碼地址:canvas-demo

***加上折線圖、餅圖、環形圖,完整封裝成sChart.js插件,插件地址:sChart.js

【本文為51CTO專欄作者“林鑫”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-04-18 20:49:03

Pyecharts圖表 組件

2012-02-24 15:28:36

ibmdw

2011-09-02 17:04:13

Sencha ToucHTML5圖表庫

2011-07-21 15:34:36

iPhone HTML5 Canvas

2012-08-30 10:18:09

HTML5CanvasHTML5實例

2015-10-08 08:48:44

HTML5canvas動畫

2012-05-09 12:18:14

HTML5Canvas

2016-01-20 10:11:56

華麗CanvasHTML5

2012-06-04 10:16:18

HTML5

2020-03-05 09:59:45

Excel辦公數據

2012-04-18 15:36:33

HTML5Canvas交互式

2012-09-24 13:49:13

HTML5CanvasJS

2012-06-12 09:53:14

HTML5

2013-01-24 10:26:04

HTML5HTML 5HTML5的未來

2013-03-06 16:14:16

UCHTML5游戲引擎

2015-07-14 09:50:28

PHPHTML5

2024-07-12 09:07:29

HTML5圖表應用

2011-05-13 17:36:05

HTML

2013-10-21 15:24:49

html5游戲

2012-05-09 09:41:58

HTML5
點贊
收藏

51CTO技術棧公眾號

精品高清久久| 久久久www成人免费精品| 久久99精品久久久久久青青91| 欧美在线观看视频免费| 久久免费手机视频| 日韩脚交footjobhdboots| 激情图片小说一区| 国产一区二区三区在线播放免费观看| 国产精品一色哟哟| 国产巨乳在线观看| 精品一区二区三区在线| 制服丝袜激情欧洲亚洲| 日本一区二区三区免费看| 日本少妇在线观看| 91成人噜噜噜在线播放| 亚洲欧美另类综合偷拍| 国产综合久久久久久| 欧美人妻一区二区三区| 久久人体大尺度| 91麻豆福利精品推荐| 91精品国产高清自在线看超| av天堂一区二区| 中文字幕伦理免费在线视频| 成人在线视频免费观看| 日本韩国欧美在线| 日韩中文一区二区三区| 亚洲精品成人在线视频| 国产精品日韩精品在线播放| 亚洲欧洲国产日本综合| 国产剧情久久久久久| 亚洲色图欧美色| 成人黄色毛片| 中文字幕一区二区三区av| 国产欧美精品日韩精品| 国产精品1234区| 日韩高清在线免费观看| 欧美性xxxxx极品娇小| 国产日韩欧美亚洲一区| 日本三级片在线观看| 99欧美视频| 欧美哺乳videos| 免费无码毛片一区二三区| 午夜av免费观看| 水野朝阳av一区二区三区| 最近2019中文字幕一页二页| 激情成人在线观看| av手机在线观看| 国产无人区一区二区三区| 成人免费大片黄在线播放| 青青操国产视频| 五月天亚洲一区| 亚洲精品一线二线三线| 国产午夜福利视频在线观看| 国产在线你懂得| 国产一本一道久久香蕉| 69**夜色精品国产69乱| 久久精品99久久久久久| 亚洲美女久久| 3d成人动漫网站| 亚洲激情在线看| 欧美调教sm| 天天综合色天天综合色h| 五月天婷亚洲天综合网鲁鲁鲁| 国产又粗又大又爽| 一区二区激情| 视频在线一区二区| 国产18无套直看片| 日韩理论电影院| 精品日韩欧美在线| 佐佐木明希电影| 欧美成人app| 亚洲一区二区三区免费视频| 涩涩日韩在线| 在线观看h片| 国产精品18久久久久久久久久久久| 欧美福利视频网站| 国产综合精品久久久久成人av| 国产99亚洲| 欧美一区二区三区免费| 久久久久久久少妇| 欧美激情成人动漫| 国产精品天干天干在线综合| 国产91一区二区三区| 成人免费一区二区三区| 在线综合亚洲| 日韩av电影在线播放| 国产真实乱偷精品视频| 99在线精品免费视频九九视| 热99精品只有里视频精品| 久久久综合久久久| 婷婷综合久久| 欧美激情亚洲一区| 午夜国产福利一区二区| 欧美一区二区麻豆红桃视频| 久久精品免费电影| 日本一本高清视频| 日韩二区三区四区| 国产成人黄色av| 免费看日韩毛片| 精品9999| 久久久久久久一| aaaaaa毛片| 国产精品亚洲第一区在线暖暖韩国| 国产精品香蕉国产| 亚洲精品一级片| 国产99精品视频| 91传媒在线免费观看| 夜夜狠狠擅视频| 日本成人超碰在线观看| 国产精品第10页| 中文字幕日韩免费| 国产精品羞羞答答xxdd| 欧美日韩亚洲免费| 免费毛片在线| 国产日韩欧美精品电影三级在线| 四虎影院一区二区| 成人影院www在线观看| 国产精品成人在线观看| 欧美不卡在线播放| 国产精品美女久久久久| 亚洲少妇激情视频| 国产农村妇女精品一区| 91久久在线| 26uuu另类亚洲欧美日本一| 国产性xxxx高清| 国精产品一区一区三区mba桃花 | 日本福利视频导航| 国产精品粉嫩| 日韩电影中文字幕一区| 色诱av手机版| 国产精品久久久久无码av| 日本精品久久电影| 日本激情一区二区| 久久精品网站免费观看| 日韩免费av一区二区三区| 成人影音在线| 色又黄又爽网站www久久| www日韩视频| 天堂综合网久久| 韩国一区二区电影| 这里只有久久精品视频| 日本vs亚洲vs韩国一区三区二区 | 亚洲精品成人精品456| 成人在线免费观看网址| 888av在线视频| 日韩美女一区二区三区在线观看| 国产成人综合亚洲91猫咪| 成人蜜桃视频| av网址在线| 91精品国产麻豆| 三级全黄做爰视频| 天天超碰亚洲| 国产精品视频区| av中文字幕免费| 国产精品国产三级国产传播| 国产婷婷一区二区三区久久| 国产成人免费高清| 亚洲AV无码成人精品一区| 999精品视频在线观看| 欧美精品一区在线观看| 久久精品免费av| 成人一级片网址| 日韩视频第一页| 18岁视频在线观看| 高清不卡一区| 美乳少妇欧美精品| 91久久国产综合久久91| 91麻豆swag| 在线视频日韩一区| av日韩在线播放| 日韩在线观看成人| 国产女人高潮的av毛片| 一区二区三区在线视频观看| av漫画在线观看| 国产视频一区免费看| 91麻豆国产语对白在线观看| 青青草视频免费在线观看| 亚洲精品日产精品乱码不卡| 亚洲av午夜精品一区二区三区| 极品中文字幕一区| 欧美日韩亚洲一区二区三区在线观看 | av磁力番号网| 日韩欧美一区二区三区在线观看 | 秋霞av鲁丝片一区二区| 欧美日韩人人澡狠狠躁视频| 亚洲欧美手机在线| 欧美视频免费| 亚洲字幕一区二区| 免费观看在线黄色网| 色域天天综合网| 中文字幕乱码av| 日韩高清欧美激情| 国产树林野战在线播放| 九九热hot精品视频在线播放| 欧美理论电影在线观看| 视频在线观看你懂的| 亚洲成人资源网| 亚洲区 欧美区| 亚洲有吗中文字幕| 成人欧美在线观看 | 日本成人激情视频| 成人看片免费| 亚洲新声在线观看| 欧美一级在线免费观看| 欧美日韩国产精品自在自线| a天堂中文字幕| 日韩和欧美的一区| 欧美国产视频一区| 日韩在线观看一区二区三区| 久久精品人人做人人爽| 天堂av2024| 精品国产91久久久久久| 国产一区二区三区视频播放| 99久久综合色| 免费在线a视频| 天天操综合520| caoporen国产精品| av资源在线播放| 精品国产自在精品国产浪潮| 欧美人体大胆444www| 精品欧美乱码久久久久久1区2区| 亚洲自拍偷拍另类| 色综合咪咪久久| 日本中文字幕免费观看| 一区二区三区在线免费播放| 中文字幕伦理片| 国产亚洲女人久久久久毛片| 久久人妻少妇嫩草av无码专区 | 91av俱乐部| 一区二区三区国产在线| 免费人成自慰网站| 欧美视频亚洲视频| 国产一区高清视频| 99a精品视频在线观看| 亚洲一区二区久久久久久久| 2019中文亚洲字幕| 国产在线98福利播放视频| 日韩免费小视频| 国产精品91久久久久久| 大胆人体一区| 日本精品在线视频| 免费福利视频一区二区三区| 欧美中文字幕视频在线观看| 黄色漫画在线免费看| 一夜七次郎国产精品亚洲| 国产女人18毛片18精品| 欧美久久久久久久久| 国产精久久久久久| 亚洲国产精品麻豆| 国产极品在线播放| 午夜久久久久久电影| 99久久99久久精品免费看小说.| 国产情人综合久久777777| 手机精品视频在线| 免播放器亚洲| 一二三四中文字幕| 欧美1区2区3区| 欧美一区二区三区在线免费观看| 日韩福利视频一区| 蜜桃麻豆91| 天堂va欧美ⅴa亚洲va一国产| 91在线观看免费观看| 日本亚州欧洲精品不卡| 国产另类自拍| 99re8精品视频在线观看| 91精品免费视频| 伊人久久影院| 麻豆精品蜜桃一区二区三区| 禁果av一区二区三区| 亚洲资源在线网| 偷拍一区二区| 性刺激综合网| 亚洲女同中文字幕| 800av在线免费观看| 国产精品婷婷| 五月婷婷丁香色| 噜噜噜躁狠狠躁狠狠精品视频| 黄色网络在线观看| 一区二区视频欧美| 18岁视频在线观看| 久草这里只有精品视频| 国产视频一区二区三区在线播放| 日本91福利区| 日本xxxx免费| 久久久久9999亚洲精品| 久久精品一区二区三区四区五区 | 色综合影院在线| 91黄色在线| 日本久久久a级免费| 欧美影院精品| 欧美日韩国产高清视频| 99久久婷婷这里只有精品| 日韩视频免费播放| 欧美日韩视频一区二区三区| 激情六月丁香婷婷| 国产在线一区观看| 免费看黄色aaaaaa 片| 成人高清av在线| 亚洲911精品成人18网站| 久久亚洲捆绑美女| 黄色a一级视频| 国产精品九色蝌蚪自拍| 黄色激情视频在线观看| 精品视频1区2区3区| 中文字幕第三页| 精品国产乱码久久久久久蜜臀| yourporn在线观看视频| 一区二区欧美久久| 女人天堂av在线播放| 国产精品第二页| 日韩中出av| 免费看欧美一级片| 国产一区在线不卡| 91社区视频在线观看| 欧美日韩精品在线观看| 国产叼嘿视频在线观看| 最近2019年好看中文字幕视频| 日本不卡网站| 国产亚洲情侣一区二区无| 亚洲成人精品| wwwwww欧美| 久久99热这里只有精品| 成人性生交大免费看| 中文一区二区在线观看| 日韩字幕在线观看| 日韩精品一区二区在线观看| 亚洲老妇色熟女老太| 日韩有码视频在线| 国产精品蜜月aⅴ在线| 91久久在线播放| 欧美3p视频| 日本一级黄视频| 国产乱人伦偷精品视频不卡| 日本免费网站视频| 欧美亚洲高清一区| 性猛交富婆╳xxx乱大交天津| 欧美精品一区二区三区在线播放| 免费a级人成a大片在线观看| 国产精品久久久久久久久久久久久| 久久免费视频66| 国产精品12345| 成人高清av在线| 国产欧美日韩另类| 亚洲黄在线观看| av在线电影观看| 日韩美女视频中文字幕| 蜜乳av综合| 黄色国产小视频| 国产亚洲女人久久久久毛片| 欧美性猛交xxxx乱大交hd| 7777精品伊人久久久大香线蕉最新版 | 久久国产一级片| 亚洲成人教育av| 九色视频在线观看免费播放 | 欧美一级片免费在线观看| 亚洲成人一区二区| 日日夜夜精品免费| 欧美亚洲视频在线看网址| 同性恋视频一区| 欧美成人免费高清视频| 日本一区二区成人| 国产精品无码AV| 欧美日韩成人在线视频| 国产精品天天看天天狠| 午夜欧美性电影| 久久精品国产色蜜蜜麻豆| 伦理片一区二区| 国产精品视频第一区| 日韩av免费网址| 精品视频—区二区三区免费| a在线免费观看| 成人资源视频网站免费| 香蕉成人久久| 精品熟妇无码av免费久久| 91精品久久久久久久99蜜桃 | 欧洲成人av| 国产精品美女999| 中国成人一区| 黄色a一级视频| 欧美二区乱c少妇| 黄色软件视频在线观看| 亚洲高清在线观看一区| 国产精品视频| 18啪啪污污免费网站| 日韩女优av电影| 88xx成人免费观看视频库| 最新不卡av| 美国毛片一区二区三区| 青青操国产视频| 亚洲天堂网在线观看| 日韩第一区第二区| 国产免费视频传媒| 亚洲精品一二三区| 免费福利在线视频| 91久久极品少妇xxxxⅹ软件 | 日韩中文欧美| 北岛玲一区二区| 亚洲福利一区二区三区| 国产精品免费观看| 国产精品高潮呻吟久久av无限|