纯JS+Vue实现一个仪表盘

这篇具有很好参考价值的文章主要介绍了纯JS+Vue实现一个仪表盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在使用canvas的时候发现数值变化,每次都要重新渲染,值都从0开始,这和我的需求冲突。

一、 纯JS+Vue

1. 先绘制基本的圆环背景,利用border-color和border-radius将正方形变成基本的圆环。

<div class="circle">
    <div class="Inner"></div>
</div>
.circle {
    position: relative;
    border-radius: 50%;
    border: 12px solid;
    border-color: green green transparent green;
    width: 480px;
    height: 484px;
    top: 4%;
    left: 12%;
}

纯JS+Vue实现一个仪表盘,Vue,javascript,vue.js,开发语言

利用border-radius,就可将正方形变成圆形

纯JS+Vue实现一个仪表盘,Vue,javascript,vue.js,开发语言


2. 背景绘制完成,下面就是每个刻度。

<div class="circle">
    <div class="Inner"></div>
    <div class="center"></div>
    <div class="pointer"></div>
</div>
.center{
    width: 20px;
    height: 20px;
    background-color: grey;
    border-radius: 50%;
    position: absolute;
    z-index: 35;
    top: calc(50% - 5px);
    left: calc(50% - 5px);
}
.pointer{
    width: 190px;
    height:10px;
    background-color: red;
    border-radius: 50%;
    position: absolute;
    z-index: 34;
    top: calc(50% - -2px);
    left: calc(50% - 6px); 
    transform-origin:5% 35%;
}
.number {
    color: #fff;
    display: block;
    padding-top: 16px;
    position: absolute;
    left: -6px;
}

一共100个值,每两个刻度就要有线,到10线的长度会更长一点。其实和画钟表一样,0的位置是坐标轴的225°,到100的位置,总共是180°+45°

mounted() {
	let circle = document.getElementsByClassName('Inner')[0];
	circle.style.setProperty('--width', Math.floor(227) + 'px');
	for (let i = 0; i <= 50; i++) {
	   const ul = document.createElement('ul');
	   const li = document.createElement('li');
	   li.style.transform = `rotate(${225 + i * 2 * 2.7}deg)`;
	   if (i % 5 === 0) {
	       li.style.height = '15px';
	       li.innerHTML = `<span class = 'number'>${i*2}</span>`
	   }
	   circle?.appendChild(ul);
	   ul.appendChild(li);
	}
}

纯JS+Vue实现一个仪表盘,Vue,javascript,vue.js,开发语言

3. 让指针根据数据变动,和刻度一样,每移动一个点要更改相应的刻度

<div class="circle">
	<div class="Inner"></div>
	<div class="center"></div>
	<div class="pointer"></div>
	<div class="num">{{dataValue}}%</div>
</div>

<script>
export default {
    data() {
        return {
            dataValue: 50,
            }
         }watch: {
        dataValue: {
            handler(newValue, oldVal) {
                this.dataValue = newValue;
                this.runGuage()
            },
        },
    },
    methods: {
    	runGuage() {
            let pointer = document.getElementsByClassName("pointer")[0];
            pointer.style.transform = `rotate(${137 + this.dataValue * 2.66}deg)`;
        },
    }mounted() {
        this.runGuage();
    }
}
</script>   

<style scoped>
.num{
    position: absolute;
    color: #fff;
    font-size: 70px;
    z-index: 32;
    top: 54%;
    left: 30%;
}	
</style>

纯JS+Vue实现一个仪表盘,Vue,javascript,vue.js,开发语言

二、 Canvas

静下心实现了canvas描绘的仪表盘,并且数据不会从0开始渲染。

1. 先来canvas的老三样

<canvas id="progress" width="600" height="600"></canvas>

<script>
	// 获取canvas元素和上下文
	var canvas = document.getElementById("progress");
	var ctx = canvas.getContext("2d");
</script>

2. 设置一些基本参数

<canvas id="progress" width="600" height="600"></canvas>

