path命令
SVG中所有基本形狀都是path的簡寫形式,但是建議使用簡寫形式,因為這樣可以使SVG文檔更可讀。
path元素更通用,可以通過制定一系列相互連接的線、弧、曲線來繪制任意形狀的輪廓,這些輪廓也可以填充或者繪制輪廓線,也可以用來定義裁剪區(qū)域或蒙版。
下表為path命令總結(jié),其中大寫表示絕對坐標(biāo),小寫表示相對坐標(biāo):
| 命令 | 參數(shù) | 說明 |
|---|---|---|
| M m | x y | 移動畫筆到制定坐標(biāo) |
| L l | x y | 繪制一條到給定坐標(biāo)的線 |
| H h | x | 繪制一條到給定x坐標(biāo)的橫線 |
| V v | y | 繪制一條到給定y坐標(biāo)的垂線 |
| A a | rx ry x-axis-rotation large-arc sweep x y | 圓弧曲線命令有7個參數(shù),依次表示x方向半徑、y方向半徑、旋轉(zhuǎn)角度、大圓標(biāo)識、順逆時針標(biāo)識、目標(biāo)點x、目標(biāo)點y。大圓標(biāo)識和順逆時針以0和1表示。0表示小圓、逆時針 |
| Q q | x1 y1 x y | 繪制一條從當(dāng)前點到x,y控制點為x1,y1的二次貝塞爾曲線 |
| T t | x y | 繪制一條從當(dāng)前點到x,y的光滑二次貝塞爾曲線,控制點為前一個Q命令的控制點的中心對稱點,如果沒有前一條則已當(dāng)前點為控制點。 |
| C c | x1 y1 x2 y2 x y | 繪制一條從當(dāng)前點到x,y控制點為x1,y1 x2,y2的三次貝塞爾曲線 |
| S s | x2 y2 x y | 繪制一條從當(dāng)前點到x,y的光滑三次貝塞爾曲線。第一個控制點為前一個C命令的第二個控制點的中心對稱點,如果沒有前一條曲線,則第一個控制點為當(dāng)前的點。 |
路徑的填充同樣可以使用fill-rule屬性指定填充規(guī)則,如果需要填充一個中空的形狀,則只需要注意外側(cè)路徑順逆時針方向和內(nèi)側(cè)空心區(qū)域順逆時針方向即可。
繪制一條直線
<path d="M 0,0 L 100,100" />
首先,使用M移動畫筆到起點坐標(biāo)(這里假設(shè)是0,0),然后使用L畫一條直線至終點坐標(biāo)(這里假設(shè)是100,100)。

繪制一條貝塞爾曲線
這里使用C來繪制一條三次貝塞爾曲線。
三次貝塞爾曲線的每個控制點都有兩個控制點。 因此,要創(chuàng)建三次貝塞爾曲線,需要指定三組坐標(biāo)。
C x1 y1, x2 y2, x y
這里的最后一組坐標(biāo)(x,y)指定了線的結(jié)束位置。另外兩個是控制點。(x1,y1)是曲線開始的控制點,(x2,y2)是曲線結(jié)束的控制點??刂泣c本質(zhì)上描述了從每一點開始的直線的斜率。然后,貝塞爾函數(shù)創(chuàng)建了一條光滑的曲線,從建立的斜率在線的開始,到另一端的斜率。

<path d="M 0,0 C 50,0 50,100 100,100" />

示例中該條貝塞爾曲線計算公式為
const startX = 0, startY = 0, endX = 100, endY = 100;
const yOffset = Math.abs(endY - startY) / 2;
const centerY = endY < startY ? endY + yOffset : endY - yOffset;
const xOffset = Math.abs(endX - startX) / 2;
const centerX = endX < startX ? endX + xOffset : endX - xOffset;
const pathAttr = `M ${startX},${startY} C ${centerX},${startY} ${centerX},${endY} ${endX},${endY}`;
marker元素
marker元素用來在path上添加一個標(biāo)記,比如箭頭之類的。
首先需要定義好marker元素,然后在path中引用,一個marker標(biāo)記是一個獨立的圖形,有自己的私有坐標(biāo)。
| marker屬性 | 說明 |
|---|---|
| markerWidth | marker標(biāo)記的寬度 |
| markerHeight | marker標(biāo)記的高度 |
| refX refY | 指定marker中的哪個坐標(biāo)與路徑的開始坐標(biāo)對齊 |
| orient | 自動旋轉(zhuǎn)匹配路徑的方向,需要設(shè)置為auto |
| markerUnits | 這個屬性決定標(biāo)記的坐標(biāo)系統(tǒng)是否需要根據(jù)path的筆畫寬度調(diào)整,如果設(shè)置為strokeWidth,則標(biāo)記會自動調(diào)整大小。如果設(shè)置為useSpaceOnUse,則不會自動調(diào)整標(biāo)記的大小。 |
| viewBox preserveAspectRatio | 設(shè)置標(biāo)記的顯示效果,比如可以將標(biāo)記的(0,0)設(shè)置在標(biāo)記網(wǎng)格中心 |
<defs>
<marker id="triangle" markerUnits="strokeWidth" markerWidth="5" markerHeight="4" refX="0" refY="2" orient="auto">
<path d="M 0 0 L 5 2 L 0 4 z" />
</marker>
</defs>
<path d="M 0,0 L 100,100" stroke="black" stroke-width="2" fill="none"
style="marker-end: url(#triangle);" />

首先,我們使用marker畫一個箭頭。設(shè)置orient為auto,使箭頭的方向自動旋轉(zhuǎn)匹配路徑的方向。
然后,可以在連接線的path中使用marker-start,marker-mid,marker-end,marker屬性來設(shè)置標(biāo)記的位置。
-
marker-start屬性將在給定形狀的第一個頂點繪制的箭頭或多邊形標(biāo)記。
image.png -
marker-mid屬性將在給定形狀的所有內(nèi)部頂點繪制的箭頭或多邊形標(biāo)記。
image.png -
marker-end屬性將在給定形狀的最終頂點繪制箭頭或者多邊形標(biāo)記。
image.png marker屬性,則表示同時設(shè)置marker-start,marker-mid,marker-end三個屬性。
這里,我們使用marker-end在線的結(jié)尾加上箭頭。
示例
<svg width="100%" height="100%">
<g transform="translate(0,0) scale(1)">
<g>
<defs>
<marker id="triangle" markerUnits="strokeWidth" markerWidth="5" markerHeight="4" refX="0" refY="2" orient="auto">
<path d="M 0 0 L 5 2 L 0 4 z" />
</marker>
</defs>
<path d="M 0,0 L 100,100" stroke="black" stroke-width="2" fill="none"
style="marker-end: url(#triangle);" />
</g>
<g>
<defs>
<marker
id="triangle"
markerUnits="strokeWidth"
markerWidth="5"
markerHeight="4"
refX="0"
refY="2"
orient="auto">
<path d="M 0 0 L 5 2 L 0 4 z" />
</marker>
</defs>
<path d="M 100,0 C 150,0 150,100 200,100" stroke="black" stroke-width="2" fill="none"
style="marker-end: url(#triangle);" />
</g>
</g>
</svg>



