当前位置:首页 > JavaScript

js如何实现甘特图

2026-02-02 22:58:55JavaScript

使用原生JavaScript实现甘特图

通过Canvas或SVG绘制基础甘特图结构,动态生成任务条和时间轴。需手动计算坐标和交互逻辑,适合轻量级需求。

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

function drawGantt(tasks) {
  // 绘制时间轴
  ctx.fillStyle = '#333';
  ctx.fillRect(0, 30, canvas.width, 2);

  tasks.forEach((task, i) => {
    // 计算任务条位置
    const x = task.start * 10;
    const width = (task.end - task.start) * 10;

    // 绘制任务条
    ctx.fillStyle = '#4285F4';
    ctx.fillRect(x, 50 + i * 30, width, 20);

    // 添加任务标签
    ctx.fillStyle = '#000';
    ctx.fillText(task.name, x + 5, 65 + i * 30);
  });
}

使用Chart.js库实现

Chart.js通过扩展图表类型支持甘特图,需配置时间轴和水平条形图。

import { Chart } from 'chart.js';

new Chart(ctx, {
  type: 'horizontalBar',
  data: {
    labels: ['Task A', 'Task B'],
    datasets: [{
      data: [
        { x: new Date('2023-01-01'), y: 0, x2: new Date('2023-01-05') },
        { x: new Date('2023-01-03'), y: 1, x2: new Date('2023-01-08') }
      ],
      backgroundColor: ['#FF6384', '#36A2EB']
    }]
  },
  options: {
    scales: {
      xAxes: [{
        type: 'time',
        position: 'bottom'
      }]
    }
  }
});

使用专业甘特图库

Frappe Gantt等专业库提供完整功能:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/frappe-gantt@0.6.1/dist/frappe-gantt.min.css">
<script src="https://cdn.jsdelivr.net/npm/frappe-gantt@0.6.1/dist/frappe-gantt.min.js"></script>

<div id="gantt-container"></div>
<script>
  const tasks = [
    { id: 'Task1', name: 'Design', start: '2023-01-01', end: '2023-01-05' },
    { id: 'Task2', name: 'Development', start: '2023-01-03', end: '2023-01-10' }
  ];
  new Gantt("#gantt-container", tasks);
</script>

关键实现要素

时间轴处理需使用Date对象或时间戳,建议使用moment.js或date-fns进行日期计算。

任务依赖关系可通过连线或箭头表示,需计算任务间的逻辑关系坐标。

交互功能包括拖拽调整任务时间、点击查看详情等,需监听鼠标事件并更新DOM。

数据格式建议

标准化任务数据结构便于渲染:

{
  id: 'unique_id',
  name: 'Task Name',
  start: 'YYYY-MM-DD',
  end: 'YYYY-MM-DD',
  progress: 50,  // 可选
  dependencies: ['task_id']  // 可选
}

样式定制技巧

使用CSS变量实现主题切换:

.gantt-task {
  --task-color: #4e73df;
  background: var(--task-color);
  border-radius: 3px;
}

响应式布局需监听resize事件并重新计算画布尺寸:

js如何实现甘特图

window.addEventListener('resize', debounce(resizeGantt, 200));

分享给朋友:

相关文章

java如何实现多态

java如何实现多态

多态的概念 多态是面向对象编程的三大特性之一(封装、继承、多态),指同一操作作用于不同对象时,可以产生不同的行为。Java中主要通过方法重写(Override)和接口/抽象类实现多态。 实现多态的三…

h5页面如何实现

h5页面如何实现

实现H5页面的方法 H5页面是基于HTML5技术的网页,通常用于移动端和响应式设计。以下是实现H5页面的关键步骤和技术要点。 基础结构 使用HTML5的DOCTYPE声明作为页面的起始。HTML5简…

vue如何实现select

vue如何实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过原生 HTML <select> 元素或使用第三方 UI 库(如 Element UI、Ant Des…

如何实现vue验证

如何实现vue验证

Vue 表单验证的实现方法 Vue 表单验证可以通过多种方式实现,包括内置指令、第三方库和自定义验证逻辑。以下是几种常见的方法: 使用 Vue 内置指令进行基础验证 Vue 提供了 v-model…

react如何实现keepalive

react如何实现keepalive

React 实现 KeepAlive 的方法 React 本身没有内置的 KeepAlive 组件,但可以通过以下方式模拟类似功能,实现组件状态保持或避免重复渲染。 使用 CSS 隐藏组件 通过 C…

vue如何实现刷新

vue如何实现刷新

实现页面刷新的方法 在Vue中实现刷新功能可以通过以下几种方式实现: 使用location.reload() 直接调用浏览器的原生方法强制刷新整个页面: methods: { refreshP…