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

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

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

相关推荐
真滴book理喻1 小时前
Vue(四)
前端·javascript·vue.js
程序员_三木2 小时前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
开心工作室_kaic3 小时前
springboot476基于vue篮球联盟管理系统(论文+源码)_kaic
前端·javascript·vue.js
川石教育3 小时前
Vue前端开发-缓存优化
前端·javascript·vue.js·缓存·前端框架·vue·数据缓存
搏博3 小时前
使用Vue创建前后端分离项目的过程(前端部分)
前端·javascript·vue.js
温轻舟3 小时前
前端开发 之 12个鼠标交互特效上【附完整源码】
开发语言·前端·javascript·css·html·交互·温轻舟
web135085886354 小时前
2024-05-18 前端模块化开发——ESModule模块化
开发语言·前端·javascript
LCG元5 小时前
javascript页面设计案例【使用HTML、CSS和JavaScript创建一个基本的互动网页】
javascript
技术程序猿华锋5 小时前
Gemini 2.0 Flash 体验版实测:日常视觉识别的最佳选择,关键在于其API Key现在是免费调用
开发语言·javascript·ecmascript·googlecloud·gemini
TttHhhYy5 小时前
uniapp+vue开发app,蓝牙连接,蓝牙接收文件保存到手机特定文件夹,从手机特定目录(可自定义),读取文件内容,这篇首先说如何读取,手机目录如何寻找
开发语言·前端·javascript·vue.js·uni-app