Mermaid画甘特图

文章目录

甘特图

甘特图从外观来看,是一种水平条形图,其横轴表示时间,纵轴表示任务,从而直观展示项目进度计划。简单示例如下
#mermaid-svg-t5f5AXFpTQu0uJDW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-t5f5AXFpTQu0uJDW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-t5f5AXFpTQu0uJDW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-t5f5AXFpTQu0uJDW .error-icon{fill:#552222;}#mermaid-svg-t5f5AXFpTQu0uJDW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-t5f5AXFpTQu0uJDW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-t5f5AXFpTQu0uJDW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-t5f5AXFpTQu0uJDW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-t5f5AXFpTQu0uJDW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-t5f5AXFpTQu0uJDW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-t5f5AXFpTQu0uJDW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-t5f5AXFpTQu0uJDW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-t5f5AXFpTQu0uJDW .marker.cross{stroke:#333333;}#mermaid-svg-t5f5AXFpTQu0uJDW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-t5f5AXFpTQu0uJDW p{margin:0;}#mermaid-svg-t5f5AXFpTQu0uJDW .mermaid-main-font{font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-t5f5AXFpTQu0uJDW .exclude-range{fill:#eeeeee;}#mermaid-svg-t5f5AXFpTQu0uJDW .section{stroke:none;opacity:0.2;}#mermaid-svg-t5f5AXFpTQu0uJDW .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-t5f5AXFpTQu0uJDW .section2{fill:#fff400;}#mermaid-svg-t5f5AXFpTQu0uJDW .section1,#mermaid-svg-t5f5AXFpTQu0uJDW .section3{fill:white;opacity:0.2;}#mermaid-svg-t5f5AXFpTQu0uJDW .sectionTitle0{fill:#333;}#mermaid-svg-t5f5AXFpTQu0uJDW .sectionTitle1{fill:#333;}#mermaid-svg-t5f5AXFpTQu0uJDW .sectionTitle2{fill:#333;}#mermaid-svg-t5f5AXFpTQu0uJDW .sectionTitle3{fill:#333;}#mermaid-svg-t5f5AXFpTQu0uJDW .sectionTitle{text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-t5f5AXFpTQu0uJDW .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-t5f5AXFpTQu0uJDW .grid .tick text{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-t5f5AXFpTQu0uJDW .grid path{stroke-width:0;}#mermaid-svg-t5f5AXFpTQu0uJDW .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-t5f5AXFpTQu0uJDW .task{stroke-width:2;}#mermaid-svg-t5f5AXFpTQu0uJDW .taskText{text-anchor:middle;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-t5f5AXFpTQu0uJDW .taskTextOutsideRight{fill:black;text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-t5f5AXFpTQu0uJDW .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-t5f5AXFpTQu0uJDW .task.clickable{cursor:pointer;}#mermaid-svg-t5f5AXFpTQu0uJDW .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-t5f5AXFpTQu0uJDW .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-t5f5AXFpTQu0uJDW .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-t5f5AXFpTQu0uJDW .taskText0,#mermaid-svg-t5f5AXFpTQu0uJDW .taskText1,#mermaid-svg-t5f5AXFpTQu0uJDW .taskText2,#mermaid-svg-t5f5AXFpTQu0uJDW .taskText3{fill:white;}#mermaid-svg-t5f5AXFpTQu0uJDW .task0,#mermaid-svg-t5f5AXFpTQu0uJDW .task1,#mermaid-svg-t5f5AXFpTQu0uJDW .task2,#mermaid-svg-t5f5AXFpTQu0uJDW .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-t5f5AXFpTQu0uJDW .taskTextOutside0,#mermaid-svg-t5f5AXFpTQu0uJDW .taskTextOutside2{fill:black;}#mermaid-svg-t5f5AXFpTQu0uJDW .taskTextOutside1,#mermaid-svg-t5f5AXFpTQu0uJDW .taskTextOutside3{fill:black;}#mermaid-svg-t5f5AXFpTQu0uJDW .active0,#mermaid-svg-t5f5AXFpTQu0uJDW .active1,#mermaid-svg-t5f5AXFpTQu0uJDW .active2,#mermaid-svg-t5f5AXFpTQu0uJDW .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-t5f5AXFpTQu0uJDW .activeText0,#mermaid-svg-t5f5AXFpTQu0uJDW .activeText1,#mermaid-svg-t5f5AXFpTQu0uJDW .activeText2,#mermaid-svg-t5f5AXFpTQu0uJDW .activeText3{fill:black!important;}#mermaid-svg-t5f5AXFpTQu0uJDW .done0,#mermaid-svg-t5f5AXFpTQu0uJDW .done1,#mermaid-svg-t5f5AXFpTQu0uJDW .done2,#mermaid-svg-t5f5AXFpTQu0uJDW .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-t5f5AXFpTQu0uJDW .doneText0,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText1,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText2,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText3{fill:black!important;}#mermaid-svg-t5f5AXFpTQu0uJDW .doneText0.taskTextOutsideLeft,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText0.taskTextOutsideRight,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText1.taskTextOutsideLeft,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText1.taskTextOutsideRight,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText2.taskTextOutsideLeft,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText2.taskTextOutsideRight,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText3.taskTextOutsideLeft,#mermaid-svg-t5f5AXFpTQu0uJDW .doneText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-t5f5AXFpTQu0uJDW .crit0,#mermaid-svg-t5f5AXFpTQu0uJDW .crit1,#mermaid-svg-t5f5AXFpTQu0uJDW .crit2,#mermaid-svg-t5f5AXFpTQu0uJDW .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-t5f5AXFpTQu0uJDW .activeCrit0,#mermaid-svg-t5f5AXFpTQu0uJDW .activeCrit1,#mermaid-svg-t5f5AXFpTQu0uJDW .activeCrit2,#mermaid-svg-t5f5AXFpTQu0uJDW .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-t5f5AXFpTQu0uJDW .doneCrit0,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCrit1,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCrit2,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-t5f5AXFpTQu0uJDW .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-t5f5AXFpTQu0uJDW .milestoneText{font-style:italic;}#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText0,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText1,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText2,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText3{fill:black!important;}#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText0.taskTextOutsideLeft,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText0.taskTextOutsideRight,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText1.taskTextOutsideLeft,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText1.taskTextOutsideRight,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText2.taskTextOutsideLeft,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText2.taskTextOutsideRight,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText3.taskTextOutsideLeft,#mermaid-svg-t5f5AXFpTQu0uJDW .doneCritText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-t5f5AXFpTQu0uJDW .vert{stroke:navy;}#mermaid-svg-t5f5AXFpTQu0uJDW .vertText{font-size:15px;text-anchor:middle;fill:navy!important;}#mermaid-svg-t5f5AXFpTQu0uJDW .activeCritText0,#mermaid-svg-t5f5AXFpTQu0uJDW .activeCritText1,#mermaid-svg-t5f5AXFpTQu0uJDW .activeCritText2,#mermaid-svg-t5f5AXFpTQu0uJDW .activeCritText3{fill:black!important;}#mermaid-svg-t5f5AXFpTQu0uJDW .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-t5f5AXFpTQu0uJDW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 08-20 08-21 08-22 08-23 08-24 08-25 08-26 08-27 08-28 08-29 08-30 08-31 09-01 需求评审(已完成) 架构设计(进行中) 核心模块开发(关键) 系统联调 正式上线(里程碑) 需求与设计 开发与交付 核心功能发布计划

