可以动态改变刻度背景色的车速仪表盘

最近做的项目的主页面需要用到一个仪表盘来动态显示车速,同时改变对应的背景色

仪表盘

开始是想着使用echarts,修修改改拿来用,但是人家客户有规定,必须搞个差不多的,那没办法,自
己动手搞个吧
截图如下:
这是人家的
在这里插入图片描述
这是我搞出来的
在这里插入图片描述
这样看着似乎差不多了哈,客户没提啥意见,搞定
接下来是代码,考虑到代码的复用性,封装成了件,及引入的方法,因为要适配不同电脑的分辨率,所以使用了把px根据比例全部换成了rem,这里的1rem=80px,若是不想使用rem,可以把数值乘以80,然后把rem换成px就可以了

代码思路
首先是让UI小伙伴扣了两张图
yibiao5.png
在这里插入图片描述
yibiaoBoot.png
在这里插入图片描述
1.然后根据找好最外层的父级,根据定位把图片和文字的位置搞个差不多;
2.接着就是刻度了,可以看到刻度是有两层的,外面有一层,里面有一层,这些刻度我想着前端动态生成,然后给这些刻度设置一个默认背景色,然后我就可以通过style样式控制背景色,我看了原图上面的刻度是64个,然后底部有16个是不变色的,被遮罩住了,所以通过css3的旋转,改变下角度,然后只控制其余48个刻度即可,
3.因为最大的速度是200,所以根据200/48即可得出,1速度等于多少个刻度
封装仪表盘组件
代码如下

