vue 使用canvas仿芝麻分信用表
如图所示:

画布组件:dashboard.vue
<template>
<div>
<canvas ref="canvas" v-if="change" id="canvas" width="600" height="400" style="width: 300px;height: 200px;"></canvas>
</div>
</template> <script>
export default {
data() {
return {
change: true,
text:['信用极差','信用较差','信用良好','信用极好']
};
},
props: ['score'],
methods: {
canvasScore(id, getScore) {
const vm = this;
if(this.common.basics.isNull(getScore)){
getScore = 999
}
let fillText=vm.text[Math.floor(getScore/250)];
if(this.common.basics.isNull(fillText)){
fillText = vm.text[3];
} new init(this.$refs.canvas, {
teamNum: 20,
radius: 10 / 2,
fullMarks:1000,
grade:getScore,
color:'#44AAC9',
fillColor:'#ffffff',
function:function(ctx,options){
ctx.font = '500 72px microsoft yahei';
ctx.textAlign = 'center';
ctx.fillStyle = '#ffffff';
ctx.fillText(options.grade, options.circle_x, options.circle_y-20);
ctx.font = '500 40px microsoft yahei';
ctx.textAlign = 'center';
ctx.fillStyle = '#ffffff';
ctx.fillText(fillText, options.circle_x, options.circle_y+45);
}
}) }
},
mounted() {
this.canvasScore('canvas', this.score);
},
watch: {
'score'() {
this.change = false;
this.$nextTick(() => {
this.change = true;
this.$nextTick(() => {
this.canvasScore('canvas', this.score);
});
});
}
}
}; /**
* @desc:canvas绘画芝麻分仪表盘
* @param:canvas canvas自身
* @param:options options配置
* @param:options-width canvas宽度
* @param:options-height canvas高度
* @param:options-teamNum 小圆的个数
* @param:options-radius 小圆的直径
* @param:options-designChartWidth //设计图宽度 默认750
* @param:options-fillColor //小圆达到指标后的填充颜色
* @param:options-color //小圆的默认颜色
* @param:options-fontSzie //字体大小
* @param:options-fontColor //字体颜色
* @param:options-fullMarks//总分数
* @param:options-grade//目标分数
* @param:options-function//其他操作 函数 接受ctx-canvas 2d options-配置
*/
function init(canvas, options) {
if (!options) {
options = {};
}
var cxt = canvas.getContext('2d');
var clientWidth = document.documentElement.clientWidth;//根据设计图中的canvas画布的占比进行设置
options.width = 371;//canvas的宽
options.height = 270;//canvas的高
var canvasWidth = Math.floor(clientWidth * options.width / (options.designChartWidth ? options.designChartWidth : 750));
var canvasHeight = Math.floor(clientWidth * options.height / (options.designChartWidth ? options.designChartWidth : 750));
canvas.setAttribute('width', canvasWidth*this.getDevicePixelRatio());
canvas.setAttribute('height', canvasHeight*this.getDevicePixelRatio());
canvas.style.width = canvasWidth+'px';
canvas.style.height = canvasHeight+'px';
options.radius = options.radius || 50 / 10;//小圆的直径
options.radius = options.radius*this.getDevicePixelRatio()
options.team_num = options.teamNum || 10;//小圆的个数
options.circle_r = canvas.getAttribute('width') / 2 - options.radius; // 半径
options.circle_x = 0 + options.circle_r + options.radius; // 圆心坐标x
options.circle_y = 0 + options.circle_r + options.radius;//圆心坐标y
this.loadTeams(cxt, options);
}
init.prototype = {
loadTeams(cxt, options) {//加载布局模拟图
this.font(cxt, options);
this.seating(cxt, options);
},
font(cxt, options) {//加载图中文案
if(options.function){
options.function(cxt, options);
}
},
seating(cxt, options) { //分配小圆座次
var angle = 230 / options.teamNum; //角度
var a = options.fullMarks/options.teamNum;//计算每个小圆代表的值
var team_x = 0, team_y = 0;
var team_r = options.radius; // options.team_num < 20 ? 10 : Math.sqrt(options.circle_r * options.circle_r * 2 * (1 - Math.cos(changeRadian(angle)))) / 2;
//余弦定理 计算小圆的最大半径 BC2=AB2+AC2-2×AB×AC×cosα 如果小圆数目小于20个,半径最大30(上限)
for (var i = 0; i < options.teamNum; i++) {
team_x = options.circle_x + Math.sin(this.changeRadian((i * angle) + 250.9)) * options.circle_r; //角度转弧度
team_y = options.circle_y - Math.cos(this.changeRadian((i * angle) + 250.9)) * options.circle_r;
cxt.beginPath();
cxt.arc(team_x, team_y, team_r, 0, 2 * Math.PI);
if((i+1)*a<=options.grade)cxt.fillStyle = options.fillColor ? options.fillColor : 'red';
else cxt.fillStyle = options.color ? options.color : '#333333';
cxt.fill();
}
},
changeRadian(angle) { //角度转换为弧度
return Math.PI / 180 * angle;
},
getDevicePixelRatio (){//避免手机端失帧
return window.devicePixelRatio || 1;
}
}
</script> <style scoped> </style>
父组件引用画布组件
<dashboard class="sizeQuery" :score="this.scoreVal"></dashboard>
scoreVal为分数值,从后台获取可得,从而传给画布组件。 此文为原创,不可转发。
vue 使用canvas仿芝麻分信用表的更多相关文章
- canvas仿芝麻信用分仪表盘
这是一个仿支付宝芝麻信用分的一个canvas,其实就是一个动画仪表盘. 首先, 上原图: 这个是在下支付宝上的截图,分低各位见笑了.然后看下我用canvas实现的效果图: <canvas id= ...
- 使用Vue.js制作仿Metronic高级表格(一)静态设计
Metronic高级表格是Metonic框架中自行实现的表格,其底层是Datatables.本教程将主要使用Vue实现交互部分,使用Bootstrap做样式库.jQuery做部分用户交互(弹窗). 使 ...
- Canvas 仿百度贴吧客户端 loading 小球
前言 几天前在简书上看到在一篇文章<Android仿百度贴吧客户端Loading小球>,看了一下作者,他写了两个好玩的 demo,效果图如下: 今天趁着周末有空,用 H5 的 Canvas ...
- vue + element 动态渲染、移除表单并添加验证
博客地址:https://ainyi.com/66 又接到新需求了吧~~ 背景 在一个大表单里,有可能会出现这种需求,用户可以自己操作动态添加.移除表单,更加个性化的效果. 常见于填写个人信息.附加内 ...
- java-js知识库之一——canvas绘制9*9乘法表
不知不觉一年又要过去了,软件这一行入坑快两年了,一直不知道这两年干了些啥,也不知道自己到底会些什么,工作也是些简单的东西,谁都能做,对未来也是很茫然.今天和同事优化数据库,头都是懵的,很多东西都感觉似 ...
- vue同一页面中拥有两个表单时,验证问题
问题:如果vue的同一个页面拥有两个表单.验证第一个表单时没有通过就切换到第二个,那么第二个表单会出现验证错误的信息 我们可以通过为两个表单添加ref属性 之后在通过调用resetFields()方法 ...
- 一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据
Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件.根据数据的不同存储方式,将Hive表分为外部表.内部表.分区表和分桶表四种数据模型.每种数据模型各有 ...
- hive中的分桶表
桶表也是一种用于优化查询而设计的表类型.创建通表时,指定桶的个数.分桶的依据字段,hive就可以自动将数据分桶存储.查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率 ------创 ...
- hive 分区表和分桶表
1.创建分区表 hive> create table weather_list(year int,data int) partitioned by (createtime string,area ...
随机推荐
- Freeswitch 各版本一键安装脚本 Freeswitch 快速安装 G729编解码库
最近有时间整理,写了freeswitch的一键安装包分享一下,里面带有 mysql=0 是否选择安装mysql. 其他提示:脚本里面集成了安装g729脚本,支持录音.转码的bcg729脚本. 1.下载 ...
- python之路-----前端之css
本篇内容 CSS 语法 css的四种引入方式 css选择器 css属性操作 Caution! 后台管理布局 css响应式布局 一.CSS语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声 ...
- spoj mpoint
题解: 判断每一次加进来的时候有几个被破坏,几个添加 然后单调栈维护 代码: #include<bits/stdc++.h> using namespace std; ; ,now,oo= ...
- 二、linux的安装
1. 虚拟机安装: 1.1. 什么是虚拟机 虚拟机:一台虚拟的电脑. 虚拟机软件: * VmWare :收费的. * VirtualBox :免费的. 1.2. 安装VmWare 参考<虚拟软件 ...
- matplotlib图表组成元素
一.函数 1.plot() -- 展示变量的趋势与变化 用法: plt.plot(x,y,ls="-",lw=2,label="plot figure" ...
- 执行git命令时出现fatal: 'origin' does not appear to be a git repository错误
在执行git pull origin master时出现: fatal: 'origin' does not appear to be a git repository fatal: Could no ...
- 机器学习 xgboost 笔记
一.数据预处理.特征工程 类别变量 labelencoder就够了,使用onehotencoder反而会降低性能.其他处理方式还有均值编码(对于存在大量分类的特征,通过监督学习,生成数值变量).转换处 ...
- 固定div的位置——不随窗口大小改变为改变位置
百度首页示例: 我给二维码,和下面文本固定位置 这时html代码 <div id="bar_code"> <div class="img_put&quo ...
- Windows下PyMC安装
先安装Anaconda2 然后conda install -c https://conda.binstar.org/pymc pymc
- Vue语法学习第二课——指令
指令,是指在Vue中,带有-v前缀的特殊特性 指令特性的值预期是单个JavaScript表达式(v-for例外) <p v-if="seen">看得到</p> ...