跳至内容

流程图 - 基本语法

流程图由**节点**(几何形状)和**边**(箭头或线)组成。Mermaid 代码定义了节点和边是如何创建的,并适应了不同的箭头类型,多方向箭头以及任何到子图和来自子图的链接。

警告

如果您在流程图节点中使用单词“end”,请将整个单词或任何字母大写(例如,“End”或“END”),或应用此解决方法。完全小写“end”将破坏流程图。

警告

如果您使用字母“o”或“x”作为连接流程图节点的第一个字母,请在字母前添加空格或将字母大写(例如,“dev--- ops”,“dev---Ops”)。

键入“A---oB”将创建一个圆形边

键入“A---xB”将创建一个交叉边

节点(默认)

信息

id 是在框中显示的内容。

提示

除了 flowchart 之外,还可以使用 graph

带有文本的节点

还可以设置框中的文本,使其与 id 不同。如果这样做多次,则找到的最后一个节点文本将被使用。另外,如果稍后为节点定义边,则可以省略文本定义。以前定义的文本将在渲染框时使用。

Unicode 文本

使用 " 括起 Unicode 文本。

Markdown 格式

使用双引号和反引号“` text `" 括起 Markdown 文本。

方向

此语句声明流程图的方向。

这声明流程图的方向是从上到下(TDTB)。

这声明流程图的方向是从左到右(LR)。

可能的流程图方向为

  • TB - 从上到下
  • TD - 从上到下/ 与从上到下相同
  • BT - 从下到上
  • RL - 从右到左
  • LR - 从左到右

节点形状

带有圆角的节点

体育场形状的节点

子程序形状的节点

圆柱形节点

圆形节点

非对称形状的节点

目前只有上面的形状是可能的,而不是它的镜像。这可能会在未来的版本中发生变化。

节点(菱形)

六边形节点

平行四边形

平行四边形 alt

梯形

梯形 alt

双圆

Mermaid 流程图中的扩展节点形状 (v11.3.0+)

Mermaid 引入了 30 种新形状,以增强流程图创建的灵活性、精确性。这些新形状提供了更多选项来表示流程、决策、事件、数据存储的视觉效果,以及流程图中的其他元素,从而提高清晰度和语义意义。

形状定义的新语法

Mermaid 现在支持定义形状类型的通用语法,以适应不断增加的形状数量。此语法允许您使用清晰灵活的格式将特定形状分配给节点

A@{ shape: rect }

此语法创建一个名为 A 的矩形节点。它的渲染方式与 A["A"]A 相同。

新形状的完整列表

以下是新引入的形状及其对应的语义含义、简短名称和别名的综合列表

语义名称形状名称简短名称描述支持的别名
卡片带缺口的矩形notch-rect表示一张卡片card, notched-rectangle
整理沙漏hourglass表示整理操作collate, hourglass
通讯链接闪电bolt通信链接com-link, lightning-bolt
注释大括号brace添加注释brace-l, comment
注释右侧大括号brace-r添加注释
带有两边大括号的注释大括号braces添加注释
数据输入/输出向右倾斜lean-r表示输入或输出in-out, lean-right
数据输入/输出向左倾斜lean-l表示输出或输入lean-left, out-in
数据库圆柱体cyl数据库存储cylinder, database, db
决策菱形diam决策步骤decision, diamond, question
延迟半圆矩形delay表示延迟half-rounded-rectangle
直接存取存储水平圆柱体h-cyl直接存取存储das, horizontal-cylinder
磁盘存储带线的圆柱体lin-cyl磁盘存储disk, lined-cylinder
显示弯曲梯形curv-trap表示显示curved-trapezoid, display
分段流程分段矩形div-rect分段流程形状div-proc, divided-process, divided-rectangle
文档文档doc表示文档doc, document
事件圆角矩形rounded表示事件event
提取三角形tri提取过程extract, triangle
分支/合并填充矩形fork流程中的分支或合并join
内部存储窗格win-pane内部存储internal-storage, window-pane
连接点填充圆圈f-circ连接点filled-circle, junction
带线的文档带线的文档lin-doc带线的文档lined-document
带线/阴影的流程带线的矩形lin-rect带线的流程形状lin-proc, lined-process, lined-rectangle, shaded-process
循环限制梯形五边形notch-pent循环限制步骤loop-limit, notched-pentagon
手动文件翻转三角形flip-tri手动文件操作flipped-triangle, manual-file
手动输入斜坡矩形sl-rect手动输入步骤manual-input, sloped-rectangle
手动操作梯形底端向上trap-t表示手动任务inv-trapezoid, manual, trapezoid-top
多文档堆叠文档docs多个文档documents, st-doc, stacked-document
多流程堆叠矩形st-rect多个流程processes, procs, stacked-rectangle
奇数奇数odd奇数形状
纸带旗帜flag纸带纸带
准备条件六边形六边形准备或条件步骤hexagon, prepare
优先行动梯形底梯形底优先行动priority, trapezoid, trapezoid-bottom
流程矩形矩形标准流程形状proc, process, rectangle
开始圆形圆形起点圆形
开始小圆形小圆形小起点small-circle, start
停止双圆形双圆形代表停止点双圆形
停止带框圆形带框圆形停止点framed-circle, stop
存储数据领结矩形领结矩形存储数据bow-tie-rectangle, stored-data
子流程带框矩形带框矩形子流程framed-rectangle, subproc, subprocess, subroutine
摘要带叉圆形带叉圆形摘要crossed-circle, summary
带标签的文档带标签的文档带标签的文档带标签的文档tag-doc, tagged-document
带标签的流程带标签的矩形带标签的矩形带标签的流程tag-proc, tagged-process, tagged-rectangle
终止点体育场体育场终止点pill, terminal
文本块文本块文本文本块

