当前位置:首页 > JavaScript

js实现甘特图

2026-01-30 21:01:26JavaScript

使用开源库实现甘特图

推荐使用 dhtmlxGanttfrappe-gantt 这两个成熟的 JavaScript 库来实现甘特图功能。dhtmlxGantt 功能全面但需要商业授权,frappe-gantt 是 MIT 开源项目适合基础需求。

安装 frappe-gantt

npm install frappe-gantt

基础实现代码:

import Gantt from 'frappe-gantt';

const tasks = [
  {
    id: 'Task 1',
    name: '需求分析',
    start: '2023-01-01',
    end: '2023-01-05',
    progress: 50
  },
  {
    id: 'Task 2',
    name: 'UI设计',
    start: '2023-01-06',
    end: '2023-01-15',
    progress: 20,
    dependencies: 'Task 1'
  }
];

const gantt = new Gantt('#gantt-container', tasks, {
  view_mode: 'Week',
  date_format: 'YYYY-MM-DD'
});

自定义 SVG 甘特图

通过原生 SVG 和 JavaScript 手动构建甘特图:

js实现甘特图

function createGantt(containerId, tasks) {
  const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
  svg.setAttribute('width', '100%');
  svg.setAttribute('height', tasks.length * 50 + 50);

  // 时间轴绘制逻辑
  // 任务条绘制逻辑
  tasks.forEach((task, i) => {
    const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
    rect.setAttribute('x', calculateXPosition(task.start));
    rect.setAttribute('y', i * 50 + 30);
    rect.setAttribute('width', calculateWidth(task.start, task.end));
    rect.setAttribute('height', '30');
    svg.appendChild(rect);
  });

  document.getElementById(containerId).appendChild(svg);
}

使用 Canvas 绘制

通过 Canvas API 实现高性能甘特图渲染:

class GanttChart {
  constructor(canvasId, tasks) {
    this.canvas = document.getElementById(canvasId);
    this.ctx = this.canvas.getContext('2d');
    this.tasks = tasks;
    this.render();
  }

  render() {
    this.clearCanvas();
    this.drawTimeScale();
    this.drawTasks();
  }

  drawTasks() {
    this.tasks.forEach((task, i) => {
      const x = this.timeToPixel(task.start);
      const width = this.timeToPixel(task.end) - x;

      this.ctx.fillStyle = '#4CAF50';
      this.ctx.fillRect(x, i * 40 + 30, width, 30);
    });
  }
}

关键功能实现

时间计算处理

js实现甘特图

function parseDate(dateStr) {
  return new Date(dateStr + 'T00:00:00');
}

function dayDiff(start, end) {
  return (parseDate(end) - parseDate(start)) / (1000 * 60 * 60 * 24);
}

依赖关系连线

function drawDependencies() {
  tasks.forEach(task => {
    if(task.dependencies) {
      const fromTask = tasks.find(t => t.id === task.dependencies);
      // 绘制连接线逻辑
    }
  });
}

交互功能增强

添加事件监听实现交互:

ganttChart.canvas.addEventListener('click', (e) => {
  const rect = ganttChart.canvas.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;

  // 检测点击的任务项
  ganttChart.tasks.forEach(task => {
    if(isInTaskArea(x, y, task)) {
      showTaskDetails(task);
    }
  });
});

响应式设计

添加窗口大小监听:

window.addEventListener('resize', () => {
  ganttChart.adjustSize();
  ganttChart.render();
});

以上方案可根据项目需求选择,开源库方案适合快速实现,自定义方案适合需要深度定制的场景。实际开发中建议优先考虑成熟库方案,可节省约70%的开发时间。

标签: 甘特图js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…