「实战应用」如何用DHTMLX构建自定义JavaScript甘特图(一)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。

当您声称您的产品具有高级定制功能时,客户一定会对产品进行严格测试,这个规则当然适用于DHTMLX Gantt,官方技术团队收到了很多关于如何在JavaScript甘特图组件中实现某些外观定制的请求,结合实际的案例,我们将在本文中为您展示如何在实践中实现这些定制。

DHTMLX Gantt v8.0正式版下载

用例:带有自定义项目任务、资源、图标等的JavaScript甘特图

DHTMLX Gantt附带了一个全面的API,使您能够根据自己的喜好调整JavaScript组件的默认视图,并根据时间轴调整任何HTML元素,如下面的例子所示:

这个JavaScript甘特图包含许多自定义的DHTMLX Gantt,在这里我们更改了项目任务的外观,在网格和时间轴中指定了资源,增加了在任务栏中显示任务名称和资源图像的功能,突出显示了属于特定项目的周末和常规任务,并在任务顶部放置了自定义图标。

这样的自定义将使最终用户更容易管理工作流并跟踪资源分布,让我们为您提供有关如何将这些特性添加到甘特项目中的更多细节。

带有自定义括号的项目任务栏

在甘特图中,用特殊括号(三角形)显示项目可能很有用,括号(三角形)指示项目的开始和结束日期。默认情况下,DHTMLX Gantt将所有任务(包括项目)显示为矩形,并且没有这样的内置功能来强调项目任务中的时间框架。但是DHTMLX Gantt丰富API允许您将这些元素添加到web项目中。

例如它可以通过gantt.config.type_renderers完成,使用此配置,您可以完全重新定义任务的外观。这个选项提供了大量的定制机会,但也带来了一些不便。问题是,当创建自定义元素时,您必须手动添加具有特定类和属性的html元素,或者为某些现有的甘特图功能(如添加依赖项或进度条的处理程序)添加事件处理程序,否则它们将无法工作。

不过别担心,还有另外两种方法可以解决这个问题。第一个是使用一个额外的层,允许在甘特图时间轴上显示任何HTML元素。

添加自定义括号的另一种更方便的方法是应用CSS,可以使用::before和::after伪元素。

它们将有以下常见的样式:

css 复制代码
.gantt_project::before,
.gantt_project::after {
content: "";
position: absolute;
top: 100%;
background-color: transparent;
border-style: solid;
}

自定义括号是用border属性绘制的,但您需要在样式规则中添加border-width参数:

css 复制代码
.gantt_project::before {
left: -1px;
border-width: 0px 0px var(--gantt-bracket-height) var(--gantt-bracket-width);
}

.gantt_project::after {
right: 0px;
border-width: 0px var(--gantt-bracket-width) var(--gantt-bracket-height) 0px;
}

由于每个项目都有不同的颜色,因此您需要根据项目颜色生成样式。为此迭代每个任务,看看它是否是一个项目,并具有颜色参数。如果是这样,您应该给::before和::after伪元素添加样式,类的名称将是以下组合:" task + task ID "。

javascript 复制代码
const dynamicStyle = document.createElement('style');
gantt.eachTask(function (task) {
if (task.type == gantt.config.types.project && task.color) {
dynamicStyle.innerHTML += `
.task_${task.id}.gantt_project::before{
border-color: transparent transparent transparent ${task.color};
}

.task_${task.id}.gantt_project::after {
border-color: transparent ${task.color} transparent transparent;
}
`;
}
})
document.body.appendChild(dynamicStyle);

还需要应用task_class模板来返回自定义类,其中需要检查任务类型。如果它是一个项目类型,将classic_project添加到变量中。另外检查任务是否具有color属性,如果具有,则向变量添加task +任务ID。之后,您应该返回一个包含所有自定义类名的变量。

javascript 复制代码
gantt.templates.task_class = function (start, end, task) {
if (task.type == gantt.config.types.project) {
let css = "classic_project";
if (task.color) {
css += ` task_${task.id}`;
}
return css;
}
}

要使一切顺利进行还有一个条件,它是项目元素的高度。默认情况下,任务栏可以拉伸到几乎整个可用行的高度,这意味着您需要降低任务栏的高度以显示项目栏中的角,您可以使用应该为项目指定的bar_height参数来做到这一点。

css 复制代码
"row_height": 40,
"bar_height": 20,

请注意,如果不这样做,项目任务中的括号将扩展到任务边界之外,并将显示在下一行。

由于篇幅有限,下期继续讲解,请持续关注查看最新产品资讯哦~

相关推荐
前端拾光者33 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
木子02041 小时前
前端VUE项目启动方式
前端·javascript·vue.js
endingCode2 小时前
45.坑王驾到第九期:Mac安装typescript后tsc命令无效的问题
javascript·macos·typescript
Myli_ing3 小时前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html
I_Am_Me_3 小时前
【JavaEE进阶】 JavaScript
开发语言·javascript·ecmascript
℘团子এ3 小时前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
学习前端的小z3 小时前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
前端百草阁4 小时前
【TS简单上手,快速入门教程】————适合零基础
javascript·typescript
彭世瑜4 小时前
ts: TypeScript跳过检查/忽略类型检查
前端·javascript·typescript
Backstroke fish4 小时前
Token刷新机制
前端·javascript·vue.js·typescript·vue