带有新形状的示例流程图

这是一个使用了一些新引入形状的示例流程图

流程

事件

终止点 (体育场)

子流程

数据库 (圆柱体)

开始 (圆形)

奇数

决策 (菱形)

准备条件 (六边形)

数据输入/输出 (右倾)

数据输入/输出 (左倾)

优先行动 (梯形底)

手动操作 (梯形顶)

停止 (双圆形)

文本块

卡片 (带缺口矩形)

带线/阴影的流程

开始 (小圆形)

停止 (带框圆形)

分叉/合并 (长矩形)

整理 (沙漏)

注释 (花括号)

右侧注释 (右侧花括号)

带两侧花括号的注释

文档

延迟 (半圆形矩形)

直接存取存储 (水平圆柱体)

磁盘存储 (带线圆柱体)

显示 (曲线梯形)

分隔流程 (分隔矩形)

提取 (小三角形)

内部存储 (窗格)

连接点 (实心圆形)

带线文档

循环限制 (带缺口五边形)

手动文件 (翻转三角形)

手动输入 (斜坡矩形)

多文档 (堆叠文档)

多流程 (堆叠矩形)

纸带 (旗帜)

存储数据 (领结矩形)

摘要 (带叉圆形)

带标签的文档

带标签的流程 (带标签矩形)

Mermaid 流程图中的特殊形状 (v11.3.0+)

Mermaid 还引入了 2 种特殊形状来增强您的流程图:图标图像。这些形状允许您直接在流程图中包含图标和图像,提供更多视觉上下文和清晰度。

图标形状

您可以使用 icon 形状在流程图中包含图标。要使用图标,您需要先注册图标包。请按照 此处 提供的说明进行操作。定义图标形状的语法如下:

参数

  • icon:注册图标包中的图标名称。
  • form:指定图标的背景形状。如果未定义,则图标将没有背景。选项包括:
    • 正方形
    • 圆形
    • rounded
  • label:与图标关联的文本标签。这可以是任何字符串。如果未定义,将不会显示标签。
  • pos:标签的位置。如果未定义,标签将默认为图标底部。可能的取值是:
    • 顶部
    • 底部
  • h:图标的高度。如果未定义,则默认为 48,这是最小值。

图像形状

您可以使用 image 形状在流程图中包含图像。定义图像形状的语法如下:

参数

  • img:要显示的图像的 URL。
  • label:与图像关联的文本标签。这可以是任何字符串。如果未定义,将不会显示标签。
  • pos:标签的位置。如果未定义,标签将默认为图像底部。可能的取值是:
    • 顶部
    • 底部
  • w:图像的宽度。如果未定义,则默认为图像的自然宽度。
  • h:图像的高度。如果未定义,则默认为图像的自然高度。
  • constraint:确定图像是否应该限制节点大小。此设置还确保图像保持其原始纵横比,根据宽度 (w) 调整高度 (h)。如果未定义,则默认为 off。可能的取值是:
    • 打开
    • 关闭

这些新形状为您的流程图提供了额外的灵活性和视觉吸引力,使它们更具信息性和参与性。

节点可以用链接/边连接。可以有不同类型的链接,或者将文本字符串附加到链接。

或者

或者

在某些情况下,这可能是一个有用的工具,您可以在其中更改节点的默认位置。

可以在同一行中声明多个链接,如下所示:

也可以在同一行中声明多个节点链接,如下所示:

然后,您可以用非常有表现力的方式描述依赖关系。比如以下单行代码:

