Skip to content

Commit fa1a90d

Browse files
committed
feat: svg
1 parent 2749573 commit fa1a90d

File tree

2 files changed

+210
-0
lines changed

2 files changed

+210
-0
lines changed

docs/canvas/svg.mdx

+209
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
# SVG
2+
3+
SVG(可缩放矢量图形)的本质是一种XML语言,即可以单独使用也可以内联在HTML内部使用;和传统的位图不同,svg描述的是二维的矢量图。
4+
5+
## 坐标系
6+
7+
SVG的坐标系和Canvas完全一致。
8+
9+
![](https://developer.mozilla.org/zh-CN/docs/Web/SVG/Tutorial/Positions/canvas_default_grid.png)
10+
11+
### viewBox
12+
13+
`svg`标签的`width``height`属性表示这个元素在页面中的像素宽高。而`viewBox`则是这个`svg`内部的一个视口,内部的坐标信息都是相对于`viewBox`的。
14+
15+
``` xml
16+
<svg width="32" height="32" viewBox="0 0 100 100"></svg>
17+
```
18+
19+
20+
21+
## 基本形状
22+
23+
SVG提供了一批内置的形状。
24+
25+
### 矩形
26+
27+
``` xml
28+
<svg width="32" height="32" viewBox="0 0 100 100">
29+
<rect x="0" y="0" width="100" height="100" fill="red"></rect>
30+
<rect x="0" y="0" width="100" height="100" fill="pink" rx="10" ry="10"></rect> <!-- rx/ry设定radius -->
31+
</svg>
32+
```
33+
34+
### 圆形
35+
36+
``` xml
37+
<svg width="32" height="32" viewBox="0 0 100 100">
38+
<circle cx="50" cy="50" r="50" fill="blue"></circle>
39+
</svg>
40+
```
41+
42+
### 椭圆
43+
44+
``` xml
45+
<svg width="32" height="32" viewBox="0 0 100 100">
46+
<circle cx="50" cy="50" rx="30" ry="20" fill="pink"></circle>
47+
</svg>
48+
```
49+
50+
51+
52+
### 线段
53+
54+
``` xml
55+
<svg width="32" height="32" viewBox="0 0 100 100">
56+
<line x1="10" x2="10" y1="50" y2="50" stroke="black" stroke-width="5"></line>
57+
</svg>
58+
```
59+
60+
61+
62+
### 折线
63+
64+
``` xml
65+
<svg width="32" height="32" viewBox="0 0 1000 1000">
66+
<polyline points="60, 110 65, 120 70, 115 75, 130 80, 125 85, 140 90, 135 95, 150 100, 145"/>
67+
</svg>
68+
```
69+
70+
71+
72+
### 多边形
73+
74+
``` xml
75+
<svg width="32" height="32" viewBox="0 0 1000 1000">
76+
<polygon points="50, 160 55, 180 70, 180 60, 190 65, 205 50, 195 35, 205 40, 190 30, 180 45, 180"/>
77+
</svg>
78+
```
79+
80+
81+
82+
83+
84+
85+
86+
## 路径
87+
88+
除了上述的内置形状外,SVG还提供了路径来实现复杂的矢量图形,其中属性`d`包含了一系列指令来表示路径由哪些点组成。
89+
90+
``` xml
91+
<path d="M20,230 Q40,205 50,230 T90,230" fill="none" stroke="blue" stroke-width="5"/>
92+
```
93+
94+
95+
96+
每一个指令都有两种表示方式。大写字母时,比如`L10 10`,这里的坐标`10 10`为相对于`viewBox`的绝对定位坐标;小写字母时,比如`l10 10`,这里的坐标`10 10`表示相当于当前点的位移量。
97+
98+
99+
100+
### M指令
101+
102+
相当于Canvas中的MoveTo。
103+
104+
``` xml
105+
<path d="M10 10"/>
106+
```
107+
108+
109+
110+
### L指令
111+
112+
相当于Canvas中的LineTo。
113+
114+
``` xml
115+
<path d="M10 10 L20 20"/>
116+
```
117+
118+
119+
120+
### H指令
121+
122+
相当于Canvas中的MoveTo,但仅在水平方向(Horizontal)绘制。
123+
124+
``` xml
125+
<path d="M10 10 L20 20 h10"/>
126+
```
127+
128+
129+
130+
### V指令
131+
132+
相当于Canvas中的MoveTo,但仅在垂直方向(Vertical)绘制。
133+
134+
``` xml
135+
<path d="M10 10 L20 20 h10 v10"/>
136+
```
137+
138+
139+
140+
### C指令
141+
142+
绘制三次贝塞尔曲线`bezierCurve`。从当前坐标绘制三次贝塞尔曲线,需要传入两个控制点坐标以及最终坐标的信息。什么是控制点?起点和控制点A的连线即为曲线最初的斜率,控制点B和终点的连线即为曲线最终的斜率。
143+
144+
``` xml
145+
<svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
146+
<path d="M 10 10 C 20 20, 40 20, 50 10" stroke="black" fill="transparent"/>
147+
</svg>
148+
```
149+
150+
![](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths/cubic_bezier_curves_with_grid.png)
151+
152+
### Q指令
153+
154+
绘制二次贝塞尔曲线`quadraticCurve`。从当前坐标绘制二次贝塞尔曲线,需要传入一个控制点坐标以及最终坐标的信息。起点的连线与控制点A的连线即为曲线最初的斜率,控制点A和终点的连线即为曲线最终的斜率。
155+
156+
``` xml
157+
<svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
158+
<path d="M 10 80 Q 95 10 180 80" stroke="black" fill="transparent"/>
159+
</svg>
160+
```
161+
162+
![](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths/quadratic_bezier_with_grid.png)
163+
164+
165+
166+
167+
168+
### Z指令
169+
170+
闭合路径,相当于Canvas中的closePath。
171+
172+
``` xml
173+
<path d="M10 10 L20 20 h10 v10 Z"/>
174+
```
175+
176+
177+
178+
179+
180+
### Path2D
181+
182+
在Canvas的API`Path2D`中,我们可以传入一个svg的路径字符串(即属性`d`的值)来构造一条Canvas的路径。
183+
184+
``` js
185+
const ctx = canvas.getContext('2d');
186+
const svgPath = `M10 10 L10 50 L 50 50 Z`;
187+
const path = new Path2D(svgPath);
188+
ctx.strokeStyle = 'pink'
189+
ctx.stroke(path)
190+
```
191+
192+
``` js
193+
const ctx = canvas.getContext('2d');
194+
const svgPath = `M10 10 L10 50 L 50 50 Z`;
195+
const path = new Path2D(svgPath);
196+
ctx.fillStyle = 'pink'
197+
ctx.fill(path)
198+
```
199+
200+
``` js
201+
const ctx = canvas.getContext('2d');
202+
const svgPath = `M10 10 L10 50 L 50 50 Z`;
203+
const path = new Path2D(svgPath);
204+
ctx.clip(path)
205+
206+
ctx.fillStyle = 'pink'
207+
ctx.fillRect(0, 0, 30, 100)
208+
```
209+

sidebars.js

+1
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ const sidebars = {
198198
label: 'Canvas',
199199
items: [
200200
'canvas/canvas',
201+
'canvas/svg',
201202
'canvas/2d',
202203
],
203204
},

0 commit comments

Comments
 (0)