精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美日韩在线免费| 盗摄精品av一区二区三区| 国产午夜精品久久久| 别急慢慢来1978如如2| yjizz视频网站在线播放| 国产一区二区三区在线观看免费 | 亚洲精品国产精| 国产日韩欧美三区| 日韩最新av在线| 挪威xxxx性hd极品| 成人免费毛片嘿嘿连载视频…| 亚洲人亚洲人成电影网站色| 国产亚洲一区二区三区在线播放| 国产熟妇一区二区三区四区| 亚洲国产一成人久久精品| 日韩av网址在线观看| 中文字幕久久av| 国内精彩免费自拍视频在线观看网址 | 丰满人妻一区二区三区四区| 狠狠做六月爱婷婷综合aⅴ| 欧美高清精品3d| 黄色片网址在线观看| 99se视频在线观看| 97久久精品人人爽人人爽蜜臀| 国产精品亚洲欧美导航| 日本网站在线播放| 图片区亚洲欧美小说区| 日韩精品视频在线观看网址| 激情文学亚洲色图| 欧美成人精品一区二区男人小说| 亚洲精品大片www| 日韩三级在线播放| 亚洲欧美综合在线观看| 国产一区二区不卡| 国产精品视频久久久| 国产精品成人国产乱| 国产精品成久久久久| 亚洲女人初尝黑人巨大| 性高潮免费视频| 一区二区三区无毛| 在线观看日韩精品| 春日野结衣av| av在线视屏| 一区二区三区国产| 97超碰免费观看| 精品乱码一区二区三四区视频 | 97久久视频| 国产一区二区三区视频| 成年人网站免费在线观看| 国产劲爆久久| 精品国产一区二区三区忘忧草| 天天操狠狠操夜夜操| 日本一区免费网站| 欧美最猛黑人xxxxx猛交| 自慰无码一区二区三区| 97在线超碰| 亚洲午夜一区二区| 99er在线视频| 日韩三级免费| 亚洲综合一二区| 欧美黄色免费网址| 日本动漫理论片在线观看网站| 亚洲日本在线看| 天天成人综合网| h片在线播放| 亚洲精品写真福利| 屁屁影院ccyy国产第一页| 婷婷色在线播放| 亚洲中国最大av网站| 免费网站永久免费观看| av伦理在线| 午夜精品国产更新| 国产精品亚洲a| 成人在线视频播放| 欧美日韩美少妇| 想看黄色一级片| 51精品国产| 亚洲国产成人精品久久| 双性尿奴穿贞c带憋尿| 免费看成人吃奶视频在线| 中文字幕精品www乱入免费视频| 中文字幕第69页| 欧美成人tv| 国内外成人免费激情在线视频| 日产精品久久久久| 老司机精品久久| 国产精品久久久久久久久久ktv| 在线观看国产小视频| 国产精品一区免费视频| 国产在线精品二区| 98在线视频| 一区二区免费在线| 女人另类性混交zo| 国产免费av国片精品草莓男男| 精品日本一线二线三线不卡| 欧美老熟妇乱大交xxxxx| 91偷拍一区二区三区精品| 欧美黑人极品猛少妇色xxxxx| 黄色免费av网站| 久88久久88久久久| 久久国产一区二区| 欧美一级二级三级区| 亚洲成人免费视频| 国产福利影院在线观看| 国产高清日韩| 精品中文字幕久久久久久| 成人性生交大片免费看无遮挡aⅴ| 一区二区国产在线| 青青草99啪国产免费| 国产情侣av在线| 91丨porny丨最新| av动漫免费观看| 日本电影欧美片| 精品国产乱码久久久久久夜甘婷婷 | 国产精品自拍av| 欧美人xxxxx| 肉体视频在线| 欧美日韩国产不卡| 人妻精品久久久久中文字幕| 亚洲综合婷婷| 国产欧美精品xxxx另类| 三区在线观看| 亚洲综合在线五月| www激情五月| 精品久久美女| 欧美一区二区三区图| 午夜免费福利视频| 亚洲丝袜美腿综合| 中文字幕欧美人妻精品一区| 麻豆一区一区三区四区| 欧美另类精品xxxx孕妇| 一级久久久久久久| 亚洲国产成人在线| 黄色片久久久久| 91成人午夜| 欧美精品一区二区三区国产精品 | 亚洲激情婷婷| 91九色视频在线观看| 欧美成人三区| 欧美无乱码久久久免费午夜一区| 成年人网站免费看| 欧美三级在线| 99在线视频播放| 91cn在线观看| 欧美一区二区精品久久911| 自拍偷拍第9页| 免费观看成人av| 亚洲高清资源综合久久精品| 欧美日韩成人影院| 一区二区日韩精品| 国产精品成人久久久| 欧美极品xxx| 五月天激情视频在线观看| 国产一区二区三区四区大秀| 日本精品视频在线播放| 黄色小视频在线免费观看| 日韩欧美在线视频免费观看| 亚洲av无码成人精品国产| 国产精品久久久一区二区| 国外成人在线视频网站| 手机在线理论片| 亚洲欧美国产精品va在线观看| 一级片视频在线观看| 久久五月婷婷丁香社区| 天天干在线影院| 91综合久久| 亚洲aⅴ男人的天堂在线观看| 成人影欧美片| 亚洲成人精品av| 婷婷激情五月网| 久久精品免视看| 日本中文字幕二区| 欧美精品色网| 久久精品一区二区三区不卡免费视频| 中文不卡1区2区3区| 国产亚洲美女久久| 国产精品玖玖玖| 亚洲成人自拍偷拍| 波多野结衣a v在线| 美女一区二区三区在线观看| 国产高潮呻吟久久久| 6080成人| 国产v综合v亚洲欧美久久| 求av网址在线观看| 亚洲加勒比久久88色综合| aaa在线视频| 亚洲女人的天堂| 国产精久久久久| 老牛影视一区二区三区| 成人手机在线播放| 亚洲人成网亚洲欧洲无码| 国产精品中文字幕久久久| 午夜小视频福利在线观看| 亚洲精品在线91| 国产精品一区二区黑人巨大 | 国产成人综合亚洲91猫咪| 成人中文字幕在线播放| 日韩精品1区| 国产精品区一区二区三在线播放| 欧美激情喷水| 蜜臀久久99精品久久久久久宅男| 三级av在线| 91精品国产麻豆| 亚洲GV成人无码久久精品| 亚洲日本丝袜连裤袜办公室| 欧美精品黑人猛交高潮| 国产精品自拍一区| 国产嫩草在线观看| 中文亚洲字幕| 欧美日韩中文字幕在线播放| 亚洲丁香日韩| 成人91免费视频| 久久久精品一区二区毛片免费看| 韩国日本不卡在线| 国产午夜精品久久久久免费视| 国产视频久久网| 日韩一级中文字幕| 欧美一级日韩不卡播放免费| 五月天激情国产综合婷婷婷| 亚洲精品综合在线| 国产小视频你懂的| 久久久精品欧美丰满| 美女黄色一级视频| 国产在线不卡一区| 中文字幕网av| 日韩激情视频网站| 国产亚洲综合视频| 极品av少妇一区二区| 性做爰过程免费播放| 欧美一区2区| 久久偷窥视频| 麻豆成人入口| 国产一区二区高清不卡| 视频免费一区二区| 91九色视频在线| 先锋影音一区二区| 国产精品网站入口| 欧美日韩尤物久久| 国产成人一区二区三区小说| 午夜激情在线播放| 91国内揄拍国内精品对白| h片视频在线观看| 欧美国产日韩一区二区三区| 中文字幕中文字幕在线十八区| 神马久久桃色视频| 在线观看美女网站大全免费| 在线播放亚洲激情| 77777影视视频在线观看| 国产亚洲视频在线观看| h视频在线播放| 中文字幕av一区| av中文天堂在线| 在线成人一区二区| 亚洲视频tv| 久久精彩免费视频| 在线中文字幕视频观看| 久99九色视频在线观看| 久久免费电影| 91极品女神在线| 中文字幕一区久| 国产激情视频一区| av在线播放一区| 亚洲free性xxxx护士hd| 日韩精品一区二区三区免费视频| 99在线国产| 欧美三级电影在线| 日本一区二区精品视频| 欧美一区二区三| 丰满人妻一区二区三区53号| 亚洲手机视频| 日韩 欧美 高清| 精品在线一区二区三区| 麻豆传媒在线看| 99精品久久只有精品| 国产av自拍一区| 中文字幕亚洲精品在线观看| 欧美色图一区二区| 福利视频导航一区| 国产精品51麻豆cm传媒| 91精品国产全国免费观看| 欧美视频在线观看一区二区三区| 精品小视频在线| 免费日本一区二区三区视频| 欧美精品成人在线| 电影亚洲精品噜噜在线观看| 成人久久精品视频| 噜噜噜天天躁狠狠躁夜夜精品 | 日本美女一级视频| 亚洲少妇中文在线| av在线麻豆| 欧美在线性视频| 91丨精品丨国产| 精品一区2区三区| 婷婷综合亚洲| 日韩中文字幕三区| 国产中文字幕精品| 粉嫩av蜜桃av蜜臀av| 亚洲手机成人高清视频| 日韩欧美在线观看免费| 日韩一区二区视频在线观看| 欧洲亚洲在线| 色综合久久中文字幕综合网小说| 久久爱91午夜羞羞| 国产98在线|日韩| 日韩精品二区| 日韩精品视频久久| 国产不卡在线播放| 99久久99久久精品免费看小说.| 亚洲超碰精品一区二区| 国产精品一二三四五区| 亚洲女人天堂网| 91探花在线观看| 91色视频在线导航| 欧洲乱码伦视频免费| 欧美综合在线播放| 国产精品456露脸| 国产在视频线精品视频| 精品国产成人在线| 精品人妻aV中文字幕乱码色欲| 在线精品91av| 超碰一区二区| 国产精品久久九九| 欧美一区不卡| 中文av一区二区三区| 久久久亚洲精品一区二区三区 | 国户精品久久久久久久久久久不卡| 日本久久精品一区二区| 97精品国产97久久久久久久久久久久| 欧美国产日韩在线观看成人| 欧美日韩色一区| 国产综合视频一区二区三区免费| 午夜精品一区二区三区在线视 | 麻豆av一区二区三区| 欧美午夜不卡| 国产成人av免费观看| 综合久久一区二区三区| 中文字幕一区二区人妻| 亚洲人成电影网站色www| 中日韩脚交footjobhd| 蜜桃av噜噜一区二区三| 国产欧美大片| 午夜一区二区三区免费| 婷婷亚洲久悠悠色悠在线播放| www.热久久| 午夜精品理论片| 日本在线中文字幕一区| 欧美变态另类刺激| 成人app下载| 国产成人精品一区二三区| 亚洲高清福利视频| 看黄在线观看| 欧美亚洲丝袜| 免费观看30秒视频久久| 国产又粗又猛又爽又黄的视频小说| 欧美三级蜜桃2在线观看| 色视频在线免费观看| 成人午夜一级二级三级| 亚洲91视频| 国产精品二区视频| 亚洲成a人在线观看| 五月天婷婷激情网| 日本精品视频在线| 日韩欧美精品一区| 古装做爰无遮挡三级聊斋艳谭| 一区二区三区四区五区视频在线观看| www.久久精品.com| 国语自产精品视频在免费| 欧美精品密入口播放| 亚洲中文字幕久久精品无码喷水| 中文一区二区完整视频在线观看| 97人妻精品视频一区| 裸体女人亚洲精品一区| 亚洲专区**| 久久久免费视频网站| 欧美经典三级视频一区二区三区| 国产美女裸体无遮挡免费视频| 欧美激情视频一区二区| 要久久爱电视剧全集完整观看| 天堂社区在线视频| 亚洲欧美精品午睡沙发| 台湾av在线二三区观看| 国产欧美亚洲视频| 一区视频在线| 老熟妇一区二区| 日韩午夜中文字幕| 中文在线аv在线| 国产精品无码乱伦| 97精品国产露脸对白| 91女人18毛片水多国产| 久久久最新网址| 成人黄色av| 国产精品久久久久久亚洲av| 91久久精品一区二区二区| 亚洲第一图区| 欧美亚洲丝袜| 岛国精品在线观看| 国产影视一区二区| 欧美一级bbbbb性bbbb喷潮片| 99久久99热这里只有精品| 国产网站无遮挡|