微信小程序 純css畫儀表盤

在這里插入圖片描述

剛看到設計稿的時候第一時間想到的就是用canvas來做這個儀表盤,雖然本人的畫布用的不是很好但還可以寫一寫😀。話不多說直接上代碼。最后有純css方法

<!--wxml-->
<canvas canvas-id="circle" class="circle" >
// js
data: {canvasWidth: 285, // 畫布寬度canvasHeight: 285, // 畫布高度value: 60, // 當前得分
},/** 繪制儀表盤*/showCanvasRing() {var that = this;var ctx = wx.createCanvasContext("circle");ctx.clearRect(0, 0, that.data.canvasWidth, that.data.canvasHeight); // 清除畫布var circle_r = that.data.canvasWidth / 2; //畫布的一半,用來找中心點和半徑var scoreText = that.data.value>=100?100:that.data.value; // 當前得分 最多100分var descript = '良好'; // 當前描述var date = formatTime(new Date(),'MM-DD'); // 當前日期// 圓弧起點var startAngle = 0.8 * Math.PI;var endAngle = 2.2 * Math.PI;//定義起始點ctx.translate(that.data.canvasWidth / 2, that.data.canvasHeight / 2);// 畫圓背景ctx.beginPath();ctx.setStrokeStyle("#6bb7b9");ctx.fillStyle="#6bb7b9";ctx.setLineCap("round");ctx.arc(0, 0, circle_r,2*Math.PI);ctx.fill()ctx.stroke();ctx.closePath();//  白半邊圓弧ctx.beginPath();ctx.setStrokeStyle("#FFFFFF");ctx.setLineWidth(10);ctx.setLineCap("round");ctx.arc(0, 0, circle_r - 20, startAngle, endAngle, false);ctx.stroke();ctx.closePath();// 刻度for (let i = 0; i <= 10; i++) {let angle = startAngle + (endAngle - startAngle - 0.1) * (i * 10) / 100;if (angle > Math.PI * 2) {angle = angle - Math.PI * 2}const point = that.getPoint(0, 0, circle_r - 44, angle);const PI_3_2 = Math.PI * 1.5;const PI_1_2 = Math.PI * 0.5;ctx.save()ctx.setFillStyle("#fff");ctx.setFontSize(13);ctx.translate(point.x, point.y)const rotateDegrees = angle >= PI_3_2 ? (angle - PI_3_2) : (angle + PI_1_2);ctx.rotate(rotateDegrees)ctx.fillText(i * 10, 0, 0)ctx.restore()}// 當前得分內圓弧ctx.beginPath();ctx.setStrokeStyle("#FFA64D");ctx.setLineWidth(10);ctx.setLineCap("round");ctx.arc(0, 0, circle_r - 20, startAngle, startAngle + (endAngle - startAngle) * scoreText / 100, false);ctx.stroke();ctx.closePath();// 分數ctx.setTextAlign("center"); // 字體位置ctx.setFillStyle("#fff");ctx.font = "900 50px Arial"ctx.fillText(scoreText, 0, -20);// 描述ctx.setTextAlign("center"); // 字體位置ctx.font = "400 15px Arial"ctx.fillText(descript, 0, 15);// 日期ctx.setTextAlign("center");ctx.setLineWidth(8);ctx.setFontSize(14);ctx.fillText(date + ' 更新', 0, 35);// 繪圖ctx.draw();},getPoint: function (x, y, r, angle) {const x1 = x + r * Math.cos(angle);const y1 = y + r * Math.sin(angle);return {x: x1,y: y1}},

到此儀表盤就畫完了,最后需求有變動需要再儀表盤上加文本,眾所周知canvas在小程序中的層級很高。但是官方說可以使用cover-view | cover-image

 <canvas canvas-id="circle" class="circle" ><cover-view class="lowScore" wx:if="{{showView}}">目前信用分過低</cover-view></canvas>

經過驗證cover-view可以做到在canvas上懸浮,但是不能滿足所有需求;
比如要懸浮scroll-view ,總不能把內容全部用畫布來寫吧 ~ ~。也有人說可以將繪畫完成后的canvas轉成圖片進行顯示wx.canvasToTempFilePath。我同樣也試過但是會報錯:canvasToTempFilePath:fail fail canvas is empty,怎么解決試了好半天,由于項目著急也沒用太多時間研究了。所有最后我決定使用最原始的方法來實現。來看代碼吧 ↓ ↓

 <!--wxml-->
<view class="dashboard"><view class="dashboard-arc"><view class="dashboard-scale"><view wx:for="{{[0,10,20,30,40,50,60,70,80,90,100]}}" wx:key="item">{{item}}</view></view><view class="dashboard-arc-active" style="background: conic-gradient(#FFA64D 0, #FFA64D {{(value*0.75)}}%, transparent 0, transparent);"><view class="dashboard-arc-active-end" style="transform: translateX(-50%) rotate({{(value/100)*270}}deg);"></view></view></view><view class="dashboard-content"><view class="dashboard-content-title">{{value}}</view><view class="dashboard-content-text">{{state}}</view><view class="dashboard-content-desc">{{tool.formatTime(date,'MM-DD')}} 更新</view></view><view class="lowScore" wx:if="{{showView}}">目前信用分過低</view>
...要懸浮的內容
</view>
	/* 儀表盤 */.dashboard {width: 750rpx;height: 600rpx;background: rgba(70, 165, 168, 1);box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.1);text-align: center;position: relative;}.dashboard::before{content: '';width: 570rpx;height: 570rpx;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);background-color: #6bb7b9;border-radius: 50%;}.dashboard-arc{width: 520rpx;height: 520rpx;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);transform: translate(-50%, -50%) rotate(-135deg);border-radius: 50%;background: conic-gradient(#fff 0, #fff 75%, transparent 0, transparent);}.dashboard-arc::before,.dashboard-arc::after{content: "";position: absolute;width: 20rpx;height: 20rpx;border-radius: 50%;background: #fff;}.dashboard-arc::before{left: 50%;top: 0;background-color: #FFA64D;transform: translateX(-50%);}.dashboard-arc::after{left: 0;top: 50%;transform: translateY(-50%);}.dashboard-arc-active{position: absolute;width: 100%;height: 100%;border-radius: 50%;top: 0;left: 0;}.dashboard-arc-active-end{position: absolute;width: 20rpx;height:100%;top: 0;left: 50%;z-index: 1;}.dashboard-arc-active-end::before{content: '';width: 20rpx;height: 20rpx;position: absolute;top: 0;left: 0;background: #FFA64D;border-radius: 50%;}.dashboard-scale{background-color: #6bb7b9;width: 480rpx;height: 480rpx;border-radius: 50%;position: relative;top: 50%;left: 50%;z-index: 99;font-size: 20rpx;transform: translate(-50%, -50%);color: #fff;}.dashboard-scale>view{position: absolute;top: 50%;height:calc(100% - 10rpx);left: 50%;transform: translate(-50%,-50%);}.dashboard-scale>view:nth-child(2){transform:translate(-50%,-50%)rotate(27deg);}.dashboard-scale>view:nth-child(3){transform:translate(-50%,-50%)rotate(54deg);}.dashboard-scale>view:nth-child(4){transform:translate(-50%,-50%)rotate(81deg);}.dashboard-scale>view:nth-child(5){transform:translate(-50%,-50%)rotate(108deg);}.dashboard-scale>view:nth-child(6){transform:translate(-50%,-50%)rotate(135deg);}.dashboard-scale>view:nth-child(7){transform:translate(-50%,-50%)rotate(162deg);}.dashboard-scale>view:nth-child(8){transform:translate(-50%,-50%)rotate(189deg);}.dashboard-scale>view:nth-child(9){transform:translate(-50%,-50%)rotate(216deg);}.dashboard-scale>view:nth-child(10){transform:translate(-50%,-50%)rotate(243deg);}.dashboard-scale>view:nth-child(11){transform:translate(-50%,-50%)rotate(270deg);}.dashboard-content{position: absolute;width: 300rpx;height: 300rpx;top: 50%;left: 50%;transform: translate(-50%, -50%);color: #fff;border-radius: 50%;padding: 20rpx;}.dashboard-content-title{font-size: 115rpx;font-weight: 900;}.dashboard-content-text{font-size: 25rpx;}.dashboard-content-desc{font-size: 20rpx;}