如果您使用基本语法描述相同的图表,则需要四行。提醒一下,如果过分使用这种方式,可能会使流程图在 Markdown 形式下更难阅读。瑞典语 lagom 一词就体现了这一点。它的意思是,不多不少。这对有表现力的语法也是一样的。

新的箭头类型

支持新的箭头类型:

  • 圆形边
  • 交叉边

圆形边示例

交叉边示例

多方向箭头

可以使用多方向箭头。

流程图中的每个节点最终都会被分配到渲染图中的一个秩,即垂直或水平级别(取决于流程图方向),根据它链接到的节点。默认情况下,链接可以跨越任意数量的秩,但是您可以通过在链接定义中添加额外的破折号来要求任何链接比其他链接更长。

在以下示例中,在从节点B到节点E的链接中添加了两个额外的破折号,因此它跨越了比常规链接多两个秩。

注意 链接可能仍然会被渲染引擎设置为比请求的秩数量更长,以适应其他请求。

当链接标签写在链接中间时,额外的破折号必须添加到链接的右侧。以下示例等效于前面的示例

对于虚线或粗线链接,要添加的字符是等号或点,如以下表格中总结的

长度123
普通------------
带箭头的普通-->--->---->
粗体============
带箭头的粗体==>===>====>
点线-.--..--...-
带箭头的点线-.->-..->-...->

破坏语法的特殊字符

为了渲染更多有问题的字符,可以将文本放在引号内。如以下示例所示

转义字符的实体代码

可以使用此处示例的语法转义字符。

给出的数字是十进制的,因此#可以编码为#35;。也可以使用 HTML 字符名称。

子图

subgraph title
    graph definition
end

以下是一个示例

您还可以为子图设置一个显式 ID。

流程图

使用 graphtype 流程图,还可以像下面的流程图一样设置子图的边

子图中的方向

使用 graphtype 流程图,您可以使用方向语句来设置子图渲染的方向,如以下示例所示。

限制

如果子图的任何节点都链接到外部,子图方向将被忽略。相反,子图将继承父图的方向

Markdown 字符串

"Markdown 字符串"功能通过提供更通用的字符串类型来增强流程图和思维导图,该字符串类型支持文本格式选项(如粗体和斜体),并自动在标签中换行文本。

格式

  • 对于粗体文本,在文本前后使用双星号 (**)。
  • 对于斜体文本,在文本前后使用单星号 (*)。
  • 对于传统的字符串,您需要添加<br>标签才能使文本在节点中换行。但是,markdown 字符串在文本过长时会自动换行,并允许您通过简单地使用换行符(而不是<br>标签)来开始新的一行。

此功能适用于节点标签、边标签和子图标签。

可以使用以下方法禁用自动换行

---
config:
  markdownAutoWrap: false
---
graph LR

互动

可以将单击事件绑定到节点,单击可以导致 javascript 回调或将在新浏览器标签中打开的链接。

信息

此功能在使用securityLevel='strict'时被禁用,在使用securityLevel='loose'时被启用。

click nodeId callback
click nodeId call callback()
  • nodeId 是节点的 ID
  • callback 是在显示图形的页面上定义的 javascript 函数的名称,该函数将使用 nodeId 作为参数调用。

以下是如何使用工具提示的示例

html
<script>
  window.callback = function () {
    alert('A callback was triggered');
  };
</script>

工具提示文本用双引号括起来。工具提示的样式由类.mermaidTooltip设置。

成功 工具提示功能和链接到 url 的功能从 0.5.2 版本开始可用。

?> 由于 Docsify 在处理 JavaScript 回调函数方面的限制,可以在此 jsfiddle上查看上述代码的替代工作演示。

默认情况下,链接将在同一个浏览器标签/窗口中打开。可以通过在单击定义中添加链接目标来更改此行为 (_self, _blank, _parent_top 受支持)

初学者提示 - 在 html 上下文中使用交互式链接的完整示例

html
<body>
  <pre class="mermaid">
    flowchart LR
        A-->B
        B-->C
        C-->D
        click A callback "Tooltip"
        click B "https://www.github.com" "This is a link"
        click C call callback() "Tooltip"
        click D href "https://www.github.com" "This is a link"
  </pre>

  <script>
    window.callback = function () {
      alert('A callback was triggered');
    };
    const config = {
      startOnLoad: true,
      flowchart: { useMaxWidth: true, htmlLabels: true, curve: 'cardinal' },
      securityLevel: 'loose',
    };
    mermaid.initialize(config);
  </script>
</body>

注释

可以在流程图中输入注释,这些注释会被解析器忽略。注释需要在自己的行上,并且必须以%%(双百分号)开头。从注释开始到下一个换行符之间的任何文本都将被视为注释,包括任何流程语法

