基于JS实现时序图的思路有哪些,有什么优缺点
Admin 2022-07-18 群英技术资讯 1479 次浏览
在实际应用中,我们有时候会遇到“基于JS实现时序图的思路有哪些,有什么优缺点”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“基于JS实现时序图的思路有哪些,有什么优缺点”文章能帮助大家解决问题。之前本人使用React + AntDesign 实现了一个简单的时序图,但是后来有了更复杂的需求,并且要求同时展示2000个任务的展示,这就涉及到了性能问题,本人先使用React+antd+ts实现了一个基本满足下面需求的demo,但是react的渲染机制造成了较大的性能问题,利用chrome自带的Performance,测试发现demo的首次渲染高达10s以上,并且后续的操作也会使整个页面非常卡。经过思索后决定使用原声js+css+html去实现,因为原声js下性能是最优的。下面先来说说新版本的需求:
效果图
图一:

图二:

实现难点
鼠标缩放,x轴的缩放方式
鼠标缩放产生时序图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;
使用连线表示任务之间的关系
方案:
优缺点:
实现思路:
用一个变量记录每个任务的层级深度,层级深都以当前任务的父任务为起点,就是说是从哪个任务产生的当前任务,同级的子任务进行累加操作。用累加的变量按照一定的比例获取垂直连线的高度以及水平连线的top值,水平连线的长度由任务的创建时间和开始时间决定。(使用上面的宽度百分比函数)
时间单位:天、时、分、秒
这个比较简单,实现思路:
因为本demo的时间4刻度是个刻度,判断最小时间戳与最大时间戳之间的差除以4,是否还有一天的时间(60 * 60 * 24,换算成秒),从大到小的降序获取时间单位。
总结
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
css选中标签的方法:1、利用id选择器,语法为“#id名{css代码;}”;2、利用类选择器,语法为“.类名{css代码;}”;3、利用标签选择器,语法为“标签名{css代码;}”;4、利用通配符选择器,语法为“*{css代码;}”。
在编写CSS过程中,想必有不少朋友遇到过设置背景图片模糊的问题,面对这个问题,需要用怎么样的解决办法比较好?下文的讲解详细,步骤过程清晰,对大家进一步学习和理解相关知识有一定的帮助。有这方面学习需要的朋友就继续往下看吧!
这篇文章主要介绍了详解CSS Sprite雪碧图的应用,CSS雪碧图该方法是将多个小图标和背景图像合并到一张图片上,非常具有实用价值,需要的朋友可以参考下
本篇文章主要的介绍了关于html5 frameset标签的替代方案实例解析,还有关于html5 frameset标签的两个解决办法,现在让我们一起来看这篇文章吧
webpack打包出现图片不显示怎样办?一些朋友有遇到webpack打包后,图片路径不错不显示图片的情况,那么这时我们该怎样解决呢?下面我们一起来了解看看。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008