以上就是所有代碼了,覺得對你有用的話就點個贊吧 !
最后給大家推薦一個在線題庫小程序包含了阿里云認證、騰訊云認證、華為云認證、思科認證、銳捷認證、瓴羊認證、紅帽認證、軟考、IT認證等等
請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207658.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207658.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207658.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL 忘記root密碼后重置密碼操作

在忘記 MySQL 密碼的情況下&#xff0c;可以通過 --skip-grant-tables 關閉服務器的認證&#xff0c;然后重置 root 的密碼&#xff0c;具體操作步驟如下。 步驟 1)&#xff1a;關閉正在運行的 MySQL 服務。打開 cmd 進入 MySQL 的 bin 目錄。 步驟 2)&#xff1a;輸入mysqld -…

【Docker】容器數據持久化及容器互聯

容器數據持久化及容器互聯 一、Docker容器的數據管理1.1、什么是數據卷1.2、數據卷特點1.3、數據卷使用 二、Docker的數據卷容器2.1、什么是數據卷容器2.2、掛載數據卷容器方法 三、Docker數據卷的備份和還原3.1、數據備份方法3.2、數據還原方法 四、Docker容器互聯4.1、docker…

數據寶庫:深入探討數據隱私與安全的要義

寫在開頭 隨著數字時代的蓬勃發展&#xff0c;數據已成為當今社會的新型燃料。然而&#xff0c;正如能源需要保護和管理一樣&#xff0c;我們的數據同樣需要被妥善對待。本文將深入討論數據隱私和安全的不可忽視的重要性&#xff0c;并為您提供一些實用的基本措施和方法&#…