<template><div class="data-left-1"><div class="box_style"><div class="mybox_wrap"><div class="yibiao_style"><div class="clock_box"><div class="clock_dial"></div><div class="clock_dial2"></div></div><div class="yibiao_boot"></div><div class="yibiao_speed">{{ carSpeed }}</div><div class="yibiao_span">速度(km/h)</div><div class="yibiao_max">200</div></div></div></div></div>
</template>
<script>
export default {props: {isShow: {type: Boolean,default: true,},speed: {type: Number,default: 0,},rate: {default: 0,},},data() {return {carSpeed: 0, //列车速度showTabulation: true,}},computed: {},mounted() {let clock_dial = document.querySelector('.clock_dial')let clock_dial2 = document.querySelector('.clock_dial2')//1 制作表盘for (let i = 0; i < 64; i++) {var div = document.createElement('div')div.setAttribute('class', 'dial')div.innerHTML = '<span></span>'clock_dial.appendChild(div)}let dial = document.querySelectorAll('.dial')for (let i = 0; i < dial.length; i++) {dial[i].style.position = 'absolute'dial[i].style.width = '0.125rem'dial[i].style.height = '100%'dial[i].style.top = '0'dial[i].style.left = '0.625rem'}let dialSpan = document.querySelectorAll('.dial span')for (let i = 0; i < dialSpan.length; i++) {dialSpan[i].style.width = '0.05rem'dialSpan[i].style.height = '0.125rem'dialSpan[i].style.background = '#699B9A';dialSpan[i].style.backgroundImage = ''dialSpan[i].style.display = 'inline-block'dialSpan[i].style.verticalAlign = 'top'dialSpan[i].style.borderRadius = '0.0125rem'}for (let i = 0; i < 64; i++) {var div = document.createElement('div')div.setAttribute('class', 'dial2')div.innerHTML = '<span></span>'clock_dial2.appendChild(div)}let dial2 = document.querySelectorAll('.dial2')for (let i = 0; i < dial2.length; i++) {dial2[i].style.position = 'absolute'dial2[i].style.width = '0.125rem'dial2[i].style.height = '100%'dial2[i].style.top = '0'dial2[i].style.left = '0.5rem'}let dialSpan2 = document.querySelectorAll('.dial2 span')for (let i = 0; i < dialSpan2.length; i++) {dialSpan2[i].style.width = '0.0375rem'dialSpan2[i].style.height = '0.0625rem'dialSpan2[i].style.background = '#699B9A'dialSpan2[i].style.backgroundImage = ''dialSpan2[i].style.display = 'inline-block'dialSpan2[i].style.verticalAlign = 'top'dialSpan2[i].style.borderRadius = '0.0125rem'}for (let i = 0; i < dial.length; i++) {var angle = (360 / 64) * idial[i].style.transform = 'rotate(' + angle + 'deg)'dial2[i].style.transform = 'rotate(' + angle + 'deg)'}},methods: {},watch: {speed(val) {this.carSpeed = vallet basicParam = 200 / 48;let dialSpan = document.querySelectorAll('.dial span')let dialSpan2 = document.querySelectorAll('.dial2 span')let actNum = Math.ceil(this.carSpeed / basicParam);for(let m=0;m<48;m++){dialSpan[m].style.background = "#699B9A";dialSpan2[m].style.background = "#699B9A";}if (this.carSpeed > 0&&this.carSpeed <100) {for (let i = 0; i < actNum; i++) {dialSpan[i].style.background = "#43EDEA"dialSpan2[i].style.background = "#43EDEA"}}else{for (let i = 0; i < 24; i++) {dialSpan[i].style.backgroundImage = "linear-gradient(to right,#43EDEA,#359EC7)"dialSpan2[i].style.backgroundImage = "linear-gradient(to right,#43EDEA,#359EC7)"}for (let j = 24; j< actNum; j++) {dialSpan[j].style.backgroundImage = "linear-gradient(to right,#359EC7,#3B87F3)"dialSpan2[j].style.backgroundImage = "linear-gradient(to right,#359EC7,#3B87F3)"}}},isShow(val) {console.log(val)this.showTabulation = val},},
}
</script>
<style scoped lang="less">
//字体资源,若是没有的话,可以去掉这行代码
//@font-face {
//  font-family: 'son';
//  src: url('~@/assets/font/son.ttf') format('truetype');
//}.yibiao_speed {position: absolute;left: 34%;top: 37%;font-size: 0.375rem;width: 0.75rem;height: 0.45rem;text-align: center;
}
.yibiao_span {position: absolute;left: 22%;top: 72%;font-size: 0.175rem;width: 1.3rem;height: 0.45rem;text-align: center;z-index: 1000;
}
.yibiao_max {position: absolute;left: 66%;top: 63%;font-size: 0.225rem;width: 0.75rem;height: 0.45rem;text-align: center;
}.yibiao_style {width: 2.25rem;height: 2.25rem;background-image: url(~@/assets/3d2/yibiao5.png);background-size: cover;position: relative;color: #fff;
}
.data-left-1 {width: 100%;height: 2.375rem;// padding: 0.1rem;display: flex;box-sizing: border-box;box-sizing: border-box;justify-content: center;// align-items: center;margin-bottom: 0.0625rem;
}
.mybox_wrap {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;
}.box_style {width: 2.25rem;height: 2.25rem;
}
.clock_box {width: 1.4375rem;height: 1.4375rem;border-radius: 50%;position: absolute;left: 0.375rem;top: 0.375rem;
}.clock_dial,
.clock_dial2 {width: 100%;height: 100%;position: relative;-moz-transform-origin: center center;-webkit-transform-origin: center center;-o-transform-origin: center center;transform-origin: center center;text-align: center;transform: rotate(-132deg);
}.clock_dial2 {width: 1.0625rem;height: 1.0625rem;top: 0.2375rem;left: 0.2375rem;;transform: rotate(-132deg);position: absolute;
}
.clock_dial div {position: absolute;width: 0.125rem;height: 100%;top: 0;left: 0.625rem;
}.dial,
.dial2 {position: absolute;width: 0.125rem;height: 100%;top: 0;left: 0.625rem;
}.dial2 {width: 0.125rem;left: 0.5rem;
}.dial span,
.dial2 span {width: 0.05rem;height: 0.125rem;background: #699b9a;display: inline-block;vertical-align: top;border-radius: 0.0125rem;
}.dial2 span {width: 0.0375rem;height:0.0625rem;
}.yibiao_boot {width: 1.25rem;height: 0.875rem;background-image: url(~@/assets/3d2/yibiaoBoot.png);background-size: contain;color: #fff;position: absolute;z-index: 666;bottom: 0;left: 0.5rem;opacity: 0.9;background-repeat: no-repeat;
}
</style>

页面中使用

<dashboard ref="dashboardwe" :speed="carSpeed" :rate="carRate"></dashboard>
import dashboard from './modules/dashboard' //仪表盘组件data() {return {carSpeed: 0, //列车速度carRate: 0,//百分比}
}let that = this;that.carRate = 100 / 200 * 100;//测试数据that.carSpeed = Math.floor(Math.random()*200);//测试数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/143426.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速重置模型原点