其代码为

复制代码
gantt
    title 核心功能发布计划
    dateFormat  YYYY-MM-DD
    axisFormat  %m-%d

    section 需求与设计
    需求评审(已完成)      :done,      req1, 2026-08-20, 2d
    架构设计(进行中)      :active,    des1, 2026-08-22, 3d

    section 开发与交付
    核心模块开发(关键)    :crit,      dev1, after des1, 5d
    系统联调              :           dev2, after dev1, 2d
    正式上线(里程碑)      :milestone, m1,   after dev2, 0d

甘特图中的四个长条,名字分别是req1, des1, dev1, dev2,最后的菱形里程碑,则是m1。

基本语法

甘特图中,除了时间轴和时间轴之外,剩下的工作就是描述事件,其基本语法为

复制代码
事件说明 :状态  事件代号, 开始日期, 持续时间

其中,状态共有四种,分别是

  • done:已完成(默认灰色)
  • active:进行中(默认深色)
  • crit:关键路径/核心任务(默认红色高亮)
  • milestone:里程碑,被渲染为菱形,持续时间必须为 0

dateFormat格式

dateFormat为时间轴上的时间日期格式,可选参数如下表所示

输入 示例 描述
YY YYYY 26 2026 两位;四位年份
Q 1...4 年的季度。设置月份为该季度的第一个月
M MM 1...12 月份数字
MMM MMMM 一月...十二月 按 dayjs.locale() 设置的区域显示的月份名称
D DD 1...31 月中的天数
DDD DDDD 1...365 年中的天数
Do 1st...31st 带序数的月日
X 1410715640.579 Unix 时间戳
x 1410715640579 Unix 毫秒时间戳
H HH 0...23 24 小时时间
h hh 1...12 12 小时时间,与 a A 配合使用
a A am pm 上午或下午
m mm 0...59 分钟
s ss 0...59 秒
S,SS,SSS 0...9 秒的小数位(S个数对应位数)
Z ZZ +12:00 相对于 UTC 的偏移,格式为 ±HH:mm、±HHmm 或 Z