xcode ——Instrumets(網絡連接調試)使用

環境&#xff1a; instruments 使用只能在真機調試時使用&#xff0c;且真機系統必須ios15 點擊debug 按鈕——Network——Profile in Instruments 然后就可以看到如下面板 展開運行的項目&#xff0c;點擊session下的域名&#xff0c;下方回出現該域名下的網絡請求。點擊Deve…

管理類聯考——數學——真題篇——按題型分類——充分性判斷題——秒殺

題型結構 問題求解&#xff1a;通過計算求解&#xff0c;從五個選項中選出一個正確答案。條件充分性判斷&#xff1a;問所給的條件&#xff08;1&#xff09;&#xff08;2&#xff09;能否推出題設的結論&#xff0c;共有五個選項&#xff0c;從中選出正確的一個。&#xff0…

車聯網安全學習路標

1. 汽車和物聯網基礎知識 首先&#xff0c;你需要全面了解汽車和物聯網的基礎知識&#xff0c;包括汽車電子體系結構、車載通信技術&#xff08;如CAN、LIN、FlexRay、Ethernet&#xff09;以及物聯網的架構和通信協議&#xff08;如MQTT、CoAP&#xff09;。 2. 汽車網絡安全…

LCR 090. 打家劫舍 II(leetcode)動態規劃

文章目錄 前言一、題目分析二、算法原理1.狀態表示2.狀態轉移方程3.初始化4.填表順序5.返回值是什么 三、代碼實現總結 前言 在本文章中&#xff0c;我們將要詳細介紹一下LeetcodeLCR 090. 打家劫舍 II。采用動態規劃解決&#xff0c;這是一道經典的多狀態dp問題 一、題目分析…

人工智能從 DeepMind 到 ChatGPT ,從 2012 - 2024

本心、輸入輸出、結果 文章目錄 人工智能從 DeepMind 到 ChatGPT &#xff0c;從 2012 - 2024前言2010年&#xff1a;DeepMind誕生2012&#xff5e;2013年&#xff1a;谷歌重視AI發展&#xff0c;“拿下”Hinton2013&#xff5e;2014年&#xff1a;谷歌收購DeepMind2013年&…

stm32一種步進電機查表法驅動

文章目錄 一、定時器基礎頻率二、驅動原理三、關鍵代碼 對于stm32芯片來說&#xff0c;步進電機的驅動由于要在中斷中不斷計算下一次脈沖的時間而極其消耗算力&#xff0c;使用計算的方法對于芯片的算法消耗更高&#xff0c;特別是在f1這種算力比較低的芯片上&#xff0c;這時候…

