uni-app:实现页面效果2(canvas绘制,根据页面宽度调整元素位置)

news2025/1/23 21:12:43

效果

 

代码

<template>
	<view>
		<!-- 车搭配指示器-双显 -->
		<view class="content_position">
			<view class="content">
				<view class="SN">
					<view class="SN_title">设备1</view>
					<view class="SN_input">
						SN:
						<input type="text">
						<!-- <image :src="edit" mode=""></image> -->
					</view>
				</view>
				<view class="line1">
					<view class="line1_item3">
						<view class="item3_top">
							<view class="item3_top_title_position">
								<view class="item3_top_title">
									<view>CO/VI</view>
								</view>
							</view>
							<view class="item3_top_canvas_position">
								<canvas style="width:100%; height: 80px;" canvas-id="firstCanvas"
									id="firstCanvas"></canvas>
							</view>
							<view class="item3_top_text_position">
								<view class="top_text1">
									<view>
										<view class="text_center">CO浓度值</view>
										<view class="circle">
											<view>
												<view class="text_center">
													0
												</view>
												<view class="text_center">
													PPM
												</view>
											</view>
										</view>
									</view>
								</view>
								<view class="top_text2">
									<view>
										<view class="text_center">VI可见度</view>
										<view class="circle">
											<view>
												<view class="text_center">
													0
												</view>
												<view class="text_center">
													0M
												</view>
											</view>
										</view>
									</view>
								</view>
							</view>
						</view>
						<view class="item3_bottom">
							<view class="line1_item3_block2">
								<view class="block2">
									<view class="title">
										CO信号输入
									</view>
									<view class="green_ring_select">
										<view>DI7</view>
										<view>
											<image :src="down" mode=""></image>
										</view>
									</view>
									<view class="block2_input">
										<view class="block2_input_title">
											量程
										</view>
										<view class="block2_input_data">
											<input type="text" value="0PPM">
											<input type="text" value="300PPM">
										</view>
									</view>
								</view>
							</view>
							<view class="line1_item3_block2">
								<view class="block2">
									<view class="title">
										CO信号输入
									</view>
									<view class="green_ring_select">
										<view>DI7</view>
										<view>
											<image :src="down" mode=""></image>
										</view>
									</view>
									<view class="block2_input">
										<view class="block2_input_title">
											量程
										</view>
										<view class="block2_input_data">
											<input type="text" value="0M">
											<input type="text" value="5000M">
										</view>
									</view>
								</view>
							</view>
						</view>
					</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				down: getApp().globalData.icon + 'look/down.png',
			}
		},
		onReady: function(e) {
			//创建一个画布上下文对象,用于进行绘图操作。'firstCanvas'是一个指定的画布标识符,表示在页面上的哪个 <canvas> 元素上进行绘制。
			var context = uni.createCanvasContext('firstCanvas')
			var width = '';
			const query = uni.createSelectorQuery();
			//获取宽度
			query.select('#firstCanvas').fields({
				size: true
			}, (res) => {
				width = res.width;
			}).exec();

			//绘制路径中的线条。
			context.setStrokeStyle("#aaaaff")
			// 设置线条的宽度为2个像素。
			context.setLineWidth(2)
			// 绘制横线
			context.beginPath(); // 开始路径绘制
			context.moveTo(width / 2, 0); // 将起点移动到 (0, 100)
			context.lineTo(width / 2, 50);
			context.stroke(); // 绘制线条
			var x1 = width / 4; // 第一个竖线的起点 x 坐标
			var y1 = 50; // 第一个竖线的起点 y 坐标
			var y2 = 30; // 短竖线的高度
			var horizontalLength = width / 2; // 横线的长度
			context.beginPath();
			context.moveTo(x1, y1 + y2); // 移动到第一个短竖线的起点
			context.lineTo(x1, y1); // 绘制第一个短竖线
			context.moveTo(x1 + horizontalLength, y1 + y2); // 移动到横线的右端下方
			context.lineTo(x1 + horizontalLength, y1); // 绘制第二个短竖线
			context.moveTo(x1, y1); // 移动到横线的左端下方
			context.lineTo(x1 + horizontalLength, y1); // 绘制横线/*  */
			context.stroke(); // 绘制线条
			// 将之前的绘图操作渲染到画布上。
			context.draw()

			// 获取父元素的宽度
			var parentWidth = document.querySelector('.item3_top_text_position').offsetWidth;
			console.log(parentWidth);
			// 计算margin-left的值
			var marginLeft = parentWidth / 4;
			// 设置样式
			document.querySelector('.top_text2').style.marginLeft = marginLeft + 'px';
			document.querySelector('.top_text1').style.marginLeft = '-' + marginLeft + 'px';
		},
		methods: {

		}
	}
