Back to Blog

用原生 HTML 与 SVG 绘制专业图表:避开 Mermaid 的实战技巧

2026/10/84 min read

用原生 HTML 与 SVG 绘制专业图表:避开 Mermaid 的 42 种图形实战

原生 SVG 结合 HTML 能直接生成高质量、无依赖的专业图表。Mermaid 在处理复杂布局和样式时往往显得僵化,而通过手动控制 SVG 元素,你可以实现更精细的设计,比如消除阴影、自定义颜色主题,并支持多达 42 种图形类型。

为什么选择原生 SVG 而非 Mermaid

Mermaid 虽然上手快,但在企业级可视化中常遇到瓶颈。我曾在做一个数据大屏项目时,发现 Mermaid 生成的流程图线条粗细无法统一调整,且节点间距受算法自动布局限制,导致对齐困难。相比之下,原生 SVG 让你完全掌控每个元素的坐标、大小和样式。

用原生 HTML 和 SVG 绘制专业图表:避开 Mermaid 的 42 种图形实战 - 插图 1

例如,当你需要绘制一个带有特定角度连接线的架构图时,Mermaid 可能只能输出直角折线,而 SVG 可以用 path 元素定义贝塞尔曲线,轻松实现平滑过渡。此外,SVG 支持 CSS 样式和内联脚本,能无缝集成到现代前端框架中,无需额外打包 mermaid 库。

基础结构:用 HTML 容器包裹 SVG

要在网页中嵌入可交互的图表,最佳实践是将 SVG 作为内联元素置于 div 容器中。这样既方便用 CSS 控制外观,也能通过 JavaScript 动态修改内容。下面是一个最小化示例,展示如何创建一个简单的矩形图表:

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <title>原生 SVG 图表</title>
  <style>
    .chart-container {
      width: 100%;
      max-width: 600px;
      margin: 20px auto;
    }
    svg {
      background-color: #f5f5f5;
      border-radius: 8px;
    }
  </style>
</head>
<body>
  <div class="chart-container">
    <svg width="600" height="400" viewBox="0 0 600 400">
      <rect x="50" y="50" width="200" height="150" fill="#4CAF50" stroke="#388E3C" stroke-width="2" />
      <text x="150" y="130" font-family="Arial" font-size="18" fill="white" text-anchor="middle">示例节点</text>
    </svg>
  </div>
</body>
</html>

这段代码创建了一个绿色矩形节点,带有边框和居中标题。你可以根据需要调整 width、height 和 viewBox 属性,以适应不同屏幕尺寸。关键在于避免使用全局阴影效果,保持简洁的扁平化设计。

实战:绘制 42 种常见图形类型

原生 SVG 支持几乎所有基本几何形状和路径,足以覆盖 42 种常见图表需求。以下是一些典型场景及实现要点:

  • 流程图:使用 <path> 绘制箭头连接线,配合 <circle> 和 <rect> 表示开始/结束节点与处理步骤。通过设置 marker-end 属性为自定义箭头标记,避免依赖外部图标。
  • 时序图:以垂直 <line> 表示生命线,用 <polygon> 绘制激活条,并通过 <text> 添加消息标签。注意对齐 X 轴坐标,确保消息顺序清晰可读。
  • 类图:组合 <g> 分组元素来表示类,内部嵌套多个 <rect> 作为属性与方法区域。利用 transform="translate(x,y)" 精确定位每个类的位置。
  • 网络拓扑图:对于节点间多连接,可采用 <path> 绘制曲线,并用 <circle> 标注主机。避免过度密集,合理分配 Y 轴层距。
  • 甘特图:用 <rect> 表示任务条,X 轴为时间刻度,Y 轴为任务名称。结合 JavaScript 动态计算任务时长和依赖关系,实现交互式拖拽。

在实际开发中,我通常先定义一个 SVG 模板库,包含常用形状和样式类,然后针对具体图表类型实例化。例如,对于 ER 图,我会复用实体(矩形)、属性(椭圆)和关系(菱形)的基础定义,只需替换坐标和内容即可快速生成新图表。

性能优化与无障碍访问

虽然 SVG 比 Canvas 更适合静态图表,但大量图形元素仍可能导致渲染卡顿。建议采取以下措施:

  1. 使用 <defs> 定义可复用组件(如箭头标记、渐变),减少 DOM 节点数量。
  2. 对复杂路径进行简化,避免过多控制点。
  3. 添加 role="img" 和 <title> 标签,提升屏幕阅读器兼容性。
  4. 提供低分辨率降级方案,如在移动端切换为静态图片版本。

记住,原生 SVG 的核心优势在于灵活性和可控性。通过规避 Mermaid 的自动化陷阱,你能创造出更符合设计规范的图表,同时保持代码轻量易维护。探索更多图形模板时,不妨参考 SVG 官方规范或开源图表库源码,从中汲取灵感。

深入学习与资源拓展

如需进一步掌握原生 SVG 高级技巧,建议系统学习 SVG 动画、滤镜效果及与 D3.js 等库的集成方法。这些知识将帮助你构建更复杂的可视化应用,满足多样化的业务需求。

相关阅读

原文出处

本文首发于 用原生 HTML 与 SVG 绘制专业图表:避开 Mermaid 的实战技巧 — https://lyxq.com.cn/en/blog/native-svg-diagram-practice

转载或引用请注明出处,商业使用请联系作者获得授权。