当前位置:首页 > 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 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previ…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…