axisFormat格式

axisFormat是坐标轴上的输出时间格式,可选代码如下表所示。

格式 定义
%a %A 星期名称(缩写和完整的)
%b %B 月份名称(缩写和完整的)
%c 日期和时间,格式为 "%a %b %e %H:%M:%S %Y"
%d 以零填充的月份中的日期,作为十进制数字 01,31
%e 月中的日期,以十进制数字表示并用空格填充 1,31;等同于 %_d
%I %H 小时(12小时制和24小时制),十进制数字 00,23 01,12
%j 以十进制数字表示的年份中的第几天 001,366
%m 以小数形式表示的月份 01,12
%M 分钟的小数形式 00,59
%L 毫秒,作为十进制数 000, 999
%p 上午或下午
%S 以小数形式表示的秒 00,61
%U 一年中的第几周(以星期日为一周的第一天),以十进制数字表示 00,53
%w 作为十进制数字的星期几 0(星期日),6
%W 一年中的第几周(以星期一为一周的第一天),十进制数字 00,53
%x 日期,格式为 "%m/%d/%Y"
%X 时间,格式为 "%H:%M:%S"
%y 无世纪年份的十进制数 00,99
%Y 以十进制数字表示的带世纪的年份
%Z 时区偏移,例如 "-0700"
%% 一个字面的"%"字符
相关推荐
qqxiaoxingxing5 小时前
HR重复性工作自动化落地指南:先梳理任务边界,再选工具
运维·自动化
王琦03186 小时前
持续集成持续交付企业示例
运维·ci/cd
Lsetea7 小时前
SSL证书指纹相同但文件哈希不同:PEM、DER与公钥摘要怎么比
运维·https·ssl证书·openssl·证书链
wtblszn7 小时前
废气处理余热回收设备远程运维系统方案
运维
乔旭伟7 小时前
Linux 服务器备份实战:一致性快照、日志归档与恢复演练
linux·运维·服务器
cpolar技术支持7 小时前
把配置发出去怕带出密钥?先把含凭据配置转成脱敏只读快照,用 cpolar 给同事核对差异
运维·python·内网穿透·cpolar·配置脱敏
我不会起名字3227 小时前
Redis 突然只能读不能写:MISCONF 报错的 3 类触发条件与 4 步恢复
运维·redis·持久化·排查·misconf
workflower8 小时前
Agentic AI 时代的企业ICT 基础设施运维
运维·人工智能·机器学习·重构·云计算·汽车
szxinmai主板定制专家8 小时前
ZYNQ 数据采集方案踩坑总结:电力强电磁干扰、工业现场多协议适配优化
运维·人工智能·fpga开发·机器人·zynq
猫咪很可爱8 小时前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle