aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/svg/attribute/d/index.html
blob: 6bba785af771eb0296554498b339ce07ef47e290 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
---
title: d
slug: Web/SVG/Attribute/d
tags:
  - SVG
  - SVG元素
  - 参考
translation_of: Web/SVG/Attribute/d
---
<p>« <a href="/en-US/docs/Web/SVG/Attribute" title="en-US/docs/Web/SVG/Attribute">SVG属性参考主页</a></p>

<p>该属性定义了一个路径。</p>

<h2 id="用法">用法</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="row">类别</th>
   <td>路径定义属性</td>
  </tr>
  <tr>
   <th scope="row"></th>
   <td> </td>
  </tr>
  <tr>
   <th scope="row">可变性</th>
   <td>Yes</td>
  </tr>
  <tr>
   <th scope="row">规范文档</th>
   <td><a class="external" href="http://www.w3.org/TR/SVG/animate.html#DurAttribute">SVG 1.1 (2nd Edition)</a></td>
  </tr>
 </tbody>
</table>

<p>属性<code>d</code>实际上是一个字符串,包含了一系列路径描述。这些路径由下面这些指令组成:</p>

<ul>
 <li>Moveto</li>
 <li>Lineto</li>
 <li>Curveto</li>
 <li>Arcto</li>
 <li>ClosePath</li>
</ul>

<p>这些组合在一个字符串中。这些不同的命令是大小写敏感的;一个大写的命令指明它的参数是绝对位置,而小写的命令指明相对于当前位置的点。可以指定一个负数值作为命令的参数:负角度将是逆时针的,绝对x和y位置将视为负坐标。负相对x值将会往左移,而负相对y值将会向上移。</p>

<h2 id="Moveto">Moveto</h2>

<p><code>Moveto</code>指令可以被想象成拎起绘图笔,落脚到另一处。在上一个点和这个指定点之间没有线段绘制。用一个Moveto命令开始一个路径是好的作法,因为如果没有一个初始化的Moveto,执行命令时开始点会是上一个操作发生过的地方,这样可能造成不确定的行为。</p>

<p>句法:</p>

<ul>
 <li><code>M x,y</code> 在这里x和y是绝对坐标,分别代表水平坐标和垂直坐标。</li>
 <li><code>m dx,dy</code> 在这里dx和dy是相对于当前点的距离,分别是向右和向下的距离。</li>
</ul>

<p>示例:</p>

<ul>
 <li>位于绝对位置x=50, y= 100:<code>&lt;path d="M50,100..." /&gt;</code></li>
 <li>往右移50,往下移100:<code>&lt;path d="m50,100..." /&gt;</code></li>
</ul>

<h2 id="Lineto">Lineto</h2>

<p><code>Moveto</code>指令不同,<code>Lineto</code>指令将绘制一条直线段。这个直线段从当前位置移到指定位置。原生的<code>Lineto</code>命令的句法是”L x, y“或者”l dx, dy“,在这里x和y是绝对坐标,而dx和dy分别是向右和向下的距离。还有字母H和V,分别指定水平和垂直移动。它们的句法与L相同,它的小写版本是相对距离,大写版本是绝对位置。</p>

<h2 id="Curveto">Curveto</h2>

<p>Curvto命令指定了一个<a href="/User:Jt//Sandbox/Curves_in_Paths" title="Curves in Paths">贝塞尔曲线</a>。有两种类型的贝塞尔曲线:立方曲线和二次方曲线。二次方贝塞尔曲线是一种特殊的立方贝塞尔曲线,在这里,控制点的两端是相同的。二次方贝塞尔曲线的句法是”Q cx, cy  x, y“或”q dcx, dcy dx, dy“。cx和cy都是控制点的绝对坐标,而dcx和dcy分别是控制点在x和y方向上的距离。</p>

<div>
<p>立方贝赛尔曲线遵守二次方贝赛尔曲线同样的概念,但是它需要考虑两个控制点。立方贝塞尔曲线的句法是:”C c1x,c1y c2x,c2y x,y“或者”c dc1x,dc1y dc2x,dc2y dx,dy“,在这里,c1x、c1y和c2x、c2y是分别是初始点和结束点的控制点的绝对坐标。dc1x、dc1y和dc2x、dc2y都是相对于初始点,而不是相对于结束点的。dx和dy分别是向右和向下的距离。</p>

<p>为了连缀平滑的贝塞尔曲线,还可以使用T和S命令。它们的语法比别的Curveto命令简单,因为它假定第一个控制点是从前一个控制点关于前一个点的反射,或者说如果没有前一个控制点的话它实际上就是前一个点。T的句法是”T x,y“或者”t dx,dy“,分别对应于绝对坐标和相对距离,用来创建二次方贝塞尔曲线。S用来创建立方贝塞尔曲线,语法是”S cx,cy x,y“或者”s dcx,dcy dx,dy“,在这里(d)cx指定第二个控制点。</p>

<p>最后,所有的贝塞尔曲线命令可以制作出一个多边贝塞尔图形,先初始化命令,然后多次指定所有的参数,就可以制作出一个多边贝赛尔图形。因此,下面的两个命令可以创建完全相同的路径:</p>

<div class="geckoVersionNote">
<p>&lt;path d="c 50,0 50,100 100,100 50,0 50,-100 100,-100" /&gt;<br>
 &lt;path d="c 50,0 50,100 100,100 c 50,0 50,-100 100,-100" /&gt;</p>
</div>

<h2 id="Arcto">Arcto</h2>

