
写在前面
。因为SVG里面的内容真的太多了,本篇只涵盖我研究过的部分,其他部分感兴趣的话在文中的链接内自行查看哦
1. 矢量图和位图





学过HTML的同学肯定会很熟悉,XML(EXtensible Markup Language)指可扩展标记语言,它用于标记电子文件而使其具有结构性,XML常被用来标记、传输和存储数据。如果没有学过HTML的话,那么JSON格式的数据大家一定不陌生,JSON和XML属于目前常用的两种数据交换格式,或者说互联网中存储和传输过程中使用的数据格式。(有关JSON数据的读取貌似在后面我也会写一篇文,我想写的也太多了
)<svg version="1.1" width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><title>Example</title><circle cx="20" cy="20" r="20" fill="lightblue"></circle><rect x="20" y="20" width="50" height="70" fill="none" stroke="green"></rect><path d="M 50 50 L 150 50 L 100 150 Z" fill="pink" stroke="red" stroke-width="3"></path></svg>


标签二:<title>Example</title> 比较简单,标签<title>定义了一个描述性的字符串,这个字符串只能是纯文本。这个title会显示在网页的标题上。
标签三:<circle cx="20" cy="20" r="20" fill="lightblue" stroke="none"></circle> 绘制了一个圆,<circle>标签属性有cx,cy,r,和fill。分别代表圆心的x坐标,y坐标,圆的半径和填充色。如果不设置圆心坐标,则默认为左上角(0,0)。
标签四:<rect x="20" y="20" width="50" height="70" fill="none" stroke="green"></rect> 绘制了一个矩形,<rect>标签包含x,y,width,height,fill和stroke 6个属性,分别代表举行左上角的x坐标,y坐标,举行宽度,高度,填充色和轮廓颜色。和圆相同,如果不设置x和y坐标则默认为(0,0)。另外,fill=“none”代表了无填充色,也可以设置为“transparent”透明填充色。
标签五:<path d="M 50 50 L 150 50 L 100 150 z" fill="pink" stroke="red" stroke-width="3"></path> 则是绘制了一条路径,有关<path>标签的具体内容在后文会详细介绍。这里先介绍属性,包括d,fill,stroke和stroke-width,代表路径,填充色,轮廓颜色和轮廓宽度。
我们从图中还可以发现三个形状是一个叠着一个的,类似于三个图层,后面的形状会覆盖掉前面的形状。另外,SVG文件中还有许多的标签,<path>标签中的属性还可以画出各种各样的图形。除了在刚才提到的官网上可以找到各类标签的详细解释之外,还有一个网站也很推荐,可以选择中文版:https://developer.mozilla.org/en-US/docs/Web/SVG 
2. 有关SVG中的<path>
最后一部分详细介绍一下神奇的<path>标签,这个标签是SVG中功能最强大的一个,除了上文创建的矩形,圆形,还可以在属性d中绘制非常多的形状。那么属性d的值是什么?简单来说,它是由“命令+参数”的序列构成的字符串。接下来就介绍一下属性d中的所有命令。
提前说几个点:所有的命令都有大写和小写之分,大写表示绝对位置,小写代表相对位置;命令最后的参数表示最后要到达的位置;上一个命令结束的位置即为下一个命令开始的位置,下文中会用“当前点”代表这个位置。
3.1 moveto(M/m):
moveto命令代表一条路径的开始,可以认为是在纸上画线时首先点上的一个点,之后的命令和所设置的参数会从这个点开始连接。moveto的参数是(x y)+,代表这个起始点的x和y坐标。参数中的“+”并不需要输入,只是代表这条路径没有结束,还会继续连接到下一个命令下一个点,所有的命令中只有关闭路径参数Z没有“+”。
3.2 lineto(L/l):
lineto命令表示从当前点到参数(x,y)点绘制一条直线,它的参数为(x y)+。这里的当前点代表是前一个参数设置的的坐标点。
3.3 horizontal lineto(H/h):
horizontal lineto命令和lineto命令相似,不过它是从当前点到参数x点绘制一条水平线,参数是 x +。
3.4 vertical lineto(V/v):
vertical lineto命令是从当前点绘制一条垂直线,参数是 y +。
在开始下一个命令之前,先介绍一下贝塞尔曲线(Bézier curve),这是一种由两个定点和零至无数个控制点绘制的曲线,属性d中的命令会绘制二次贝塞尔曲线和三次贝塞尔曲线。贴一个网址:https://www.jasondavies.com/animated-bezie,里面包括了贝塞尔曲线的动画,还有相关介绍(下图截取自该网页,从左至右依次是一次、二次、三次和四次贝塞尔曲线的动画):

