HTML5 rotate 做仪表盘
我们的项目中有关于数据仓库和挖掘,用户要求UI的界面需要仪表盘,我网上找了下,没有发现免费的HTML仪表盘,饼图啥图表的确很多,那就没有办法了,我和同事自己做了一个仪表盘,结果如下。
之后我们就来讨论下这个简单的仪表盘是怎么做的。我们先大致有一个想法,设定一个宽高2:1的canvas,仪表盘的半径就是canvas的高度,仪表盘需要的数据有上面分几个区域(一般是低中高三个区域,为了测试我们准备了四个区域),刻度线和文字,指针,和指针指向的值。
首先第一步自然是canvas的声明
- <body>
- <div>
- <canvas id="board" width="800" height="600">
- </canvas>
- </div>
- </body>
- </html>
- //仪表盘面板
- var panel = function(id, option) {
- this.canvas = document.getElementById(id); //获取canvas元素
- this.cvs = this.canvas.getContext("2d"); //得到绘制上下文
- this.width = this.canvas.width; //对象宽度
- this.height = this.canvas.height; //对象高度
- this.level = option.level;
- this.outsideStyle = option.outsideStyle;
- }
- var panelOption = {
- maxLength: 30,
- interval: 5,
- level: [//仪表盘需要呈现的数据隔离区域
- {start: 0, color: "red" },
- { start: 30, color: "yellow" },
- { start: 40, color: "blue" },
- { start: 100, color: "Lime" }
- ],
- outsideStyle: { lineWidth: 4, color: "rgba(100,100,100,1)" }
- };
- panel.prototype.save = function(fn) {
- this.cvs.save();
- fn();
- this.cvs.restore();
- }
我们定义个用于画半圆的方法,这个方法中,我们将需要画半圆时做的translate放到save函数中,这样画半圆的变形操作不会对其他操作有影响。
- panel.prototype.drawArc = function() {
- var p = this;
- var cvs = this.cvs;
- p.save(function() {
- cvs.translate(p.width / 2, p.height); //将坐标点移到矩形的底部的中间
- cvs.beginPath();
- cvs.lineWidth = p.outsideStyle.lineWidth;
- cvs.strokeStyle = p.outsideStyle.color;
- cvs.arc(0, 0, p.height - cvs.lineWidth, 0, Math.PI / 180 * 180, true); //画半圆
- cvs.stroke();
- });
- }
- panel.prototype.drawLevelArea = function(level) {
- var p = this;
- var cvs = this.cvs;
- for (var i = 0; i < level.length; i++) {
- p.save(function() {
- cvs.translate(p.width / 2, p.height);
- cvs.rotate(Math.PI / 180 * level[i].start);
- p.save(function() {
- cvs.beginPath();
- cvs.arc(0, 0, p.height - p.outsideStyle.lineWidth, Math.PI / 180 * 180, Math.PI / 180 * 360);
- cvs.fillStyle = level[i].color;
- cvs.fill();
- });
- });
- }
- }
相关推荐
wusiye 2020-10-23
表格的现在还是较为常用的一种标签,但不是用来布局,常见处理、显示表格式数据。在HTML网页中,要想创建表格,就需要使用表格相关的标签。<table> <tr> <td>单元格内的文字</td> ...
gufudhn 2020-08-09
nercon 2020-08-01
swiftwwj 2020-07-21
nercon 2020-07-16
饮马天涯 2020-07-05
Lophole 2020-06-28
gufudhn 2020-06-12
csstpeixun 2020-06-11
huzijia 2020-06-09
WebVincent 2020-06-06
行吟阁 2020-05-30
qsdnet我想学编程 2020-05-26
gufudhn 2020-05-25
qsdnet我想学编程 2020-05-19
suixinsuoyu 2020-05-15
HSdiana 2020-05-15
PioneerFan 2020-05-15