当前位置:首页 > JavaScript

js如何实现甘特图

2026-03-15 23:24:54JavaScript

实现甘特图的 JavaScript 方法

使用现成库(推荐)

1. 使用 dhtmlxGantt
安装库:

npm install dhtmlx-gantt

基础实现代码:

import { gantt } from "dhtmlx-gantt";
import "dhtmlx-gantt/codebase/dhtmlxgantt.css";

gantt.init(document.getElementById("gantt_container"));
gantt.parse({
    data: [
        { id: 1, text: "Task 1", start_date: "2023-10-01", duration: 5 },
        { id: 2, text: "Task 2", start_date: "2023-10-06", duration: 3 }
    ]
});

2. 使用 Chart.js 插件
通过 chartjs-plugin-gantt 扩展:

import { Chart } from "chart.js";
import Gantt from "chartjs-plugin-gantt";

Chart.register(Gantt);
const ctx = document.getElementById("ganttChart").getContext("2d");
new Chart(ctx, {
    type: "gantt",
    data: {
        datasets: [{
            label: "Project Plan",
            data: [
                { x: "Phase 1", y: [new Date("2023-10-01"), new Date("2023-10-05")] }
            ]
        }]
    }
});

原生 Canvas 绘制

通过 Canvas API 手动实现基础甘特图:

const canvas = document.getElementById("ganttCanvas");
const ctx = canvas.getContext("2d");

function drawGantt(tasks) {
    tasks.forEach((task, i) => {
        const y = i * 30 + 20;
        ctx.fillStyle = "#4CAF50";
        ctx.fillRect(50, y, task.duration * 10, 20);
        ctx.fillText(task.name, 10, y + 15);
    });
}

drawGantt([
    { name: "Task A", duration: 5 },
    { name: "Task B", duration: 3 }
]);

SVG 动态生成

利用 SVG 实现可交互甘特图:

js如何实现甘特图

const svg = document.getElementById("ganttSvg");
function createBar(task) {
    const bar = document.createElementNS("http://www.w3.org/2000/svg", "rect");
    bar.setAttribute("x", task.startDay * 10);
    bar.setAttribute("y", task.id * 30);
    bar.setAttribute("width", task.duration * 10);
    bar.setAttribute("height", 20);
    bar.setAttribute("fill", "#2196F3");
    svg.appendChild(bar);
}

createBar({ id: 1, startDay: 2, duration: 4 });

关键注意事项

  • 时间轴处理:日期需转换为数值或时间戳便于计算坐标。
  • 响应式设计:监听窗口变化并调用 gantt.resize() 或重绘 Canvas。
  • 数据格式:标准结构需包含 id/text/start_date/duration/progress 等字段。

扩展功能

  • 依赖关系:通过 gantt.addLink() 添加任务连线。
  • 动态加载:结合 Ajax 从后端获取任务数据。
  • 自定义样式:修改 CSS 或覆盖库的默认样式类。

以上方法可根据项目复杂度选择,库方案适合快速开发,原生方案适合高度定制需求。

分享给朋友:

相关文章

vue如何实现单选

vue如何实现单选

Vue 实现单选的方法 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-model 绑定单选按钮 通过 v-model 绑定到同一个变量,确保同一时间只有一个选…

vue自动登录如何实现

vue自动登录如何实现

实现自动登录的基本思路 自动登录通常通过结合本地存储(如localStorage或cookie)和token验证机制实现。用户首次登录成功后,服务器返回的认证token会被保存在客户端,下次打开应用时…

vue如何实现分离

vue如何实现分离

Vue 实现代码分离的方法 Vue 提供了多种方式实现代码分离,提升项目的可维护性和模块化程度。以下是常见的几种方法: 组件化开发 将功能拆分为独立的 Vue 组件,每个组件包含自己的模板、逻辑和样…

vue 实现拖拽甘特图

vue 实现拖拽甘特图

实现拖拽甘特图的核心思路 Vue 实现拖拽甘特图需要结合第三方库或自定义逻辑,核心功能包括任务条渲染、时间轴刻度、拖拽交互、数据绑定等。以下是具体实现方法: 使用第三方库(推荐) vue-gantt…

react如何实现分页

react如何实现分页

实现分页的基本思路 在React中实现分页通常需要以下几个核心步骤:管理当前页码状态、计算分页数据、渲染分页控件。以下是一个典型的分页实现方法。 管理分页状态 使用React的useState钩子来…

Java如何实现异步处理

Java如何实现异步处理

Java实现异步处理的常见方法 使用CompletableFuture CompletableFuture是Java 8引入的异步编程工具,支持链式调用和组合操作。 CompletableFutur…