使用zrender.js绘制体温单(1)
之前公司请外包做了一个体温单使用的zrender.js 但是代码比较复杂维护性比较低再加上自己技术也不行 最近闲下来的时候看了一下zrender的官网慢慢的摸索并读了下之前的代码,感觉实际并不难,就自己重新从零开始自己绘制了一个 其中包括了折线,圆点,阴影区域,垂直虚线,鼠标hover事件等众多内容
今天先说说怎么画一个网格 完成效果如下
先把样式基本代码写好
<template>
<div>
<div id="main">
</div>
</div>
</template>
css
<style scoped>
#main{
height: 500px;
padding: 15px;
position: relative;
}
html,body{
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
canvas{
width: 100%;
height: 700px;
}
</style>
js
<script>
import zrender from 'zrender' export default {
name: 'HelloWorld',
data () {
return {
//多少个y轴坐标
xLineLen:{
//天数 7天
day:7,
//一天多少分段
time:6
},
canavsWidth:0, //画板宽度
canavsHeight:0, //画板高度
zr:"", //画板属性
yLineLen:{
XRegion:14, //X轴坐标分几个大块
XShare:6, //每块份几个小块
XLineArr:[4], //需要特殊处理的横线 冲上往下算
}
}
},
methods:{
init(){
this.zr = zrender.init(document.getElementById("main"))this.canavsWidth = this.zr.getWidth()
this.canavsHeight = this.zr.getHeight() }
},
mounted(){
this.init()
}
}
</script>
this.canavsWidth 为获取画板的宽度 同理下面为获取画板的高度
绘制网格首先要明白x,y轴各需要多少格
首先x轴 我们要先展示1个星期的数据所有会有7个大格子 然后每天以4小时为一格来划分 所有我们先建立一格全局的变量
这里就定义出x轴线的个数了 接下来是y轴
yLineLen:{
XRegion:14, //X轴坐标分几个大块
XShare:6, //每块份几个小块
XLineArr:[4], //需要特殊处理的横线 冲上往下算
}
XLineArr 表示格子中那条很长的红线
数据建好后我们在init里添加 2个方法 分别是创建x,y轴的坐标
this.yLine() //生成Y轴坐标
this.xLine() //生成X轴坐标
添加完后再methods 里添加以上2个方法
先说yLine
//横坐标
let Xline = new zrender.Line({
shape:{
x1:0,
y1:this.canavsHeight,
x2:this.canavsWidth,
y2:this.canavsHeight
}
})
this.zr.add(Xline)
这里是添加横坐标 是坐标轴最下面的那一条先 当然这个不应该写在这里当时为了显示出x,y初始坐标轴在这里写了 并不影响我们其他方法
x1,y1为开始坐标点x2,y2为结束坐标点从左到右
this.zr.add就是添加2条点并连接
const yWidth = this.canavsWidth/this.xLineLen.day
//循环显示竖线格子
for (let i = 0; i < this.xLineLen.day; i++) {
//纵坐标
let Yline = new zrender.Line({
shape:{
x1:yWidth*i,
y1:0,
x2:yWidth*i,
y2:this.canavsHeight
},
style:{
opacity:1,
lineWidth:1.5,
stroke:"#ff0000"
}
})
this.zr.add(Yline)
}
这里的yWidth 代表的是一个大格子有好宽 用画布宽度除以前面我们定义的天数就是每一个大格子的宽度
然后我们循环我们定义的天数 style里
opacity 代表透明度
lineWidth 代表线段的宽度
stroke 代表线段填充的颜色
这步完成界面应该就会出现7条红色的竖线
let yLinAll = this.xLineLen.day*this.xLineLen.time
for (let i = 0; i < yLinAll; i++) { let Yline = new zrender.Line({
shape:{
x1:yWidth/this.xLineLen.time*i,
y1:0,
x2:yWidth/this.xLineLen.time*i,
y2:this.canavsHeight
},
style:{
opacity:1,
lineWidth:0.3,
stroke:"#000"
}
})
this.zr.add(Yline)
}
yLinAll 代表一共有多少天 我们先算出总天数然后循环总天数这样我们就能画出每个大格子里的小格子了
style里的参数参考上一条 也可以查看官网
这步完成y轴坐标就算是画好了接下来我们画x轴 在xLine方法里写
let xHeight = this.canavsHeight/this.yLineLen.XRegion
let XShareAll = this.yLineLen.XRegion*this.yLineLen.XShare
xHeight 代表一个大格子的高度
XShareAll 代表一个多少个小格子
for (let i = 0; i < this.yLineLen.XRegion; i++) {
let color = "#000"
this.yLineLen.XLineArr.forEach(el => {
if (el == i) {
color = "#ff0000"
}
});
//横坐标 加粗
let Xline = new zrender.Line({
shape:{
x1:0,
y1:xHeight*i,
x2:this.canavsWidth,
y2:xHeight*i
},
style:{
opacity:1,
lineWidth:2,
stroke:color
}
})
this.zr.add(Xline)
先循环把大格子循环出来
for (let a = 0; a < XShareAll; a++) {
//横坐标
let Xline = new zrender.Line({
shape:{
x1:0,
y1:xHeight/this.yLineLen.XShare*a,
x2:this.canavsWidth,
y2:xHeight/this.yLineLen.XShare*a
},
style:{
opacity:1,
lineWidth:0.1,
stroke:"#000"
}
})
this.zr.add(Xline)
}
在循环出所有的小格子 入下图上下的格子 之前我们循环的是左右的格子
这步完成了 我们的体温单的坐标格子应该就画好了 时间原因今天就先写到这 下次写折线图和圆点的画法 折线图断线垂直虚线
第一次写文章写得不好不要喷我
使用zrender.js绘制体温单(1)的更多相关文章
- 使用zrender.js绘制体温单(2)
今天我们来画折线图 效果图 以下为模拟数据 [{"time":19,"text":"入\n院\n19\n时\n11\n分","po ...
- js验证表单大全
js验证表单大全 1. 长度限制 <script> function test() { if(document.a.b.value.length>50) { alert(" ...
- 利用d3.js绘制雷达图
利用d3,js将数据可视化,能够做到数据与代码的分离.方便以后改动数据. 这次利用d3.js绘制了一个五维的雷达图.即将多个对象的五种属性在一张图上对照. 数据写入data.csv.数据类型写入typ ...
- JS 更改表单的提交时间和Input file的样式
JS转换时间 function renderTime(data) { var da = eval('new ' + data.replace('/', '', 'g').replace('/', '' ...
- 应用wavesurfer.js绘制音频波形图小白极速上手总结
一.简介 1.1 引 人生中第一份工作公司有语音识别业务,需要做一个web网页来整合语音引擎的标注结果和错误率等参数,并提供人工比对的语音标注功能(功能类似于TranscriberAG等),(博 ...
- js 绘制数学函数
<!-- <!doctype html> --> <html lang="en"> <head> <meta charset= ...
- js动态控制表单表格
js动态控制表单表格,这里操作只讲,添加一行,删除一行,删除某一行某一列. 直接放代码: <!DOCTYPE html> <html> <head> <met ...
- jquery.form.js 让表单提交更优雅
jquery.form.js 让表单提交更优雅.可以页面不刷新提交表单,比jQuery的ajax提交要功能强大. 1.引入 <script src="/src/jquery-1.9.1 ...
- Vue.js:表单
ylbtech-Vue.js:表单 1.返回顶部 1. Vue.js 表单 这节我们为大家介绍 Vue.js 表单上的应用. 你可以用 v-model 指令在表单控件元素上创建双向数据绑定. v-mo ...
随机推荐
- Java多线程中thread.getname()和thread.currentThread().getName();的去别
首先要明白 this.XXX 的使用场景 使用Thread.currentThread().getName()和使用this.getName()和对象实例.getName(),都可以得到线程的名称,但 ...
- Linux 7 关闭、禁用防火墙服务
1 查看防火墙状态 [root@lvxinghao ~]# systemctl status firewalld 2 查看开机是否启动防火墙服务 [root@lvxinghao ~]# systemc ...
- 查看QML数据类型
assist输入: QML Types A Abstract3DSeries AbstractActionInput AbstractAnimation AbstractAxis AbstractAx ...
- 【419】C语言语句
判断语句 C 语言提供了以下类型的判断语句.点击链接查看每个语句的细节. 语句 描述 if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成. if...else 语句 一个 if 语句 ...
- 对Mysql数据表本身进行操作
创建实验环境 mysql> create database test_db; Query OK, 1 row affected (0.00 sec) mysql> use test_db; ...
- 123456123456#0#-----com.threeapp.xiongMaoPaoPao01----熊猫跑酷01
com.threeapp.xiongMaoPaoPao01----熊猫跑酷01
- python检测文件的MD值
使用hashlib模块,可对文件MD5一致性加密验证: #python 检测文件MD5值 #python version 2.6 import hashlib import os,sys #简单的测试 ...
- PAT 甲级 1062 Talent and Virtue (25 分)(简单,结构体排序)
1062 Talent and Virtue (25 分) About 900 years ago, a Chinese philosopher Sima Guang wrote a histor ...
- java编写的一段简单的网络爬虫demo代码
功能: 从网站上下载附件,并从页面中提取页面文章内容 关于NIO 在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚.操作系统并非不能快速传送数据,让 Java 有事可做:相反,是 JVM ...
- (十)java虚拟机性能监控工具
一. jps(Java Virtual Machine Process Status Tool) jps主要用来输出JVM中运行的进程状态信息.语法格式如下: 命令行参数选项说明如下: 1.1 案例 ...