当前位置:首页 > 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事件并重新计算画布尺寸:

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

js如何实现甘特图

分享给朋友:

相关文章

权限管理vue如何实现

权限管理vue如何实现

权限管理在 Vue 中的实现方法 基于路由的权限控制 通过 Vue Router 的全局前置守卫 beforeEach 实现路由拦截,结合用户角色或权限列表动态过滤可访问路由。示例代码: rou…

vue如何实现登录

vue如何实现登录

实现登录功能的基本步骤 使用Vue实现登录功能通常需要结合后端API、状态管理以及路由控制。以下是常见的实现方式: 创建登录表单组件 在Vue组件中构建包含用户名和密码输入框的表单: <te…

js如何实现继承

js如何实现继承

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

vue如何实现拖动

vue如何实现拖动

Vue 实现拖动的常用方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖动功能。 <template>…

react如何实现插槽

react如何实现插槽

React 实现插槽的方法 React 本身没有直接提供类似 Vue 的插槽(slot)概念,但可以通过以下几种方式实现类似功能: 使用 props.children React 组件可以通过 p…

react如何实现混入

react如何实现混入

在React中实现混入(Mixin)功能可以通过以下几种方式实现,React官方已不推荐使用传统的React.createClass混入方式,但可通过高阶组件或自定义Hook替代。 高阶组件(HO…