SVG自由路径:path

本篇涵盖复杂形状元素:<path>,该元素提供强大的自由曲线能力,可以用它创建线条,曲线,弧形等等。

核心元素

<path> — 自由曲线与复杂形状

  • 用途:任意形状、复杂图形、图标、徽标、装饰线条。
  • 常用属性
    • d:路径命令字符串(支持直线/曲线/弧线/闭合等)
  • 直线命令
    • M x y / m dx dy:移动到指定坐标,只移动画笔不画线
    • L x y / l dx dy:直线到移动到指定坐标
    • H x / h dx:水平线
    • V y / v dy: 垂直线
    • Z:闭合路径,不区分大小写
  • 曲线命令
    • Q x1 y1, x y / q dx1 dy1, dx dy:二次贝塞尔,一个控制点+一个终点
    • T x y / t dx dy:平滑二次,T 会通过前一个控制点,推断出一个新的控制点。这意味着,在你的第一个控制点后面,可以只定义终点,就创建出一个相当复杂的曲线。需要注意的是,T 命令前面必须是一个 Q 命令,或者是另一个 T 命令,才能达到这种效果。
    • C x1 y1, x2 y2, x y / c dx1 dy1, dx2 dy2, dx, dy:三次贝塞尔,两个控制点+一个终点
    • S x2 y2, x y / s dx2 dy2, dx dy:平滑三次,S 命令可以用来创建与前面一样的贝塞尔曲线,但是,如果 S 命令跟在一个 C 或 S 命令后面,则它的第一个控制点会被假设成前一个命令曲线的第二个控制点的中心对称点。如果 S 命令单独使用,前面没有 C 或 S 命令,那当前点将作为第一个控制点。
    • A rx ry rot largeArc sweep x y / a rx ry rot largeArc sweep dx dy:椭圆弧

示例

  • 基础用法:
1
2
3
4
5
6
7
8
9
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
<path d="M 10 10 H 90 V 90 H 10 L 10 10"/>
<!-- Points -->
<circle cx="10" cy="10" r="2" fill="red"/>
<circle cx="90" cy="90" r="2" fill="red"/>
<circle cx="90" cy="10" r="2" fill="red"/>
<circle cx="10" cy="90" r="2" fill="red"/>

</svg>
  • 成品展示:


  • 相对坐标与自动闭合:

    1
    2
    3
    <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
    <path d="M 10 10 h 80 v 80 h -80 Z" fill="transparent" stroke="black"/>
    </svg>
  • 成品展示:


  • 三次贝塞尔曲线:
1
2
3
4
5
6
7
8
9
10
11
<svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
<path d="M 10 10 C 20 20, 40 20, 50 10" stroke="black" fill="transparent"/>
<path d="M 70 10 C 70 20, 110 20, 110 10" stroke="black" fill="transparent"/>
<path d="M 130 10 C 120 20, 180 20, 170 10" stroke="black" fill="transparent"/>
<path d="M 10 60 C 20 80, 40 80, 50 60" stroke="black" fill="transparent"/>
<path d="M 70 60 C 70 80, 110 80, 110 60" stroke="black" fill="transparent"/>
<path d="M 130 60 C 120 80, 180 80, 170 60" stroke="black" fill="transparent"/>
<path d="M 10 110 C 20 140, 40 140, 50 110" stroke="black" fill="transparent"/>
<path d="M 70 110 C 70 140, 110 140, 110 110" stroke="black" fill="transparent"/>
<path d="M 130 110 C 120 140, 180 140, 170 110" stroke="black" fill="transparent"/>
</svg>
  • 成品展示:


  • 平滑三次贝塞尔曲线:

    1
    2
    3
    <svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
    <path d="M 10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80" stroke="black" fill="transparent"/>
    </svg>
  • 成品展示:


  • 二次贝塞尔曲线:
1
2
3
<svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
<path d="M 10 80 Q 95 10 180 80" stroke="black" fill="transparent"/>
</svg>
  • 成品展示:


  • 平滑二次贝塞尔曲线:

    1
    2
    3
    <svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
    <path d="M 10 80 Q 52.5 10, 95 80 T 180 80" stroke="black" fill="transparent"/>
    </svg>
  • 成品展示:


  • 弧形:

    1
    2
    3
    4
    5
    6
    7
    8
    <svg width="320" height="320" xmlns="http://www.w3.org/2000/svg">
    <path d="M 10 315
    L 110 215
    A 30 50 0 0 1 162.55 162.45
    L 172.55 152.45
    A 30 50 -45 0 1 215.1 109.9
    L 315 10" stroke="black" fill="green" stroke-width="2" fill-opacity="0.5"/>
    </svg>
  • 成品展示:


  • 弧形带标注:
1
2
3
4
5
6
7
8
9
10
11
12
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="320">
<path d="M 10 315
L 110 215
A 36 60 0 0 1 150.71 170.29
L 172.55 152.45
A 30 50 -45 0 1 215.1 109.9
L 315 10" stroke="black" fill="green" stroke-width="2" fill-opacity="0.5"/>
<circle cx="150.71" cy="170.29" r="2" fill="red"/>
<circle cx="110" cy="215" r="2" fill="red"/>
<ellipse cx="144.931" cy="229.512" rx="36" ry="60" fill="transparent" stroke="blue"/>
<ellipse cx="115.779" cy="155.778" rx="36" ry="60" fill="transparent" stroke="blue"/>
</svg>
  • 成品展示:


  • 弧形参数对比:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<svg width="325" height="325" xmlns="http://www.w3.org/2000/svg">
<path d="M 80 80
A 45 45, 0, 0, 0, 125 125
L 125 80 Z" fill="green"/>
<path d="M 230 80
A 45 45, 0, 1, 0, 275 125
L 275 80 Z" fill="red"/>
<path d="M 80 230
A 45 45, 0, 0, 1, 125 275
L 125 230 Z" fill="purple"/>
<path d="M 230 230
A 45 45, 0, 1, 1, 275 275
L 275 230 Z" fill="blue"/>
</svg>
  • 成品展示:


小贴士

  • 命令绝对/相对:大写为绝对坐标,小写为相对坐标,相对上一个点的坐标;相对命令更利于拼接与复用。
  • 平滑命令:T/S 会自动推导控制点,打造连续曲线;遇拐角可改用显式控制点以免意外弯折。
  • 描边与缩放:几何缩放时用 vector-effect: non-scaling-stroke 保持描边恒定;需要视觉统一时再移除此属性。
  • 填充规则:自交或嵌套路径时尝试 fill-rule: evenodd 以实现洞/镂空效果。
  • 维护性:复杂 d 建议拆分为多个 <path> 或用工具(如设计软件/脚本)生成;务必保留注释或控制点标识。