SVG Path 语法手册

141 阅读4分钟

前言

本文梳理了 SVG 路径(path)命令的核心语法与用法,带你快速了解命令的绝对/相对坐标、参数含义,并通过简短示例建立直觉,便于在日常图形绘制与调试中查阅。

语法规则

  1. 所有指令均由单个字符表示(例如 MoveTo 对应 M)。
  2. 多余的空白和分隔符(如逗号)可省略,例如 M 100 100 L 200 200 可写作 M100 100L200 200
  3. 若连续出现相同类型命令,后续的命令字母可省略,例如 M 100 200 L 200 100 L -100 -200 可写作 M 100 200 L 200 100 -100 -200
  4. 大部分命令同时提供绝对坐标与相对坐标两种形式(大写=绝对,小写=相对)。
  5. 语法说明:() 表示参数分组;+ 表示“至少一次(1 次或更多)”。例如:L (x y)+ 表示至少一个坐标点对。

指令介绍

M/m — MoveTo(移动到)

  • 格式:M (x y)+ / m (dx dy)+
  • 规则:以 (x, y) 为起点开启一段子路径;额外坐标点将被隐式解析为后续的 L/l 命令,坐标体系也将隐式沿用(M 对应 L,m 对应 l)。
  • 示例:
    • M10 10 40 10 40 40 等价 M10 10 L40 10 L40 40
    • m10 10 30 0 0 30 等价 m10 10 l30 0 l0 30

Z/z — ClosePath(闭合)

  • 格式:Z / z(无参数,大小写等价)
  • 规则:从当前点到初始点绘制一条直线,长度可以为 0。若其后紧跟 MoveTo,则标识下一个子路径的起点;若紧跟其他命令,则下一个子路径以当前位置为起点(与当前子路径起点相同)。

L/l — LineTo(直线到)

  • 格式:L (x y)+ / l (dx dy)+
  • 规则:从当前点到 (x, y) 绘制一条直线,可提供多个坐标对以绘制折线;当前点更新为最后的终点。
  • 示例:L40 10 40 40 10 40l30 0 0 30 -30 0

H/h — Horizontal LineTo(水平)

  • 格式:H (x)+ / h (dx)+
  • 规则:从当前点绘制一条水平线,可以提供多个 x 值(实际意义不大)。
  • 示例(当前点 10,20):H60 90h50 30

V/v — Vertical LineTo(垂直)

  • 格式:V (y)+ / v (dy)+
  • 规则:从当前点绘制一条垂直线,可以提供多个 y 值(实际意义不大)。
  • 示例(当前点 60,20):V50 10v30 -40

C/c — Cubic Bézier(三次贝塞尔曲线)

  • 格式:C (x1 y1 x2 y2 x y)+ / c (dx1 dy1 dx2 dy2 dx dy)+
  • 规则:从当前点到 (x, y) 绘制一条三次贝塞尔曲线,以 (x1, y1) 作为起点侧控制点,以 (x2, y2) 作为终点侧控制点。
  • 示例(当前点 10,80):C40 10 80 10 110 80c30 -70 70 -70 100 0

S/s — Smooth Cubic(平滑三次贝塞尔曲线)

  • 格式:S (x2 y2 x y)+ / s (dx2 dy2 dx dy)+
  • 规则:从当前点到 (x, y) 绘制三次贝塞尔;若前一命令为 C/c/S/s,则第一个控制点取“上一段第二控制点相对当前点的镜像”(cp1 = 2 * current - prevCp2);否则第一个控制点 = 当前点;(x2, y2) 为终点侧控制点;可多组串联。
  • 示例:S180 150 210 80s70 70 100 0

Q/q — Quadratic Bézier(二次贝塞尔曲线)

  • 格式:Q (x1 y1 x y)+ / q (dx1 dy1 dx dy)+
  • 规则:从当前点到 (x, y) 绘制二次贝塞尔曲线,(x1, y1) 为控制点。
  • 示例(当前点 10,60):Q60 10 110 60q50 -50 100 0

T/t — Smooth Quadratic(平滑二次贝塞尔曲线)

  • 格式:T (x y)+ / t (dx dy)+
  • 规则:从当前点到 (x, y) 绘制二次贝塞尔;若前一命令为 Q/q/T/t,则控制点取“上一段控制点相对当前点的镜像”;否则控制点 = 当前点;可多组串联。
  • 示例:T210 60t100 0

A/a — Arc(椭圆弧)

  • 格式:A (rx ry xAxisRotation largeArcFlag sweepFlag x y)+ / a (rx ry xAxisRotation largeArcFlag sweepFlag dx dy)+
  • 规则:从当前点到 (x, y) 绘制椭圆弧,椭圆的大小与方向由 (rx, ry) 与 xAxisRotation 参数决定。xAxisRotation 表示椭圆整体相对于当前坐标系的旋转角度。largeArcFlagsweepFlag 用于圆弧的选择,参考如下示例。
  • a100,50 0 ?,? 100,50 中“?”是 largeArcFlagsweepFlag 的占位符,不同的取值对应的圆弧效果如下图。 Arc_Demo.png