<p>有时候描述一个椭圆弧曲线路径要比描述一个贝塞尔曲线路径更简单。说到底,path元素支持Arcto命令。圆弧的中心由别的变量计算出。一个arcto的声明相对而言有点复Visual Studio:”A rx,ry xAxisRotate LargeArcFlag,SweepFlag x,y“。解构它,rx和ry分别是x和y方向的半径,而LargeArcFlag的值要到是0要么是1,用来确定是要画小弧(0)还是画大弧(1)。SweepFlag也要么是0要么是1,用来确定弧是顺时针方向(1)还是逆时针方向(0)。x和y是目的地的坐标。虽然xAxisRotate支持改变x轴相对于当前引用框架的方向,但是在Gecko 7中,这个参数看起来没什么效果。</p>

<h2 id="ClosePath">ClosePath</h2>

<p>ClosePath命令将在当前路径从,从当前点到第一个点简单画一条直线。它是最简单的命令,而且不带有任何参数。它沿着到开始点的最短的线性路径,如果别的路径落在这路上,将可能路径相交。句法是”Z“或”z“,两种写法作用都一样。</p>
</div>

<h2 id="元素">元素</h2>

<p>以下元素可以使用<code>d</code>属性:</p>

<ul>
 <li>{{SVGElement("path")}} »</li>
 <li>{{SVGElement("glyph")}} »</li>
</ul>

<p>同样的规则可以应用到{{SVGElement("animate")}}动画路径上。</p>

<h2 id="提醒">提醒</h2>

<p>原点(坐标系0,0点)经常是上下文的<strong>左上角</strong>。然而{{SVGElement("glyph")}}元素的原点在它的字母框的<strong>左下角</strong></p>

<p>在任何两个数字之间允许加一个逗号,但是在别的地方不允许加逗号。</p>

<h2 id="示例">示例</h2>

<pre><code>&lt;svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    	 viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve"&gt;
    &lt;path fill="#F7931E" d="M37,17v15H14V17H37z M50,0H0v50h50V0z"/&gt;
&lt;/svg&gt;</code></pre>

<p>为了演示<code>d="M37,17v15H14V17H37z M50,0H0v50h50V0z"的实际意义,我们来讨论这个字符串的每一小段。</code></p>

<p style="margin-bottom: 1em; font-size: 15px; color: rgb(34, 34, 34); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 19.5px;"><img alt="enter image description here" src="http://img3.douban.com/view/photo/large/public/p2316231190.jpg" style="height: 400px; max-width: 630px; width: 400px;"></p>

<ul>
 <li><code>d=" M37,17 || v15 || H14 || V17 || H37 ||z // M50,0 || H0 || v50 || h50 || V0 || z"</code></li>
 <li><code>d=</code>
  <ul>
   <li>这个属性包含了构成整个SVG的字符串。</li>
  </ul>
 </li>
 <li><code>M37,17</code>
  <ul>
   <li><font face="Consolas, Liberation Mono, Courier, monospace">M是MoveTo的缩写。大写的“M”意味着绝对坐标,小写的“m”意味着相对距离。它暗含着是基于开始坐标,线在框里面,而且你在方框内矩形的右上角开始。</font></li>
   <li><font face="Consolas, Liberation Mono, Courier, monospace">37是开始svg位置的缩写,在X轴坐标37像素处。</font></li>
   <li><code>17开始svg位置,在y轴的17像素处。</code></li>
  </ul>
 </li>
 <li>v15
  <ul>
   <li>v代表垂直。大写的V意味着绝对坐标,小写的v表示相对的长度、距离。dx/dy和x/y可以用在H/V和h/v相应的位置里。</li>
   <li>这里是表示相对于给定坐标画一条15像素的垂直线。它意味着你向下画15像素,到坐标37,32。</li>
  </ul>
 </li>
 <li><code>H14</code>
  <ul>
   <li>H代表水平,它是绝对坐标,因为它是大写的。</li>
   <li>从v15的终点开始,画一条水平线直到到达绝对坐标14,当到达x坐标14时结束画线。笔触位于坐标14,32。</li>
  </ul>
 </li>
 <li><code>V17</code>
  <ul>
   <li>就像前面那样,从上一条线的终点开始,画一条垂直线,直到到达y轴坐标17。笔触位于坐标14,17。</li>
  </ul>
 </li>
 <li>H37
  <ul>
   <li>最后,从14,17开始,画一条水平线,直到到达x轴坐标37。笔触位于坐标37,17(M的值)</li>
  </ul>
 </li>
 <li><code>z</code>
  <ul>
   <li>小写的z和大写的Z都是闭合一系列svg线段。</li>
  </ul>
 </li>
 <li><code>,</code>
  <ul>
   <li>逗号开始下一串简单矢量图形线段。下一系列简单矢量线段将制作外层方框。</li>
  </ul>
 </li>
 <li><code>M50,0</code>
  <ul>
   <li>在x轴50和y轴0处开始。</li>
  </ul>
 </li>
 <li><code>H0</code>
  <ul>
   <li>画一条直线直到(0,0)。</li>
  </ul>
 </li>
 <li><code>v50</code>
  <ul>
   <li>相对于0,0画一条50像素的垂直线。这条线将画到(0,50)。</li>
  </ul>
 </li>
 <li><code>h50</code>
  <ul>
   <li>相对于(0,-50)画一条50像素的水平线。这条线将向右画到(50,50)。</li>
  </ul>
 </li>
 <li><code>V0</code>
  <ul>
   <li>画一条垂直线直到到达y轴坐标0。这将画线到(50,0),即M的值。</li>
  </ul>
 </li>
 <li><code>z</code>
  <ul>
   <li>小写的z和大写的Z都是闭合一系列svg线段。</li>
  </ul>
 </li>
</ul>