不推荐用 <table> 标签制作甘特图,因其本质是行列数据结构,无法准确建模时间轴,导致时间对齐错乱、列宽失衡、跨天计算不准、粒度切换需重写HTML;推荐CSS Grid实现静态展示,或echarts等专业库支持动态交互。

直接用 <table> 标签制作项目进度甘特图,不推荐,且实际不可靠。它看起来能“画出条形”,但本质是数据表格,不是时间坐标系统——时间对齐会错、列宽会乱、跨天任务算不准、换粒度(如日→周)就得重写整个 HTML,维护成本高、语义错误、响应式几乎失效。
Html2md
使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...
下载
真正可用的方案分两类:轻量静态展示用 CSS Grid,动态交互用专业库(如 echarts 或 dhtmlxGantt)。下面说清楚怎么做:
为什么 `
` 不适合做甘特图表格的 `
` 和 ` |
` 是为行列数据设计的,不是为时间轴建模。硬塞日期进列头会立刻遇到问题:
- 任务名长度不同 → 列宽被撑开 → 时间槽宽度不一致 → 条形图左右偏移
- “2026-07-10 到 2026-07-15”共6天,但 `colspan="6"` 写死后,一旦起始日变动或时区偏差,就全错位
- 想从“按日”切换成“按周”,`` 里所有 `
` 和所有 `colspan` 都得手动重算重写- 浏览器把 `
| 7月10日 | ` 当文本渲染,无法表达“这个单元格代表 24 小时区间”的语义
CSS Grid 是更稳的原生解法
用 Grid 模拟时间轴,结构清晰、可计算、易响应:
立即学习“前端免费学习笔记(深入)”;
- 定义时间槽:`grid-template-columns: repeat(30, minmax(120px, 1fr))` 表示连续 30 天,每列最小 120px
- 每个任务条用 `grid-column: 5 / 12` 表示从第 5 列开始、到第 12 列前结束(占 7 天)
- 列号必须由 JS 计算:统一用 `new Date('2026-07-10').getTime()` 转毫秒,再减去基准日毫秒数,除以 86400000 得天数,取整后加偏移
- 内容过长?加 `white-space: nowrap; overflow: hidden; text-overflow: ellipsis` 控制标题,避免撑列
如果非要显示“表格感”,可用语义化替代结构
保留可读性,又不牺牲时间精度:
- 左侧任务列表用 `
` 或 ``,配合 `- `(任务名)、`
- `(描述),语义正确
- 顶部时间刻度用 `` 包裹,既可读又可被 JS 解析
- 条形区域用 `
` 放在 Grid 容器内,不依赖 ` ` 嵌套- 里程碑用绝对定位 + `::before/::after` 画菱形,`left` 值由 JS 算出(如 `(targetDate - baseDate) / 86400000 * pxPerDay`)
动态场景直接上成熟库
需要拖拽、缩放、资源视图或实时更新,别自己封装:
-
echarts:传 `{ value: [startMs, endMs] }`,xAxis 设为 `'time'`,自动对齐毫秒时间戳
-
dhtmlxGantt:支持资源模式、依赖线、滚动加载,初始化时必须先 `gantt.config.resources = true` 再 `init()`
-
gantt-elastic:轻量,任务对象中 `start/end` 接收 ISO 字符串(如 `"2026-07-15T00:00:00"`),类型错则静默失败
不复杂但容易忽略:所有方案的前提,是统一用毫秒时间戳或标准 ISO 字符串处理日期,避开浏览器对 "2026/7/10" 或 "2026-07-10" 的解析差异。
|
|
|