vue+canvas实现根据数据展示不同高度,不同j渐变颜色的长方体效果

news2024/11/29 4:42:19

文章目录

  • 不一样的长方体
    • 1. 实现效果预览
    • 2.实现思路
      • 2.1效果难点
      • 2.2 实现思路
    • 3.实现
      • 3.1 测试数据编写
      • 3.2 编写canvas绘制函数

不一样的长方体

1. 实现效果预览

俗话说的好,没有实现不了的页面效果,只有禁锢的思想
这不ui又给整了个新奇的页面效果,

效果预览

2.实现思路

2.1效果难点

  • 根据不同的数据展示不同的颜色,而且需要渐变并有块状效果。
  • 绘制多个单独的区域

2.2 实现思路

实现思路

3.实现

3.1 测试数据编写

testData1:[
{ name:“库房1”, now:888, extends:1800 },
{ name:“库房2”, now:988, extends:1700 },
{ name:“库房3”, now:488, extends:2200 },
{ name:“库房4”, now:1888, extends:800 },
{ name:“库房5”, now:1088, extends:1600 },
{ name:“库房6”, now:1388, extends:1300 },
{ name:“库房7”, now:288, extends:2400 },
{ name:“库房8”, now:888, extends:1800 },
{ name:“库房9”, now:888, extends:1800 },
{ name:“库房10”, now:1888, extends:800 },
{ name:“库房11”, now:1288, extends:1400 },
{ name:“库房12”, now:1488, extends:1200 },
{ name:“库房13”, now:1888, extends:800 },
{ name:“库房14”, now:188, extends:2500 },
{ name:“库房2”, now:988, extends:1700 },
{ name:“库房3”, now:488, extends:2200 },
{ name:“库房4”, now:1888, extends:800 },
{ name:“库房5”, now:1088, extends:1600 },
{ name:“库房13”, now:1888, extends:800 },
{ name:“库房14”, now:188, extends:2500 },
{ name:“库房3”, now:488, extends:2200 },
{ name:“库房4”, now:1888, extends:800 },
{ name:“库房5”, now:1088, extends:1600 },
],

3.2 编写canvas绘制函数

js部分

draw(i,item){
      canvas = document.getElementById(`myCanvas${i}`);
      const ctx = canvas.getContext('2d');
      
     // 定义矩形块的宽度和高度
 	const rectWidth = canvas.width;
    const rectHeight = canvas.height/8;

    // 定义矩形块之间的间距
    const rectSpacing = 0.25 ;

    // 定义要绘制的行数和列数
    //其中2688代表测试数据中的now+extends的总和,
    //可根据具体情况自己调整
     const numRows = Math.ceil(item.now*10/2688);
     const numCols = 1;

     let color=[]
     if(Math.ceil(item.now*10/2688) >= 7){
           color[0]='#EE5E5D'
           color[1]='#FFECEC'
      }else if(Math.ceil(item.now*10/2688) >= 4){
           color[0]='#EEA750'
           color[1]='#FFF0DD'
      }else{
           color[0]='#4BCBA6'
           color[1]='#9EFAE0'
       }
     // 绘制矩形块
     for (let row = 0; row < numRows; row++) {
          for (let col = 0; col < numCols; col++) {
                const x = col * (rectWidth + rectSpacing);
                const y = row * (rectHeight + rectSpacing);
                // 设置矩形块的颜色
                const grd = ctx.createLinearGradient(canvas.width/2, 0,canvas.width/2,canvas.height);
                grd.addColorStop(0, color[1]);
                grd.addColorStop(1,color[0]);
                // 用渐变填充
                ctx.fillStyle = grd;
				// 绘制矩形块
                ctx.fillRect(x, y, rectWidth, rectHeight);
                }
            }
        }

html部分

 <ul>
     <li v-for="item,index in testData1" :key="index">
         <p class="title">{{item.now}}/{{item.extends}}m³</p>
         <div class="show">
             <canvas :id="`myCanvas${index}`" class="canvas"></canvas>
         </div>
          <p class="storeName">{{item.name}}</p>
     </li>
 </ul>

scss部分

