之前公司请外包做了一个体温单使用的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小时为一格来划分 所有我们先建立一格全局的变量

//多少个y轴坐标
      xLineLen:{
        //天数 7天 
        day:7,
        //一天多少分段
        time:6
      },

  这里就定义出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)的更多相关文章

  1. 使用zrender.js绘制体温单(2)

    今天我们来画折线图 效果图 以下为模拟数据 [{"time":19,"text":"入\n院\n19\n时\n11\n分","po ...

  2. js验证表单大全

    js验证表单大全 1. 长度限制 <script> function test() { if(document.a.b.value.length>50) { alert(" ...

  3. 利用d3.js绘制雷达图

    利用d3,js将数据可视化,能够做到数据与代码的分离.方便以后改动数据. 这次利用d3.js绘制了一个五维的雷达图.即将多个对象的五种属性在一张图上对照. 数据写入data.csv.数据类型写入typ ...

  4. JS 更改表单的提交时间和Input file的样式

    JS转换时间 function renderTime(data) { var da = eval('new ' + data.replace('/', '', 'g').replace('/', '' ...

  5. 应用wavesurfer.js绘制音频波形图小白极速上手总结

    一.简介 1.1  引   人生中第一份工作公司有语音识别业务,需要做一个web网页来整合语音引擎的标注结果和错误率等参数,并提供人工比对的语音标注功能(功能类似于TranscriberAG等),(博 ...

  6. js 绘制数学函数

    <!-- <!doctype html> --> <html lang="en"> <head> <meta charset= ...

  7. js动态控制表单表格

    js动态控制表单表格,这里操作只讲,添加一行,删除一行,删除某一行某一列. 直接放代码: <!DOCTYPE html> <html> <head> <met ...

  8. jquery.form.js 让表单提交更优雅

    jquery.form.js 让表单提交更优雅.可以页面不刷新提交表单,比jQuery的ajax提交要功能强大. 1.引入 <script src="/src/jquery-1.9.1 ...

  9. Vue.js:表单

    ylbtech-Vue.js:表单 1.返回顶部 1. Vue.js 表单 这节我们为大家介绍 Vue.js 表单上的应用. 你可以用 v-model 指令在表单控件元素上创建双向数据绑定. v-mo ...

随机推荐

  1. Qt编写Onvif搜索及云台控制工具

    一.前言 这个工具很早以前大概在2013年就想做了,后面杂七杂八的事情一再耽搁,记得当时最初用的是soap类来搜索和解析的,后面发现太大了,每次编译都要等好久,光源码文件加起来都快10MB了,而且函数 ...

  2. mysqlcheck修复工具

    mysqlcheck工具可以检查.修复.优化和分析MyISAM引擎的表,实际上是集成了Mysql中的check.repair.analyze.tmpimize的功能. mysqlcheck共军存在于m ...

  3. Django补充之模板语言

    路由系统 Django页面详情以及分页 举个例子: 有一组后台数据,需要展示到页面上,但由于数据量较大,那就需要做分页了吧,那么怎么才能将页面详情和分页都融合进去呢,Django里的路由系统加上正则表 ...

  4. PHP实现简单留言板

    最近学习了下PHP基础,这里做一个简单的留言板,算是对PHP和MySQL的使用做一个整体的练习吧,不遇到问题总感觉学不到东西. 截图如下: 总结: 1>数据库的简单操作,数据库的增删改查: 2. ...

  5. Ocelot+Consul 集群搭建实践

    博客园已经有很多大神写过consul集群搭建了.大家都在玩,那我也不能托后退呢 不过自己研究下还是好的.毕竟每个人遇到的问题的不同 研究过才能说自己玩过consul,文章有部分名词解释是收集网络 Co ...

  6. 安装android sdk,后出现导出错误,提示命令行找不到解决方案

    The steps. Rename android sdk tool folder : [Your Android SDK root]/tools -> toolsXXXX Download S ...

  7. 【c# 学习笔记】接口与抽象类

    抽象类经常与接口一起使用,共同服务于面向对象的编程,这里简单地分析一下接口与抽象类的区别,如下: 1.抽象类使用abstract关键字进行定义,而接口使用interface进行定义:它们都不能进行实例 ...

  8. Unity与Android刘海屏适配

    本周学习Unity与Android刘海屏适配 关于刘海屏适配部分 网上有很多教程 这里只是做一下整理 https://blog.csdn.net/xj1009420846/article/detail ...

  9. nginx 四个主要组成部分

    1.Nginx 二进制可执行文件 由各模块源码编译出的一个文件 2.Nginx.conf 配置文件 控制nginx如何运行 3.access.log 访问日志 记录http请求信息 4.error.l ...

  10. java输入输出 -- Java NIO之选择器

    一.简介 前面的文章说了缓冲区,说了通道,本文就来说说 NIO 中另一个重要的实现,即选择器 Selector.在更早的文章中,我简述了几种 IO 模型.如果大家看过之前的文章,并动手写过代码的话.再 ...