1、什么是模型原点&#xff1f; 模型原点是三维建模中的概念&#xff0c;它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示&#xff1a; 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…

MR混合现实在军事课堂教学中的应用演示

战场模拟&#xff1a;利用MR技术可以创建逼真的战场模拟环境&#xff0c;将学生置身于真实的战场场景中&#xff0c;可以体验和学习各种作战技巧和战术策略。学生可以通过佩戴MR头盔或眼镜&#xff0c;观察虚拟的场景&#xff0c;并与虚拟对象进行互动&#xff0c;如操作武器、…

人员重识别:Person Re-Identification without Identification via Event Anonymization

论文作者&#xff1a;Shafiq Ahmad,Pietro Morerio,Alessio Del Bue 作者单位&#xff1a;Istituto Italino di Tecnologia;Universita degli Studi di Genova 论文链接&#xff1a;http://arxiv.org/abs/2308.04402v1 内容简介&#xff1a; 1&#xff09;方向&#xff1a;…

漏洞扫描环境:win10系统用VMware Workstation打开虚拟机若干问题

win10系统用VMware Workstation打开虚拟机若干问题 一 .VMware打开虚拟机就蓝屏重启怎么解决&#xff1f;一. VMware打开虚拟机就蓝屏重启怎么解决&#xff1f;方法一&#xff1a;1、同时按下CTRLSHIFTESC打开任务管理器功能&#xff0c;之后依次点击-详细信息-性能后出现下列界…

【计算机网络】IP协议(上)

文章目录 TCP与 IP之间的关系IP地址的认识协议报头格式1. 报头和有效载荷如何分离&#xff1f;2. 8位协议3. 4位版本4. 8位服务类型5. 16位总长度6. 8位生存时间 TTL 网段划分IP地址的划分 子网划分CIDR的提出如何理解CIDR TCP与 IP之间的关系 如&#xff1a;假设 你上高中时&…

210-课程表III

文章目录 210-课程表III1. 题目 210-课程表III 1. 题目

npm安装心得(依赖库Python及node-sass依赖环境)

在使用vue的开发环境过程中&#xff0c;总会遇到这样哪样的安装或者打包错误&#xff0c; vue运行或打包常见错误如下&#xff1a; 1. npm install时 node-sass npm ERR command failed &#xff08;可能是node.js的版本和node-sass的版本不符&#xff0c;就是卸掉原来的node.…

第二证券:国庆档票房有望延续复苏态势 海风拐点已至

昨日&#xff0c;两市股指盘中强势轰动上扬&#xff0c;创业板指早盘一度涨近2%&#xff0c;随后涨幅逐渐收窄。到收盘&#xff0c;沪指涨0.16%报3107.32点&#xff0c;深成指涨0.44%报10104.32点&#xff0c;创业板指涨0.82%报2006.22点&#xff0c;两市算计成交7165亿元&…

深入理解 pytest.main():Python 测试框架的核心功能解析

前言 笔者平常运行pytest用例时&#xff0c;通常使用命令行方式&#xff0c;像这样 pytest -v pxl/test_dir/test_demo.py::TestDemo::test_my_var&#xff0c;执行某一条case&#xff0c;但每次命令行敲也挺麻烦的。那如何在python代码中调用pytest呢&#xff1f;带着疑问一…

MySQL面试题-索引的基本原理及相关面试题