样式和类

可以设置链接的样式。例如,您可能想要设置一个在流程中向后链接的样式。由于链接不像节点那样有 ID,因此需要其他方法来决定应该将什么样式附加到链接上。代替 ID,使用链接在图中定义时的顺序号,或者使用 default 将样式应用于所有链接。在以下示例中,linkStyle 语句中定义的样式将属于图中的第四个链接

linkStyle 3 stroke:#ff3,stroke-width:4px,color:red;

也可以通过用逗号分隔链接号在一个语句中为多个链接添加样式

linkStyle 1,2,7 color:blue;

设置线曲线样式

如果默认方法不满足您的需求,可以设置用于项目之间线条的曲线类型。可用的曲线样式包括basisbumpXbumpYcardinalcatmullRomlinearmonotoneXmonotoneYnaturalstepstepAfterstepBefore

在本例中,一个从左到右的图表使用了stepBefore曲线样式

%%{ init: { 'flowchart': { 'curve': 'stepBefore' } } }%%
graph LR

有关可用曲线的完整列表,包括自定义曲线的解释,请参阅Shapes文档中的d3-shape项目。

设置节点样式

可以将特定样式(如更粗的边框或不同的背景颜色)应用于节点。

比每次定义样式更方便的是定义一组样式,并将此样式附加到应该具有不同外观的节点。

类定义类似于以下示例

    classDef className fill:#f9f,stroke:#333,stroke-width:4px;

此外,可以在一个语句中为多个类定义样式

    classDef firstClassName,secondClassName font-size:12pt;

将类附加到节点的方式如下所示

    class nodeId1 className;

也可以在一个语句中将类附加到节点列表

    class nodeId1,nodeId2 className;

添加类的简短形式是使用:::运算符将类名附加到节点,如下所示

此形式可以在声明节点之间多个链接时使用

CSS 类

也可以在 CSS 样式中预定义类,这些类可以从图定义中应用,如以下示例所示

示例样式

html
<style>
  .cssClass > rect {
    fill: #ff0000;
    stroke: #ffff00;
    stroke-width: 4px;
  }
</style>

示例定义

默认类

如果一个类名为 default,它将被分配给所有没有特定类定义的类。

    classDef default fill:#f9f,stroke:#333,stroke-width:4px;

对 fontawesome 的基本支持

可以添加来自 fontawesome 的图标。

可以通过语法 fa:#icon 类名# 访问图标。

如果网站上包含了 CSS,则 Mermaid 支持 Font Awesome。Mermaid 对可以使用 Font Awesome 的版本没有任何限制。

请参阅官方 Font Awesome 文档了解如何在您的网站中包含它。

<head>中添加此代码片段将添加对 Font Awesome v6.5.1 的支持

html
<link
  href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
  rel="stylesheet"
/>

自定义图标

只要网站导入了相应的工具包,就可以使用从 Font Awesome 提供的自定义图标。

请注意,目前这是 Font Awesome 的付费功能。

对于自定义图标,您需要使用fak前缀。

示例

flowchart TD
    B[fa:fa-twitter] %% standard icon
    B-->E(fak:fa-custom-icon-name) %% custom icon

尝试渲染它

  • 在图声明中,语句现在也可以不以分号结尾。在 0.2.16 版本发布后,用分号结束图语句只是可选的。因此,以下图声明也与图的旧声明一起有效。

  • 顶点和链接之间允许有一个空格。但是,顶点及其文本之间以及链接及其文本之间不应有任何空格。图声明的旧语法也仍然有效,因此此新功能是可选的,并且是为了提高可读性而引入的。

以下是图边的新的声明,它与图边的旧声明一起有效。

配置

渲染器

图表的布局由渲染器完成。默认渲染器是 dagre。

从 Mermaid 9.4 版本开始,您可以使用名为 elk 的备用渲染器。elk 渲染器更适合大型和/或更复杂的图表。

elk 渲染器是一个实验性功能。您可以通过添加以下指令将渲染器更改为 elk

%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%

信息

请注意,网站需要使用 Mermaid 9.4+ 版本才能使此功能正常工作,并且在延迟加载配置中启用了此功能。

宽度

可以调整渲染的流程图的宽度。

这是通过定义mermaid.flowchartConfig或通过 CLI 来使用包含配置的 JSON 文件来完成的。如何使用 CLI 在 mermaidCLI 页面中描述。mermaid.flowchartConfig 可以设置为包含配置参数的 JSON 字符串或相应的对象。

javascript
mermaid.flowchartConfig = {
    width: 100%
}