您现在的位置是:网站首页> 编程资料编程资料
原生 JS+CSS+HTML 实现时序图的方法X38DQ6主板上电时序图
2021-08-31
898人已围观
简介 这篇文章主要介绍了原生 JS+CSS+HTML 实现时序图的方法,本文通过实例代码图文介绍的非常详细,需要的朋友可以参考下
之前本人使用React + AntDesign 实现了一个简单的时序图,但是后来有了更复杂的需求,并且要求同时展示2000个任务的展示,这就涉及到了性能问题,本人先使用React+antd+ts实现了一个基本满足下面需求的demo,但是react的渲染机制造成了较大的性能问题,利用chrome自带的Performance,测试发现demo的首次渲染高达10s以上,并且后续的操作也会使整个页面非常卡。经过思索后决定使用原声js+css+html去实现,因为原声js下性能是最优的。下面先来说说新版本的需求:
- 左侧以树形结构展示任务,可折叠
- 右侧展示任务运行所耗时间的长度
- 需要用线条链接任务之间的关系
- 右侧可缩放查看详细的任务状态
- 缩放时图形保持以鼠标为中心向两端成一定比例放大,放大时里面的文字描述不受影响
- 图形缩放时表示任务耗时的时间以及坐标需要跟随图像放大的比例进行相应变化
- 鼠标在时序图上移动时出现一根线条提示当前的时间以及信息
效果图
图一:

图二:

实现难点
鼠标缩放,x轴的缩放方式
鼠标缩放产生时序图X轴的缩放。时序图的缩放,在这里提供三种思路:
- 做数据截取,按照一定的算法截取前后的数据,然后重新渲染整个页面
- 利用css3的scaleX对时序图的dom做缩放
- 实际改变时序图dom的width,里面的任务运行的长度,连接线条的长度,任务运行预计需要的时长都以百分比显示。
三种思路的优缺点:
- 优点:不需要去操作dom的css属性,之间重新渲染,比较方便。缺点:对于使用dom重绘,耗费性能严重,大量任务渲染时性能很慢。
- 优点:只需改变dom的css,加载快,较流程。缺点:计算麻烦,使用过scaleX的小伙伴会发现当我X轴放大时垂直连接线会变宽,字体会横向拉伸,都需要去反向缩小。
- 优点:加载快,很流畅,一次计算好元素所占宽度的占百分比,后面的操作都不需要去计算。缺点:使用百分比计算会有一定误差,放大到一定程度会看的出来。(综合考虑,本人采用的是第三种)
// 计算宽度百分比的函数 // endTime: 任务的结束时间 // startTime: 任务的开始时间 // maxTime: 所有任务结束时间最大的值 // minTime: 所有任务开始时间最小的值 // time: 所有任务开始时间与结束时间的排序 升序 // task_width: 任务的长度、水平连接线的长度、垂直连接线的left值 const widthFun = function (endTime, startTime, maxTime, minTime) { const task_width = (((Number (endTime) - Number (startTime)) / ((maxTime || time[time.length - 1]) - (minTime || time[0])) * (body_width - tree_box_dom.offsetWidth)) / dom.offsetWidth)*100; return task_width> 100 ? 100 : task_width; };鼠标缩放,保持以鼠标为中心,往两边放大
先放推理过程图:

