国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

純JS+Vue實現(xiàn)一個儀表盤

這篇具有很好參考價值的文章主要介紹了純JS+Vue實現(xiàn)一個儀表盤。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在使用canvas的時候發(fā)現(xiàn)數(shù)值變化,每次都要重新渲染,值都從0開始,這和我的需求沖突。

一、 純JS+Vue

1. 先繪制基本的圓環(huán)背景,利用border-color和border-radius將正方形變成基本的圓環(huán)。

<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實現(xiàn)一個儀表盤,Vue,javascript,vue.js,開發(fā)語言

利用border-radius,就可將正方形變成圓形

純JS+Vue實現(xiàn)一個儀表盤,Vue,javascript,vue.js,開發(fā)語言


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實現(xiàn)一個儀表盤,Vue,javascript,vue.js,開發(fā)語言

3. 讓指針根據(jù)數(shù)據(jù)變動,和刻度一樣,每移動一個點要更改相應的刻度

<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實現(xiàn)一個儀表盤,Vue,javascript,vue.js,開發(fā)語言

二、 Canvas

靜下心實現(xiàn)了canvas描繪的儀表盤,并且數(shù)據(jù)不會從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. 設置一些基本參數(shù)

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

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

	// 圓環(huán)參數(shù)
	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點結(jié)束
</script>

3. 繪制圓環(huán)及外面的進度條

