「实战应用」如何用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,

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

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

相关推荐
染指11102 小时前
103.RAG-LLamaIndex后端rag问答-聊天接口
前端·javascript·vue.js·人工智能
单线程_0110 小时前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
小磊哥er12 小时前
深入解构Claude Code - 第 8 篇 · 数据放哪、钱怎么算
javascript·ai编程
kyriewen14 小时前
我装了30多个Skill,给AI安排了8个岗位
前端·javascript·ai编程
默_笙16 小时前
🔥 让 AI 帮我写完整个 Next.js 博客:框架就是 AI 的"上下文 buff"
前端·javascript
喵本喵叁肆19 小时前
06-M6-部门过滤与综合研判-从问答机到研判助手
前端·javascript·jquery
এ慕ོ冬℘゜19 小时前
JavaScript学习心得:从只会语法,到真正会写业务逻辑
开发语言·javascript·ecmascript
এ慕ོ冬℘゜20 小时前
jQuery 核心方法
前端·javascript·jquery
阳火锅20 小时前
老板要周报?我说不用,代码提交就是进度
前端·javascript·vue.js