<script>
	// 获取canvas元素和上下文
	var canvas = document.getElementById("progress");
	var ctx = canvas.getContext("2d");

	// 圆环参数
	var x = canvas.width / 2;
	var y = canvas.height / 2;
	var radius = 176;
	var lineWidth = 10;
	var startAngle = (3 * Math.PI) / 4;  //相当于从钟表中的差不多7点开始
	var endAngle = -Math.PI / 4;         //相当于从钟表中的差不多5点结束
</script>

3. 绘制圆环及外面的进度条

// 绘制圆环进度条函数
function drawProgress(progress) {
	// 清除画布
	ctx.clearRect(0, 0, canvas.width, canvas.height);

	// 绘制背景圆环
	ctx.beginPath();
	ctx.arc(x, y, radius, startAngle, Math.PI / 4);
	ctx.lineWidth = lineWidth;
	ctx.strokeStyle = "#008000";
	ctx.stroke();

	// 绘制进度圆环
	endAngle = startAngle + ((3 * Math.PI / 2) * progress);
	ctx.beginPath();
	ctx.arc(x, y, radius, startAngle, endAngle);
	ctx.lineWidth = lineWidth;
	ctx.strokeStyle = "#ff0000";
	ctx.stroke();
}

drawProgress(0.2)

纯JS+Vue实现一个仪表盘,Vue,javascript,vue.js,开发语言

4. 绘制里面的刻度条

function drawTicks() {
	var numTicks = 50; // 刻度数量
	var tickLength = 8; // 刻度长度
	var tickColor = "#000000"; // 刻度颜色
	var tickWidth = 2; // 刻度宽度

	let startAngle = (3 * Math.PI) / 4;
	let endAngle = -(1.48 * Math.PI) / 2;

	var angleStep = -((endAngle - startAngle) / numTicks); // 每个刻度之间的角度差

	ctx.save(); 

	// 将原点移到圆心处
	ctx.translate(x, y);


	// 绘制刻度
	for (var i = 0; i <= numTicks; i++) {
		var angle = startAngle + (i * angleStep) + 0.01;
		if (i % 5 == 0) {
			tickWidth = 5;
		} else {
			tickWidth = 2;
		}
		ctx.beginPath();
		ctx.lineWidth = tickWidth;
		ctx.strokeStyle = tickColor;

		// 计算刻度起点和终点的坐标
		var startX = (radius - tickLength - 4) * Math.cos(angle);
		var startY = (radius - tickLength - 4) * Math.sin(angle);
		var endX = (radius - 4) * Math.cos(angle);
		var endY = (radius - 4) * Math.sin(angle);


		// 绘制刻度线段
		ctx.moveTo(startX, startY);
		ctx.lineTo(endX, endY);
		ctx.stroke();

		// 绘制时间文本
		var text = i % 5 == 0 ? (i * 2).toString() : '';
		var textX = (radius - tickLength - 20) * Math.cos(angle);
		var textY = (radius - tickLength - 20) * Math.sin(angle);
		ctx.font = "16px Arial";
		ctx.fillStyle = "#000000";
		ctx.textAlign = "center";
		ctx.textBaseline = "middle";
		ctx.fillText(text, textX, textY);
	}

	ctx.restore(); // 恢复之前的绘图状态
}

纯JS+Vue实现一个仪表盘,Vue,javascript,vue.js,开发语言

5. 绘制指针

这一段可以抽离出来一个方法,等有时间再改一下

let kedu = (((2.4) * 2) / 100);  //我的起始角度0的位置旋转角度是从-2.4到2.4
let rotate1 = (2.4 - (kedu * progress * 100));
if (progress < 0.5) {
	rotate1 = -rotate1;
} else {
	rotate1 = -rotate1;
}
ctx.save();
ctx.translate(x, y);
ctx.rotate(rotate1);
ctx.beginPath();
ctx.moveTo(x - (2 * radius) + 50, y - (2 * radius) + 60);
ctx.lineTo(x - (2 * radius) + 40, y - (2 * radius) + 46);
ctx.lineTo(x - (2 * radius) + 50, y - (2 * radius) - 70);
ctx.lineTo(x - (2 * radius) + 60, y - (2 * radius) + 46);
ctx.fillStyle = "#ff0000";
ctx.fill();
ctx.restore();