先了解一下MySQL的结构 下面我们重点讲一下存储引擎 MySQL的数据库和存储数据的目录是一一对应的&#xff0c;这些数据库的文件就保存在磁盘中对应的目录里 下面我们来看一下对应的具体数据文件 .frm是表的结构&#xff0c;不管什么样的索引都会有 .ibd代表我们现在使用的存…

六、如何让卡片一直对着摄像头

上期我们创建了卡片&#xff0c;那么如何让卡片一直面向浏览器。这个交互有一部分公司还是很需要的&#xff0c;今天我们就来讲讲&#xff0c;先看效果图 在animate.js里面增加卡片Mesh的LookAt&#xff0c;代码如下 import camera from "./camera"; import rendere…

【STM32】IAP升级01 bootloader实现以及APP配置(主要)

APP程序以及中断向量表的偏移设置 前言 通过之前的了解 之前的了解&#xff0c;我们知道实现IAP升级需要两个条件&#xff1a; 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始&#xff1b; 2.APP程序的中断向量表相应的移动&#xff0c;移动的偏移量为 x&#xff…

如何制作gif动图gif (多图合成gif、GIF录制软件、视频制作成GIF动图)

文章目录 1 在线制作多图合成gif动画2 GIF录制软件3 将现有的视频 制作成GIF动图 1 在线制作多图合成gif动画 在线制作gif动画链接:https://www.matools.com/gif ①选择需要制作gif动画的图片将其添加 ②调整时间间隔&#xff0c;图片宽高等设置 ③一键生成gif ④下载到本…

两种风格的纯CSS3加载动画

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>加载动画</title><style>.loader {w…

蓝桥杯每日一题2023.9.27

4408. 李白打酒加强版 - AcWing题库 题目描述 题目分析 对于这题我们发现有三个变量&#xff0c;店&#xff0c;花&#xff0c;酒的数量&#xff0c;对于这种范围我们使用DP来进行分析。 dp[i][j][k]我们表示有i个店&#xff0c;j朵花&#xff0c;k单位酒的集合&#xff0c…

数据挖掘note(赵老师语录)

&#xff08;一&#xff09; 数据挖掘一般分为机器学习和统计学习&#xff0c;大数据学的课程一般是关于机器学习&#xff0c;我们学的浅&#xff0c;主要关于统计学习&#xff0c;示意图如下所示&#xff1a; 这是一个大数据时代&#xff0c;但是数据挖掘的利用率不足0.5%&am…

MySQL 索引的作用、索引结构及执行流程介绍(索引篇 一)

索引介绍 MySQL索引&#xff08;index&#xff09;是一种用于加快数据库中数据搜索和查询的数据结构。它类似于书籍的目录&#xff0c;可以帮助数据库快速定位和访问特定数据&#xff0c;而无需扫描整个数据表。 索引的作用和缺点 1. 加快数据搜索&#xff1a;通过使用索引&…

linux下离线安装telnet

安装过程概要&#xff1a; &#xff08;一&#xff09;互联网端下载rpm包&#xff1b; &#xff08;二&#xff09;上传到服务器root目录下&#xff1b; &#xff08;三&#xff09;安装telnet服务和测试&#xff1a; 详细内容&#xff1a; &#xff08;一&#xff09;互联…

Redis与分布式-主从复制

接上文 常用中间件-OAuth2 1.主从复制 启动两个redis服务器。 修改第一个服务器地址 修改第二个redis 然后分别启动 redis-server.exe redis.windows.conf) 查看当前服务器的主从状态&#xff0c;打开客户端&#xff1a;输入info replication命令来查看当前的主从状态&am…

601-体育馆的人流量

文章目录 601-体育馆的人流量1. 题目2. 思路3. 解决4. 运行结果 601-体育馆的人流量 1. 题目 2. 思路 思路&#xff1a;查询Stadium表中人流量超过100的记录&#xff0c;将查询结果与自身的临时表连接&#xff0c;再使用where获得满足条件的记录 查询Stadium表中人流量超过10…