<svg version="1.1" viewBox="-150 -150 1000 1000" xmlns="http://www.w3.org/2000/svg"><style type="text/css"><![CDATA[.Connect { stroke:#888888; stroke-width:2 }.SamplePath {}.Point { fill:#888888 }]]></style><!--二次贝塞尔曲线--><path class="SamplePath" d="M20 100 Q100 300 310 100" fill = "none" stroke="red" stroke-width = "8"/><circle class="Point" cx="20" cy="100" r="8"/><!--起点--><circle class="Point" cx="100" cy="300" r="8"/><!--控制点--><circle class="Point" cx="310" cy="100" r="8"/><!--终点--><polyline class="Connect" points="20 100 100 300"/><polyline class="Connect" points="310 100 100 300"/><!--二次平滑贝塞尔曲线你--><path class="SamplePath" d="M20 100 Q100 300 310 100 T500 300" fill="none" stroke="blue" stroke-width = "3"/><circle class="Point" cx="520" cy="-100" r="8"/><!--控制点--><circle class="Point" cx="500" cy="300" r="8"/><!--终点--><polyline class="Connect" points="500 300 520 -100"/><polyline class="Connect" points="310 100 520 -100"/></svg>
):
<svg version="1.1" viewBox="-150 -150 1000 1000" xmlns="http://www.w3.org/2000/svg"><style type="text/css"><![CDATA[.Connect { stroke:#888888; stroke-width:2 }.SamplePath {}.Point { fill:#888888 }]]></style><!--三次贝塞尔曲线--><path class="SamplePath" d="M20 100 C100 200 300 300 400 100" fill = "none" stroke="red" stroke-width = "8"/><circle class="Point" cx="20" cy="100" r="8"/><!--起点--><circle class="Point" cx="100" cy="200" r="8"/><!--控制点1--><circle class="Point" cx="300" cy="300" r="8"/><!--控制点2--><circle class="Point" cx="400" cy="100" r="8"/><!--终点--><polyline class="Connect" points="20 100 100 200"/><polyline class="Connect" points="300 300 400 100"/><!--三次平滑贝塞尔曲线你--><path class="SamplePath" d="M20 100 C100 200 300 300 400 100 S400 300 500 300" fill="none" stroke="blue" stroke-width = "3"/><circle class="Point" cx="500" cy="-100" r="8"/><!--控制点1--><circle class="Point" cx="400" cy="300" r="8"/><!--控制点2--><circle class="Point" cx="500" cy="300" r="8"/><!--终点--><polyline class="Connect" points="400 100 500 -100"/><polyline class="Connect" points="400 300 500 300"/></svg>
最终画出的曲线如下图所示,左边红色的一段是使用命令C画出的三次贝塞尔曲线,蓝色的长曲线是在C命令后又加上了S命令画出的两条三次贝塞尔曲线曲线,曲线自动取了C命令中控制点2关于曲线终点的对称点作为新的控制点1,C命令中的曲线终点作为新的起点。

两条三次贝塞尔曲线(一条C,一条CS)
这些参数为rx(radius-x)弧线所在椭圆的x半轴长,ry(radius-y)弧线所在椭圆的y半轴长,xr(x-axis-rotaiton)弧线所在椭圆的长轴角度,laf(large-arc-flag)是否选择弧长较长的一段弧线,sf(sweep-flag)是否选择逆时针防线的那一段弧线,x弧线终点x坐标,y弧线终点y坐标。
,弧线虽然难画,但是可以实现各种曲线,在这里我画了一个桃心,还加入了另一个超有用的标签<animate>显示动画,前方彩色爱心出没
:

<svg version = "1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path d="M 10 30 A 20 20 0 0 1 50 30 A 20 20 0 0 1 90 30 Q 90 60 50 90 Q 10 60 10 30 z" fill = "red"><animate attributeName="fill" values="red; orange; yellow; green; pink" dur="2s" repeatCount="indefinite"></animate></path></svg>
累了
,只想感叹懂得还是太少了。当时刚接触SVG的时候更是一团乱麻,不知从何下手,不过慢慢地还是整理得稍微清楚了一点,继续学习吧,顺便抓紧把下一篇写了。我觉得我攒的内容根本写不完了
END
~