// 上图解释 // dom = 时序图的dom元素 // domL1, domeL2 = dom.scrollLeft; // domeL1表示前一次的dom.scrollLeft; // domeL2表示当前的dom.scrollLeft; // scale 表示当前的放大的比例 // scale1 表示上一次的放大比例 // tree_dom.offsetWidth表示左侧树的宽度 // clientX1 表示上一次的鼠标位置距离时序图左侧的距离 = e.clientX - tree_dom.offsetWidth // clientX2 表示当前鼠标位置距离时序图的距离 // 以鼠标为中心的缩放,公式为: domL2 = domeL1(scale/scale1) + clientX1(scale/scale1) - e.clientX + tree_dom.offsetWidth // 公式讲解: // 1. scale/scale1表示本次的缩放比例除以上一次的缩放比例,表示当前的缩放比例 // 左侧卷去的宽度在第二次缩放时也会跟着缩放,所以左侧的宽度需要乘以缩放比例 // 鼠标位置距离时序图左侧的宽度在缩放时也会跟着缩放,所以也要乘以缩放比例 // 最后面减去鼠标位置距离时序图左侧的实际距离就等于缩放时左侧卷去的长度 // 页面代码 time_box_parent.scrollLeft = (time_box_parent.scrollLeft + e.clientX - tree_box_dom.offsetWidth) * (scale_x / scale_x1) - e.clientX + tree_box_dom.offsetWidth;
使用连线表示任务之间的关系
方案:
- 采用的时css3 + js + html5,用伪元素绘制。
- 用dom包裹直角图片,设置其位置及高度。
- 用标签绘制
优缺点:
- 优点:不会增加多余的标签,对渲染有利。缺点:父任务产生了多个子任务,不好添加伪类及设置伪类的高度及宽度。
- 优点:方便,只要计算子任务距父任务的高度即可。缺点:任务过多时图片会非常多,很影响性能
- 优点:单独控制每个元素的高度及位置,可控性高,可添加反馈色。缺点:添加了较多的元素,对渲染产生影响(本人使用的是第三种,这是一个笨方法,有更好方法的大佬,可以提供建议,多谢)
实现思路:
用一个变量记录每个任务的层级深度,层级深都以当前任务的父任务为起点,就是说是从哪个任务产生的当前任务,同级的子任务进行累加操作。用累加的变量按照一定的比例获取垂直连线的高度以及水平连线的top值,水平连线的长度由任务的创建时间和开始时间决定。(使用上面的宽度百分比函数)
时间单位:天、时、分、秒
这个比较简单,实现思路:
因为本demo的时间4刻度是个刻度,判断最小时间戳与最大时间戳之间的差除以4,是否还有一天的时间(60 * 60 * 24,换算成秒),从大到小的降序获取时间单位。
总结
以上所述是小编给大家介绍的原生 JS+CSS+HTML 实现时序图的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
相关内容
- Canvas图片分割效果的实现基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能利用canvas实现图片下载功能来实现浏览器兼容问题canvas压缩图片以及卡片制作的方法示例Canvas实现保存图片到本地的示例代码html2canvas 将html代码转为图片的使用方法详解canvas绘图时遇到的跨域问题canvas 下载二维码和图片加水印的方法在canvas上实现元素图片镜像翻转动画效果的方法
- HTML5中的Web Notification桌面通知功能的实现方法Html5中的桌面通知Notification的实现HTML5实现桌面通知 提示功能HTML5实现Notification API桌面通知功能 html5桌面通知(Web Notifications)实例解析突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面
- html5视频媒体标签video的使用方法及完整参数说明详解html5用video标签流式加载的实现Html5 video标签视频的最佳实践html5自定义video标签的海报与播放按钮功能详解Html5中video标签那些属性和方法解决html5中的video标签ios系统中无法播放使用的问题
- Html5实现首页动态视频背景的示例代码html5视频媒体标签video的使用方法及完整参数说明详解HTML5实现视频弹幕功能HTML5 视频播放(video),JavaScript控制视频的实例代码HTML5视频播放插件 video.js介绍 HTML5自定义视频播放器源码
- HTML5自定义元素播放焦点图动画的实现HTML5语义化元素你真的用对了吗Html5新增标签与样式及让元素水平垂直居中浅谈HTML5中dialog元素尝鲜HTML5 source标签:媒介元素定义媒介资源HTML5新表单元素_动力节点Java学院整理 html5文本内容_动力节点Java学院整理 html5 input元素新特性_动力节点Java学院整理详解HTML5表单新增属性Html5元素及基本语法详解html5表单及新增的改良元素详解
- 使用Html5中的cavas画一面国旗HTML5 Canvas 破碎重组的视频特效的示例代码前端实现打印图像功能html5 canvas绘制网络字体的常用方法导出HTML5 Canvas图片并上传服务器功能
- 关于canvas绘制模糊问题的解决方法高清屏中使用Canvas绘图出现模糊的问题及解决方法深入了解canvas在移动端绘制模糊的问题解决HTML5 Canvas图像模糊完美解决办法html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
- html svg生成环形进度条的实现方法HTML5超炫酷粒子效果的进度条的实现示例HTML5触摸事件实现移动端简易进度条的实现方法HTML5实现自带进度条和滑块滑杆效果网页加载进度条详解(推荐)HTML页面缩小后显示滚动条的示例代码
- html2 canvas生成清晰的图片实现打印功能html2canvas生成的图片偏移不完整的解决方法html2canvas截图空白问题的解决使用html2canvas实现将html内容写入到canvas中生成图片html2canvas.js 实现页面截图html2 canvas svg不能识别的解决方案
- 将SVG图引入到HTML页面的实现HTML5如何使用SVG的方法示例Html5之svg可缩放矢量图形_动力节点Java学院整理使用HTML5进行SVG矢量图形绘制的入门教程深入浅析HTML5中的SVGhtml5+svg学习指南之SVG基础知识html5中svg canvas和图片之间相互转化思路代码HTML中使用SVG与SVG预定义形状元素介绍
