微信小程序 纯css画仪表盘

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

微信小程序canvas画仪表盘,小程序,微信小程序,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认证等等
微信小程序canvas画仪表盘,小程序,微信小程序,css,小程序文章来源地址https://www.toymoban.com/news/detail-765705.html

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

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

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

相关文章

  • Grafana增加仪表盘

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

    2024年02月04日
    浏览(47)
  • echarts绘制仪表盘

     代码展示:

    2024年02月13日
    浏览(45)
  • QML 仪表盘小示例

    本次项目已发布在CSDN-GitCode,下载方便,安全,可在我主页进行下载即可,后面的项目和素材都会发布这个平台。 个人主页:https://gitcode.com/user/m0_45463480 怎么下载:在项目中点击克隆,windows:zip linux:tar.gz tar # .pro

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

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

    2024年02月02日
    浏览(37)
  • Prometheus + Grafana 搭建监控仪表盘

    目标要求 1、需要展现的仪表盘: SpringBoot或JVM仪表盘 Centos物理机服务器(实际为物理分割的虚拟服务器)仪表盘 2、展现要求: 探索Prometheus + Grafana搭建起来的展示效果,尽可能展示能展示的部分。 监控系统核心:prometheus-2.45.0.linux-amd64.tar 下载地址:https://github.com/prometheus

    2024年04月23日
    浏览(47)
  • 纯JS+Vue实现一个仪表盘

    在使用canvas的时候发现数值变化,每次都要重新渲染,值都从0开始,这和我的需求冲突。 利用 border-radius ,就可将正方形变成圆形 一共100个值,每两个刻度就要有线,到10线的长度会更长一点。其实和画钟表一样,0的位置是坐标轴的225°,到100的位置,总共是180°+45° 静下心

    2024年02月14日
    浏览(51)
  • 安装istio和部署实例以及仪表盘

    安装Istio 接下来我们将介绍如何在 Kubernetes 集群中安装 Istio,这里我们使用的是最新的 1.10.3 版本。 下面的命令可以下载指定的 1.10.3 版本的 Istio: 如果安装失败,可以用手动方式进行安装,在 GitHub Release 页面获取对应系统的下载地址: 其中 samples/ 目录下面是一些示例应用程

    2024年02月13日
    浏览(43)
  • QPaint绘制自定义仪表盘组件01

    网上抄别人的,只是放这里自己看一下,看完就删掉 ui Dashboard.pro  mainwindow.h  mainwindow.cpp main.cpp 

    2024年02月22日
    浏览(40)
  • 【监控仪表系统】Grafana 中文入门教程 | 构建你的第一个仪表盘

    Grafana 读音:/grəˈfɑːnˌɑː/ 在大厂工作久了,时常对一些工具的存在觉得理所当然。 比如说,需要计算资源的时候,一个配置文件就可以要来两百台虚拟化好的机子。需要试下缓存?点下鼠标就可以要到几十个配置好的 Redis 结点。 最省心的是,这些工具都已经根据工作流

    2024年02月02日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包