container{
    width:100%;
    height:100%;
    position:relative;
        ul{
            display:grid;
            margin-top:20px;
            margin-left:10px;
            width:97%;
            grid-template-columns: repeat(10,1fr);
            gap:10px;
            font-family: Source Han Sans-Regular, Source Han Sans;
            li{
                width:100%;
                aspect-ratio: 1 / 1.5;
                background: #FFFFFF;
                box-shadow: 0px 8px 14px 0px rgba(48,78,121,0.5);
                border-radius: 4px;
                position:relative;
                text-align: center;
                .title{
                    font-size: 14px;
                    font-weight: 400;
                    color: #929292;
                    margin-top:14px;
                }
                .show{
                   width:33%;
                   height:70%;
                   background: #EFF2F7;
                   margin:10px auto;
                   border-radius: 4px;
                   .canvas{
                        width:100%;
                        height:100%;
                        transform: rotate(180deg);
                   }
                }
            }
        }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模型查询器在使用别名后不能使用tp6

在我们定义了模型的查询器时&#xff0c;再通过模型进行连表加别名的时候&#xff0c;使用查询器&#xff0c;查询器会没办法使用&#xff1b; 那我们可以将查询器前缀增加表名或者__TABLE__ 以上两种方式都可以&#xff0c;个人建议使用__TABLE__&#xff0c;因为这个查询器可…

单单单单单の刁队列

在数据结构的学习中&#xff0c;队列是一种常用的线性数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff09;的原则。而单调队列是队列的一种变体&#xff0c;它在特定条件下保证了队列中的元素具有某种单调性质&#xff0c;例如单调递增或单调递减。单调队列在处理…

Linux -- > vim

vi和vim是什么 vi和vim是两款流行的文本编辑器&#xff0c;广泛用于Unix和类Unix系统中。它们以其强大的功能和灵活的编辑能力而闻名&#xff0c;特别是在编程和系统管理中非常受欢迎。 vi&#xff08;Visual Interface&#xff09; vi是最初的文本编辑器之一&#xff0c;由…

AI赋能EasyCVR视频汇聚/视频监控平台加快医院安防体系数字化转型升级

近来&#xff0c;云南镇雄一医院发生持刀伤人事件持续发酵&#xff0c;目前已造成2人死亡21人受伤。此类事件在医院层出不穷&#xff0c;有的是因为医患纠纷、有的是因为打架斗殴。而且在每日大量流动的人口中&#xff0c;一些不法分子也将罪恶的手伸到了医院&#xff0c;实行扒…

不要错过!实景三维倾斜摄影在3D引擎的丝滑用法

在3D领域&#xff0c;倾斜摄影模型的应用是一个常见的瓶颈。工程建设、工业制造、科学分析、古建遗产&#xff0c;倾斜摄影是占主导地位的处理对象&#xff0c;但模型数据量大、精度要求高以及线上线下同步困难等&#xff0c;会导致生成的三维项目出现瑕疵。 所以在行业内&…

Electron学习笔记(二)

文章目录 相关笔记笔记说明 三、引入现代前端框架1、配置 webpack&#xff08;1&#xff09;安装 webpack 和 electron-webpack&#xff1a;&#xff08;2&#xff09;自定义入口页面 2、引入 Vue&#xff08;1&#xff09;安装 Vue CLI &#xff08;2&#xff09;调试配置 -- …

【解决】Android APK文件安装时 已包含数字签名相同APP问题

引言 在开发Android程序过程中&#xff0c;编译好的APK文件&#xff0c;安装至Android手机时&#xff0c;有时会报 包含数字签名相同的APP 然后无法安装的问题&#xff0c;这可能是之前安装过同签名的APP&#xff0c;但是如果不知道哪个是&#xff0c;无法有效卸载&#xff0c;…

KaiwuDB 参编的《分析型数据库技术要求》标准正式发布

近期&#xff0c;中国电子工业标准化技术协会正式发布团体标准《分析型数据库技术要求》&#xff08;项目号&#xff1a;T-CESA 2023-006&#xff09;。该标准由中国电子技术标准化研究院、KaiwuDB&#xff08;上海沄熹科技有限公司&#xff09; 等国内 16 家企业联合起草&…

婚恋程序_婚恋系统_交友程序_ 婚恋相亲交友系统-一站式搭建婚恋平台-社交婚恋系统-相亲交友APP小程序H5系统婚恋交友社交软件开发语音视频聊天平台定制开发

快速搭建线上平台 赋予十大线上盈利 快速精准牵线匹配 会员资料管理跟进 精美多样海报系统 红娘独立办公系统 丰富拓客引流工具 合伙红娘拓展客源 可多区域连锁运营 外呼电销到店邀约 线下约见服务管理 1对1技术服务支持 无感自动更新升级 行业领先的研发技术与服…

武汉凯迪正大—钢管焊缝裂纹探伤仪

产品概述 武汉凯迪正大无损探伤仪是一种便携式工业无损探伤仪器&#xff0c; 能够快速便捷、无损伤、精确地进行工件内部多种缺陷&#xff08;裂纹、夹杂、气孔等&#xff09;的检测、定位、评估和诊断。既可以用于实验室&#xff0c;也可以用于工程现场。 设置简单&#xff0c…

Swift 集合类型

集合类型 一、集合的可变性二、数组&#xff08;Arrays&#xff09;1、数组的简单语法2、创建一个空数组3、创建一个带有默认值的数组4、通过两个数组相加创建一个数组5、用数组字面量构造数组6、访问和修改数组7、数组的遍历 三、集合&#xff08;Sets&#xff09;1、集合类型…

IDEA 使用maven编译,控制台出现乱码问题的解决方式

前言 使用idea进行maven项目的编译时&#xff0c;控制台输出中文的时候出现乱码的情况。 通常出现这样的问题&#xff0c;都是因为编码格式不一样导致的。既然是maven出的问题&#xff0c;我们在idea中查找下看可以如何设置文件编码。 第一种方式 在pom.xml文件中&#xff…

LeetCode-2079. 给植物浇水【数组 模拟】

LeetCode-2079. 给植物浇水【数组 模拟】 题目描述&#xff1a;解题思路一&#xff1a;简单的模拟题&#xff0c;初始化为0&#xff0c;考虑先不浇灌每一个植物解题思路二&#xff1a;初始化为n&#xff0c;考虑每一个植物需要浇灌解题思路三&#xff1a;0 题目描述&#xff1a…

2024车载测试还有发展吗?

2024年已过接近1/4了,你是不是还在围观车载测试行业的发展? 现在入车载测试还来得及吗? 如何高效学习车载测试呢? 首先我们看一下车载测试行情发展,通过某大平台,我们后去数据如下: 这样的数据可以预估一下未来车载测试还是会持续发展. 随着科技的发展和汽车行业的不断创新,…

Python import 必看技巧:打造干净利落的代码结构

大家好,学习Python你肯定绕不过一个概念import,它是连接不同模块的桥梁,是实现代码复用和模块化的关键。本文将带你深入探索Python中import的原理,并分享一些实用的导入技巧。 1. import 原理 导入机制概述 在Python中,模块(module)是一种封装Python代码的方式,它允许…

华为eNSP学习—IP编址

IP编址 IP编址子网划分例题展示第一步:机房1的子网划分第二步:机房2的子网划分第三步:机房3的子网划分IP编址 明确:IPv4地址长度32bit,点分十进制的形式 ip地址构成=网络位+主机位 子网掩码区分网络位和主机位 学此篇基础: ①学会十进制与二进制转换 ②学会区分网络位和…

宋仕强论道之新质生产力

宋仕强论道之新质生产力&#xff0c;宋仕强说当前5G通信、人工智能、万物互联、工业互联网、数字经济、新能源技术和产业等领域正蓬勃发展&#xff0c;成为未来经济增长的重要推动力&#xff0c;也是目前提倡的新质生产力的重要组成部分。而这些领域的发展都离不开数据的采集、…

每日一题7:Pandas-重命名列

一、每日一题 编写一个解决方案&#xff0c;按以下方式重命名列&#xff1a; id 重命名为 student_idfirst 重命名为 first_namelast 重命名为 last_nameage 重命名为 age_in_years 返回结果格式如下示例所示。 解答&#xff1a; import pandas as pddef renameColumns(studen…

计算机系列之面向对象、设计模式

24、面向对象技术&#xff08;重要&#xff0c;10分左右&#xff09; 1、面向对象开发 (1)对象:由数据及其操作所构成的封装体&#xff0c;是系统中用来描述客观事务的个实体&#xff0c;是构成系统的一个基本单位。一个对象通常可以由对象名、属性和方法3个部分组成。 (2)类…

C++容器——stack

stack容器 C的std::stack容器是一个基于适配器模板类实现的容器适配器&#xff0c;它提供了一种后进先出的数据结构&#xff0c;即栈。 特点&#xff1a; 1.后进先出&#xff1a;元素在栈容器中按照后进先出的顺序管理&#xff0c;最后放入的元素将会最先被取出。 2.只能从栈…