// 繪制圓環(huán)進度條函數(shù)
function drawProgress(progress) {
	// 清除畫布
	ctx.clearRect(0, 0, canvas.width, canvas.height);

	// 繪制背景圓環(huán)
	ctx.beginPath();
	ctx.arc(x, y, radius, startAngle, Math.PI / 4);
	ctx.lineWidth = lineWidth;
	ctx.strokeStyle = "#008000";
	ctx.stroke();

	// 繪制進度圓環(huán)
	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實現(xiàn)一個儀表盤,Vue,javascript,vue.js,開發(fā)語言

4. 繪制里面的刻度條

function drawTicks() {
	var numTicks = 50; // 刻度數(shù)量
	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(); // 恢復之前的繪圖狀態(tài)
}

純JS+Vue實現(xiàn)一個儀表盤,Vue,javascript,vue.js,開發(fā)語言

5. 繪制指針

這一段可以抽離出來一個方法,等有時間再改一下

let kedu = (((2.4) * 2) / 100);  //我的起始角度0的位置旋轉(zhuǎn)角度是從-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實現(xiàn)一個儀表盤,Vue,javascript,vue.js,開發(fā)語言

6. 繪制文本顯示當前的值

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

純JS+Vue實現(xiàn)一個儀表盤,Vue,javascript,vue.js,開發(fā)語言
完成~文章來源地址http://www.zghlxwxcb.cn/news/detail-627535.html

到了這里,關于純JS+Vue實現(xiàn)一個儀表盤的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • [譯]使用Python和Dash 創(chuàng)建一個儀表盤(上)

    [譯]使用Python和Dash 創(chuàng)建一個儀表盤(上)

    在數(shù)據(jù)科學和分析的領域,數(shù)據(jù)能力的釋放不僅是通過提取見解的方式, 同時也要能通過有效的方式來傳達見解.這就是數(shù)據(jù)可視化發(fā)揮見解的地方. 數(shù)據(jù)可視化是信息和數(shù)據(jù)的可視化呈現(xiàn). 它使用可視化元素,如圖表、圖形、地圖,使其更容易看懂原始數(shù)據(jù)中的模式、趨勢及異常值

    2024年02月16日
    瀏覽(43)
  • ChatGPT實現(xiàn)儀表盤生成

    ChatGPT實現(xiàn)儀表盤生成

    Grafana是開源社區(qū)最流行的數(shù)據(jù)可視化軟件,一定程度上也和 superset 一起被視為 tableau 等商業(yè) BI 的開源替代品,很多IT 團隊、科研團隊,都會使用 Grafana 來做數(shù)據(jù)監(jiān)控、挖掘分析。Grafana社區(qū)也有很多貢獻者,在 github 上分享自己針對不同場景制作的數(shù)據(jù)分析儀表盤效果和配置

    2024年02月02日
    瀏覽(17)
  • Qt QGraphicsScene、QGraphicsView類實現(xiàn)儀表盤
  • 微信小程序?qū)崿F(xiàn)帶刻度簡易儀表盤

    微信小程序?qū)崿F(xiàn)帶刻度簡易儀表盤

    實現(xiàn)如圖樣式的儀表盤,要求分數(shù)向下取整、進度精確展示。 1、首先畫出環(huán)形進度條,通過大圓包小圓的方式實現(xiàn):大圓(circle1)背景淺色,小圓(circle2)背景白色 2、在小圓內(nèi)部畫刻度,根據(jù)UI圖確認一共有12個刻度,其中長短刻度交叉顯示(如圖), 定義一個長度為1

    2024年02月11日
    瀏覽(17)
  • 解決Module not found: Error: ‘element-plus/lib/theme-chalk/index.css‘,通過下載插件,使用的是vue ui項目儀表盤

    解決Module not found: Error: ‘element-plus/lib/theme-chalk/index.css‘,通過下載插件,使用的是vue ui項目儀表盤

    1.首先在package.json中查看vue版本和element-ui版本 2.找到element-ui官網(wǎng)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.根據(jù)README 沒有項目就創(chuàng)建項目 vue create

    2024年02月13日
    瀏覽(27)
  • 界面控件DevExpress WPF Gauge組件 - 輕松實現(xiàn)個性化商業(yè)儀表盤

    界面控件DevExpress WPF Gauge組件 - 輕松實現(xiàn)個性化商業(yè)儀表盤

    DevExpress WPF Gauge(儀表)控件包含了多種圓形儀表類型、水平和垂直線性儀表、分段和矩陣數(shù)字儀表以及狀態(tài)指示器,同時還具有最終用戶交互性的集成支持。 P.S :DevExpress WPF擁有120+個控件和庫,將幫助您交付滿足甚至超出企業(yè)需求的高性能業(yè)務應用程序。通過DevExpress WPF能

    2024年02月06日
    瀏覽(23)
  • 如何在CentOS7搭建DashDot服務器儀表盤并實現(xiàn)遠程監(jiān)控

    如何在CentOS7搭建DashDot服務器儀表盤并實現(xiàn)遠程監(jiān)控

    本篇文章我們將使用Docker在本地部署DashDot服務器儀表盤,并且結(jié)合cpolar內(nèi)網(wǎng)穿透工具可以實現(xiàn)公網(wǎng)實時監(jiān)測服務器系統(tǒng)、處理器、內(nèi)存、存儲、網(wǎng)絡、顯卡等,并且擁有API接口。 DashDot是一款簡單、實用的開源現(xiàn)代服務器儀表盤,主要應用于小型 VPS 和私人服務器(比如說N

    2024年03月16日
    瀏覽(24)
  • echarts繪制儀表盤

    echarts繪制儀表盤

    ?代碼展示:

    2024年02月13日
    瀏覽(27)
  • 新版Grafana儀表盤

    新版Grafana儀表盤

    一 Grafana 是什么 ????????Grafana 是一個開源的指標量監(jiān)測和可視化工具,常用于展示基礎設施的時序數(shù)據(jù)和應用 程序運行分析。 ????????官網(wǎng)指路: https://grafana.com/ ????????與前文相關的兩個概念: ????????1)數(shù)據(jù)源(Datasource):定義了將用方式來查詢數(shù)據(jù)展

    2024年02月13日
    瀏覽(25)
  • Grafana增加儀表盤

    Grafana增加儀表盤

    grafana 是一款采用Go語言編寫的開源應用,主要用于大規(guī)模指標數(shù)據(jù)的可視化展現(xiàn),是網(wǎng)絡架構(gòu)和應用分析中最流行的時序數(shù)據(jù)展示工具,目前已經(jīng)支持絕大部分常用的時序數(shù)據(jù)庫。 Grafana下載地址:https://grafana.com/grafana/download Grafana儀表盤模板下載地址:https://grafana.com/grafa

    2024年02月04日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包