</script>

<style lang="scss">
	page {
		background-color: #f3f4f6;
	}

	.text_center {
		display: flex;
		justify-content: center;
	}

	/* 总体样式 */
	.content_position {
		width: 100%;
		display: flex;
		align-items: center;
		justify-content: center;
	}

	.content {
		width: 90%;
		padding: 2% 0;

	}

	/* SN 样式 */
	.SN {
		color: #6b6c6e;
		padding: 2%;
		display: flex;
		// border:1px solid black;
		justify-content: space-between;

		/* 将左右视图分散对齐 */
		.SN_input {
			display: flex;

			// border:1px solid black;
			input {
				border-bottom: 1px solid #a3a4a6;
				width: 200rpx;
			}

			image {
				width: 48rpx;
				height: 48rpx;
			}
		}
	}

	// 行1样式
	.line1 {
		// border: 1px solid black;
		background-color: #fff;
		border-radius: 15px;
		margin: 3% 0;
		padding: 3% 0;
	}

	.line1_item3 {

		// 顶部样式
		.item3_top {
			// position:relative;s
		}

		//第一行标题
		//标题位置
		.item3_top_title_position {
			// border: 1px solid black;
			display: flex;
			align-items: center;
			justify-content: center;
		}

		//标题内容
		.item3_top_title {
			width: 160rpx;
			height: 160rpx;
			border-radius: 50%;
			background-color: #edf1fc;
			color: #8196ec;
			font-size: 120%;
			font-weight: bold;
			display: flex;
			align-items: center;
			justify-content: center;
			// border:1px solid black
		}

		//画布位置
		.item3_top_canvas_position {
			// border: 1px solid black;
			display: flex;
			align-items: center;
			justify-content: center;
		}

		//文本位置
		.item3_top_text_position {
			// border: 1px solid black;
			position: relative;
			height: 400rpx;
		}

		.top_text1 {
			position: absolute;
			left: 50%;
			transform: translateX(-50%);
			margin-left: -85px;
			// border: 1px solid black;
			width: 220rpx;
			height: 350rpx;
			background-color: #edf1fc;
			border-radius: 10px;
			display: flex;
			align-items: center;
			justify-content: center;
		}

		.top_text2 {
			position: absolute;
			left: 50%;
			transform: translateX(-50%);
			margin-left: 85px;
			// border: 1px solid black;
			width: 220rpx;
			height: 350rpx;
			background-color: #edf1fc;
			border-radius: 10px;
			display: flex;
			align-items: center;
			justify-content: center;
		}

		.circle {
			width: 140rpx;
			height: 140rpx;
			border-radius: 50%;
			font-size: 95%;
			display: flex;
			align-items: center;
			justify-content: center;
			background-color: #e8e8e8;
		}



		// 底部样式
		.item3_bottom {
			display: flex;
			justify-content: space-between; //分散排列
			// border: 1px solid black;
		}

		//两列
		.line1_item3_block2 {
			display: flex;
			text-align: center;

			margin: 0 5%; //增加底部两个模块之间的距离
		}

		//两个小块样式
		.block2_input {
			margin: 5% 0;
			display: flex;
		}

		// 底部两小块标题
		.block2_input_title {
			width: 30%;
			display: flex;
			align-items: center; //竖直居中
			justify-content: center; //水平居中
			// border: 1px solid black;
		}

		.block2_input_data {
			width: 70%;
		}

		.block2_input_data input {
			margin: 5% 0;
			border: 1px solid #808080;
			border-radius: 20px;
			padding: 2% 5%;
			color: #737373;
			text-align: right;

		}

		//绿环样式
		.green_ring_select {
			background-color: #6da54f;
			border-radius: 20px;
			color: #fff;
			font-size: 95%;
			display: flex;
			align-items: center;
			padding: 1% 0;
			margin: 5% 0;

			// width:200rpx;
			view:nth-child(1) {
				width: 60%;
				display: flex;
				justify-content: center;
				align-items: center;
			}

			view:nth-child(2) {
				width: 40%;
				display: flex;
				justify-content: center;
				align-items: center;

				image {
					width: 30rpx;
					height: 30rpx;
				}
			}

		}
	}