纯JS+Vue实现一个仪表盘,Vue,javascript,vue.js,开发语言

6. 绘制文本显示当前的值

function drawText(value){
	ctx.font = "40px Arial";
	ctx.fillStyle = "#000000";
	ctx.fillText((value*100).toFixed(2)+'%', x-60, y+42);
}

纯JS+Vue实现一个仪表盘,Vue,javascript,vue.js,开发语言
完成~文章来源地址https://www.toymoban.com/news/detail-627535.html

到了这里,关于纯JS+Vue实现一个仪表盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [译]使用Python和Dash 创建一个仪表盘(上)

    在数据科学和分析的领域,数据能力的释放不仅是通过提取见解的方式, 同时也要能通过有效的方式来传达见解.这就是数据可视化发挥见解的地方. 数据可视化是信息和数据的可视化呈现. 它使用可视化元素,如图表、图形、地图,使其更容易看懂原始数据中的模式、趋势及异常值

    2024年02月16日
    浏览(35)
  • ChatGPT实现仪表盘生成

    Grafana是开源社区最流行的数据可视化软件,一定程度上也和 superset 一起被视为 tableau 等商业 BI 的开源替代品,很多IT 团队、科研团队,都会使用 Grafana 来做数据监控、挖掘分析。Grafana社区也有很多贡献者,在 github 上分享自己针对不同场景制作的数据分析仪表盘效果和配置

    2024年02月02日
    浏览(29)
  • 微信小程序实现带刻度简易仪表盘

    实现如图样式的仪表盘,要求分数向下取整、进度精确展示。 1、首先画出环形进度条,通过大圆包小圆的方式实现:大圆(circle1)背景浅色,小圆(circle2)背景白色 2、在小圆内部画刻度,根据UI图确认一共有12个刻度,其中长短刻度交叉显示(如图), 定义一个长度为1

    2024年02月11日
    浏览(33)
  • 解决Module not found: Error: ‘element-plus/lib/theme-chalk/index.css‘,通过下载插件,使用的是vue ui项目仪表盘

    1.首先在package.json中查看vue版本和element-ui版本 2.找到element-ui官网https://element.eleme.cn/#/zh-CN/component/quickstart,点击element-ui 3.进入到element–ui组件下载的地址 4.下载插件 vue-cli-plugin-element git clone https://github.com/ElementUI/vue-cli-plugin-element.git 5.根据README 没有项目就创建项目 vue create

    2024年02月13日
    浏览(38)
  • 界面控件DevExpress WPF Gauge组件 - 轻松实现个性化商业仪表盘

    DevExpress WPF Gauge(仪表)控件包含了多种圆形仪表类型、水平和垂直线性仪表、分段和矩阵数字仪表以及状态指示器,同时还具有最终用户交互性的集成支持。 P.S :DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能

    2024年02月06日
    浏览(42)
  • 如何在CentOS7搭建DashDot服务器仪表盘并实现远程监控

    本篇文章我们将使用Docker在本地部署DashDot服务器仪表盘,并且结合cpolar内网穿透工具可以实现公网实时监测服务器系统、处理器、内存、存储、网络、显卡等,并且拥有API接口。 DashDot是一款简单、实用的开源现代服务器仪表盘,主要应用于小型 VPS 和私人服务器(比如说N

    2024年03月16日
    浏览(44)
  • echarts绘制仪表盘

     代码展示:

    2024年02月13日
    浏览(37)
  • 新版Grafana仪表盘

    一 Grafana 是什么         Grafana 是一个开源的指标量监测和可视化工具,常用于展示基础设施的时序数据和应用 程序运行分析。         官网指路: https://grafana.com/         与前文相关的两个概念:         1)数据源(Datasource):定义了将用方式来查询数据展

    2024年02月13日
    浏览(34)
  • Grafana增加仪表盘

    grafana 是一款采用Go语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。 Grafana下载地址:https://grafana.com/grafana/download Grafana仪表盘模板下载地址:https://grafana.com/grafa

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包