最高效的WEB程序员学习网站
SVG手册 HTML5手册
 

SVG路径


<path>元素可以用来定义一个路径。

首先理解一下定义路径时各种字符命令代码的意思:

指令 参数 名称 描述
M x,y moveto
移动到
移动虚拟画笔到指定的(x,y)坐标,仅移动不绘制
m x,y moveto 同M,但使用相对坐标
L x,y lineto
连直线到
从当前画笔所在位置绘制一条直线到指定的(x,y)坐标
l x,y lineto 同L,但使用相对坐标
H x horizontal lineto
水平连线到
绘制一条水平直线到参数指定的x坐标点,y坐标为画笔的y坐标
h x horizontal lineto 同H,但使用相对坐标
V y vertical lineto
垂直连线到
从当前位置绘制一条垂直直线到参数指定的y坐标
v y vertical lineto 同V,但使用相对坐标
C x1,y1 x2,y2 x,y curveto
三次方贝塞尔曲线
从当前画笔位置绘制一条三次贝兹曲线到参数(x,y)指定的坐标。x1,y1和x2,y2是曲线的开始和结束控制点,用于控制曲线的弧度
c x1,y1 x2,y2 x,y curveto 同C,但使用相对坐标
S x2,y2 x,y shorthand / 平滑三次方贝塞尔曲线 从当前画笔位置绘制一条三次贝塞尔曲线到参数(x,y)指定的坐标。x2,y2是结束控制点。开始控制点和前一条曲线的结束控制点相同
s x2,y2 x,y shorthand / 平滑三次方贝塞尔曲线 同S,但使用相对坐标
Q x1,y1 x,y 二次方贝塞尔曲线 从当前画笔位置绘制一条二次方贝塞尔曲线到参数(x,y)指定的坐标。x1,y1是控制点,用于控制曲线的弧度
q x1,y1 x,y 二次方贝塞尔曲线 同Q,但使用相对坐标
T x,y 平滑的二次贝塞尔曲线 从当前画笔位置绘制一条二次贝塞尔曲线到参数(x,y)指定的坐标。控制点被假定为最后一次使用的控制点
t x,y 平滑的二次贝塞尔曲线 同T,但使用相对坐标
A rx,ry x-axis-rotation large-arc-flag,sweepflag x,y 椭圆弧线 从当前画笔位置开始绘制一条椭圆弧线到(x,y)指定的坐标。rx和ry分别为椭圆弧线水平和垂直方向上的半径。x-axis-rotation指定弧线绕x轴旋转的度数。它只在rx和ry的值不相同是有效果。large-arc-flag是大弧标志位,取值0或1,用于决定绘制大弧还是小弧。sweep-flag用于决定弧线绘制的方向
a rx,ry x-axis-rotation large-arc-flag,sweepflag x,y 椭圆弧线 同A,但使用相对坐标
Z 闭合路径 从结束点绘制一条直线到开始点,闭合路径
z 闭合路径 同Z

注意:所有的这些字符命令都可以用大小写两种形式。大小表示绝对位置,而小写表示相对位置。


例 1

下面的例子里定义了一个路径,从点 150,0 开始,连直线到点 75,200,然后连直线到点 225,200,最后闭合这个路径,连直线回到点 150,0:


  
  Sorry, your browser does not support inline SVG.

上面的例子使用了下面的SVG代码:

<svg height="210" width="400">
	  <path d="M150 0 L75 200 L225 200 Z" />
	</svg>

例 2

贝塞尔曲线是一种非常顺滑的曲线。通常,用户需要提供两个端点和一个或两个控制点。使用一个控制点的贝塞尔曲线叫做二次方贝塞尔曲线,使用两个控制点的贝塞尔曲线叫做三次方贝塞尔曲线。

下面的例子里使用了二次方贝塞尔曲线,其中 A 和 C 分别是两个端点,B是控制点:



  
  
  
  
  
    
    
    
  
  
  
    A
    B
    C
  
  Sorry, your browser does not support inline SVG.

上面的例子里使用了下面的SVG代码:

<svg height="400" width="450">
	  <path id="lineAB" d="M 100 350 l 150 -300" stroke="red"
	  stroke-width="3" fill="none" />
	  <path id="lineBC" d="M 250 50 l 150 300" stroke="red"
	  stroke-width="3" fill="none" />
	  <path d="M 175 200 l 150 0" stroke="green" stroke-width="3"
	  fill="none" />
	  <path d="M 100 350 q 150 -300 300 0" stroke="blue"
	  stroke-width="5" fill="none" />
	  <!-- Mark relevant points -->
	  <g stroke="black" stroke-width="3" fill="black">
	    <circle id="pointA" cx="100" cy="350" r="3" />
	    <circle id="pointB" cx="250" cy="50" r="3" />
	    <circle id="pointC" cx="400" cy="350" r="3" />
	  </g>
	  <!-- Label the points -->
	  <g font-size="30" font-family="sans-serif" fill="black" stroke="none"
	  text-anchor="middle">
	    <text x="100" y="350" dx="-30">A</text>
	    <text x="250" y="50" dy="-10">B</text>
	    <text x="400" y="350" dx="30">C</text>
	  </g>
	</svg>

	

复杂吗?的确。因为画路径需要涉及很多的点,所以,最好使用SVG编辑器来创建复杂路径图形。