</style>

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

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

相关文章

java - 七大比较排序 - 详解

前言 本篇介绍了七大比较排序&#xff0c;直接插入排序&#xff0c;希尔排序&#xff0c;冒泡排序&#xff0c;堆排序&#xff0c;选择排序&#xff0c;快速排序&#xff0c;归并排序&#xff0c;一些简单思想代码实现&#xff0c;如有错误&#xff0c;请在评论区指正&#xf…

代码生活处处是代理--静态代理+动态代理的实现

你买房了吗&#xff1f;你买车了吗&#xff1f;你买啥啥啥了吗&#xff1f;现在这个社会除了物理物质我们离不开&#xff0c;还有一种角色也在潜移默化中渗透我们的生活。---中介 代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。…

【深度学习实验】卷积神经网络(四):自定义二维汇聚层:最大汇聚(max pooling)和平均汇聚(average pooling)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. Conv2D&#xff08;二维卷积层&#xff09; 2. Pool2D&#xff08;二维汇聚层&#xff09; 理论知识 a. 初始化 b. 前向传播(最大汇聚层) c. 前向传播(平均汇聚…

GLTF编辑器也可以转换GLB模型

1、GLB模型介绍 GLB&#xff08;GLTF Binary&#xff09;是一种用于表示三维模型和场景的文件格式。GLTF是"GL Transmission Format"的缩写&#xff0c;是一种开放的、跨平台的标准&#xff0c;旨在在各种3D图形应用程序和引擎之间进行交换和共享。 GLB文件是GLTF文件…

ubuntu22.04怎么安装微信3.2.1

下载微信和wine的安装包 https://archive.ubuntukylin.com/software/pool/partner/ 使用root权限安装wine apt-get install -f -y ./ukylin-wine_70.6.3.25_amd64.deb安装微信 apt-get install -f -y ./ukylin-wechat_3.0.0_amd64.deb安装成功会出来一个页面

高仿互站网站源码 后台手机端两套模板 电脑端二十套模版

高仿互站网 后台手机端两套模板 电脑端二十套模版&#xff0c;简单介绍几个功能&#xff0c; 支持用户注册开店 开店申请&#xff0c;支持用户发布自己商品 支持卡密形式或实物形式&#xff0c; 支持用户自己发布求助 任务大厅功能&#xff0c;源码完整 更多功能自己去发现吧…

低代码平台如何助力国内企业数字化转型?

数字化是什么 数字化&#xff08;Digitalization&#xff09;是将许多复杂多变的信息转变为可以度量的数字、数据&#xff0c;再以这些数字、数据建立起适当的数字化模型&#xff0c;把它们转变为一系列二进制代码&#xff0c;引入计算机内部&#xff0c;进行统一处理&#xf…

【Linux】生产者和消费者模型

生产者和消费者概念基于BlockingQueue的生产者消费者模型全部代码 生产者和消费者概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。 生产者和消费者彼此之间不直接通讯&#xff0c;而通过这个容器来通讯&#xff0c;所以生产者生产完数据之后不用等待…

网安工具 | Windows便携式渗透测试环境PentestBox入门到进阶使用指南

微信改版了&#xff0c;现在看到我们全凭缘分&#xff0c;为了不错过【全栈工程师修炼指南】重要内容及福利&#xff0c;大家记得按照上方步骤设置「接收文章推送」哦~ 关注【公众号】回复【学习交流群】加入【SecDevOps】学习交流群! 文章目录&#xff1a; 本文为作者原创文章…