Pipenv環境配置+Pytest運行

環境配置 使用Pipenv進行虛擬環境管理&#xff0c;Pipfile為依賴模塊管理文件。 安裝pipenv&#xff1a;brew install pipenv根項目根目錄下執行命令創建虛擬環境&#xff1a; pipenv install在Pycharm中指定項目運行的虛擬環境 &#xff1a;File->Settings->Project:-…

一文2500字使用Python進行GRPC和Dubbo協議的高級測試

01、GRPC測試 GRPC&#xff08;Google Remote Procedure Call&#xff09;是一種高性能、開源的遠程過程調用&#xff08;RPC&#xff09;框架&#xff0c;由 Google開發并基于Protocol Buffers&#xff08;protobuf&#xff09;進行通信。它使用了HTTP/2協議作為傳輸層&#…

C++11條件變量condition_variable

文章目錄 前言正文等待通知注意事項 結尾 前言 條件變量用于多線程中&#xff0c;其作用是在多線程間實現線程的等待、喚醒和通知機制&#xff0c;常配合互斥鎖&#xff08;std::mutex&#xff09;一起使用。它主要用于解決數據競爭問題>。 正文 條件變量只有五個函數&am…

PyQt6 QCalendarWidget日歷控件

?鋒哥原創的PyQt6視頻教程&#xff1a; 2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~共計39條視頻&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面開發 視頻教程(無廢話…

快速實現入門HarmonyOS開發

本文檔適用于HarmonyOS應用開發的初學者。編寫兩個簡單的頁面&#xff0c;實現在第一個頁面點擊按鈕跳轉到第二個頁面。開始前&#xff0c;請參考下載與安裝軟件、配置開發環境和運行HelloWorld&#xff0c;完成開發工具的安裝和開發環境的配置。 開發Ability 概述&#xff1…

Python 日期時間模塊詳解(datetime)

文章目錄 1 概述1.1 datetime 類圖1.2 類描述 2 常用方法2.1 獲取當前日期時間&#xff1a;now()、today()、time()2.2 日期時間格式化&#xff1a;strftime()2.3 日期時間大小比較&#xff1a;>、、<2.4 日期時間間隔&#xff1a;- 3 擴展3.1 Python 中日期時間格式化符…

混合預編碼(Hybrid Precoding)的全連接結構與子連接結構

A Survey on Hybrid Beamforming Techniques in 5G: Architecture and System Model Perspectives 全連接結構的混合預編碼 子連接結構的混合預編碼 Alternating Minimization Algorithms for HybridPrecoding in Millimeter Wave MIMO Systems

UE Websocket筆記

參考鏈接 [UE4 C入門到進階]12.Websocket網絡通信 - 嗶哩嗶哩 包含怎么用Nodejs 寫測試服務器 UE4_使用WebSocket和Json&#xff08;上&#xff09; - 知乎 包含Python寫測試服務器 UE4_使用WebSocket和Json&#xff08;下&#xff09; - 知乎 示例代碼 xxx.Build.cs"W…

【React】使用react hooks實現評論示例

實現功能 1、渲染評論列表 2、刪除評論 3、渲染導航欄和高亮 4、評論列表排序功能 5、獲取評論 6、點擊發布按鈕發布評論 7、清空輸入框 8、重新聚焦 實現代碼 1、需要引入 import React, { useRef, useState } from react import avatar from "../logo.png" //頭…

[動態規劃及遞歸記憶搜索法]2.插入乘號

插入乘號 題目描述 給定一個非負整數&#xff0c;用k個乘號將其分割&#xff0c;使得乘積最大。 例如&#xff1a;在整數12345中插入兩個乘號&#xff0c;有以下插入法&#xff1a; 1*2*345 1*23*45 1*234*5 12*3*45 12*34*5 123*4*5 其中最大值是123*4*5 2460 關于輸入 一…

前端小技巧: 面向切面編程在前端代碼中的應用

面向切面編程 面向切面編程在java中提出這類概念但是在js沒有束縛和約定&#xff0c;只需要按編程思想來實現原理在js中使用function或class實現面向切面編程 面向切面概念 AOP (Aspect Oriented Programming) 面向切面編程主要實現目的是針對業務處理過程中的切面進行提取&…