Kafka Log存储解析以及索引机制

1.概述 在Kafka架构&#xff0c;不管是生产者Producer还是消费者Consumer面向的都是Topic。Topic是逻辑上的概念&#xff0c;而Partition是物理上的概念。每个Partition逻辑上对应一个log文件&#xff0c;该log文件存储是Producer生产的数据。Producer生产的数据被不断追加到该…

CSP-J第二轮试题-2021/2/3年-注意事项

参考: https://blog.csdn.net/Keven_11/article/details/126388791 https://www.cnblogs.com/-Wallace-/p/cpp-stl.html 2021年真题要求 2022年真题要求 考试注意事项 优先注意&#xff1a; 1.使用freopen。 #include <bits/stdc.h> #include<cstdio>//必须包含…

晨控CK-FR08系列读写器与LS可编程逻辑控制器MODBUSRTU连接手册

晨控CK-FR08系列读写器与LS可编程逻辑控制器MODBUSRTU连接手册 晨控CK-FR08是一款基于射频识别技术的高频RFID标签读卡器&#xff0c;读卡器工作频率为13.56MHZ&#xff0c;支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读取。读卡器内部集成了射频部分通信…

spring-boot入门之如何利用idea创建一个spring-boot项目

1.创建流程&#xff01;&#xff01;&#xff01; 选择新建项目&#xff0c;这里我们需要注意是基于maven建立的和java版本和jdk版本要对应 这里我们是基于web项目创建的记得选择这个框架。 2.测试程序 编写hello测试类 我们需要通过程序的入口进行启动程序。idea已经为我们自…

【算法练习Day7】反转字符串替换空格反转字符串中的单词左旋转字符串

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 反转字符串反转字符串 I…

【洛谷 P1644】跳马问题 题解(深度优先搜索)

跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 1 1 所示。马自左下角 ( 0 , 0 ) (0,0) (0,0) 向右上角 ( m , n ) (m,n) (m,n) 跳。规定只能往右跳&#xff0c;不准往左跳。比如图 1 1 1 中所…

修改switch Nand无线区码 以支持高频5G 信道

环境&#xff1a;NS switch 问题&#xff1a;日版&#xff0c;港版无法连接大于44信道的5G WIFI 解决办法&#xff1a;修改PRODINFO.dec的WIFI 区域码 背景&#xff1a;我的switch是最早买的港版的一批&#xff0c;WIFI 只能连接日本的信道&#xff0c;家里的路由器是大陆的&am…

CentOS7安装Oracle XE记录

本文仅是CentOS7安装Oracle XE记录&#xff0c;供参考 1、下载安装包 oracle-xe-11.2.0-1.0.x86_64.rpm.zip 2、安装 &#xff08;1&#xff09;第一次安装 [rootnode1 opt]# cd oracle-xe/ [rootnode1 oracle-xe]# ll 总用量 309884 -rw-r--r-- 1 root root 317320273 6月…

软件设计模式系列之十七——解释器模式

1 模式的定义 解释器模式是一种行为型设计模式&#xff0c;它用于将一种语言或表达式解释为对象。该模式通过定义语言的文法规则&#xff0c;并使用解释器来解释和执行这些规则&#xff0c;将复杂的语言转换为对象的操作。 在软件开发中&#xff0c;解释器模式常用于处理类似…

初识ebpf

介绍eBPF技术 当代计算机系统中&#xff0c;性能、安全性和可观察性是至关重要的关键因素。为了应对这些挑战&#xff0c;Linux 内核引入了一种名为eBPF&#xff08;extended Berkeley Packet Filter&#xff09;的强大技术。eBPF 不仅仅是一种网络数据包过滤器&#xff0c;它…

轻松拿下Offer!20个Salesforce管理员顾问的基础面试问题

先是Salesforce第二财季业绩远超预期&#xff0c;股价大涨&#xff0c;后是首席执行官Marc Benioff表示将在各部门招聘3300名员工&#xff0c;生态系统呈现欣欣向荣的态势&#xff0c;Salesforce也成为越来越多人的职业选择。 管理员作为入门级的岗位&#xff0c;是小白和新手…