SVG入门-标签1

186 阅读4分钟

概述:


SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector Graphics)。其他图像格式都是基于像素处理的,SVG 则是属于对图像的形状描述,所以它本质上是文本文件,具有体积较小,且不管放大多少倍都不会失真的优点。

SVG可以直接以DOM节点的形式,插入到页面中显示,跟其他DOM节点一样可以设置样式和通过JS操作;也可以嵌入到 <iframe> <embed>标签中显示;同时还有一个比较关键的功能是svg可以不经格式化直接转换为base64。

<img src="data:image/svg+xml;base64,[data]">

坐标:


画布

对于所有元素,SVG使用的坐标系统和Canvas用的差不多(所有计算机绘图都差不多)。这种坐标系统是:以页面的左上角为(0,0)坐标点,坐标以像素为单位,x轴正方向是向右,y轴正方向是向下。注意,这和你小时候所教的绘图方式是相反的。但是在HTML文档中,元素都是用这种方式定位的。

<rect x="0" y="0" width="100" height="100" />

定义一个矩形,即从左上角开始,向右延展100px,向下延展100px,形成一个100*100大的矩形。


画布大小

默认情况下,svg的单位为px。在SVG文档中的1px对应输出设备上的1个像素。但是svg实际渲染大小是可以改变的,否则SVG的名字也不会有scalable(可缩放)这个词。如同CSS可以定义字体的绝对大小和相对大小,SVG也可以定义绝对大小,同时SVG也能使用相对大小,只需给出数字,不标明单位,输出时就会采用用户的单位。

除此之外,SVG中图形的实际大小还与viewbox有关。

<svg width="100" height="100">

上面的元素定义了一个100*100px的SVG画布,这里1用户单位等同于1屏幕单位。

<svg width="200" height="200" viewBox="0 0 100 100">

这里定义的画布尺寸是200*200px。但是,viewBox属性定义了画布上可以显示的区域:从(0,0)点开始,100宽100高的区域。这个100100的区域,会放到200200的画布上显示。于是就形成了放大两倍的效果。

语法:


SVG也是DOM标签,接下来我们看看SVG包含那些标签。

容器标签

<svg> 跟标签,所有svg标签都放在这个标签里面,也只能放在这个标签中,才能当做svg的内容来渲染。

<svg width="100%" height="100%">
  <circle id="mycircle" cx="50" cy="50" r="50" />
</svg>

width ,height 为svg的宽高,如果缺省则默认值为300px宽,150高。svg中可以不用写单位,默认单位为px。

可视标签

<circle> 标签用于绘制直线圆形:

<svg width="300" height="180">
  <circle cx="30"  cy="50" r="25" />
  <circle cx="90"  cy="50" r="25" class="red" />
  <circle cx="150" cy="50" r="25" class="fancy" />
</svg>

其中cx,xy代表圆心坐标r为半径。

<line> 标签用于绘制直线:

<svg width="300" height="180">
  <line x1="0" y1="0" x2="200" y2="0" style="stroke:rgb(0,0,0);stroke-width:5" />
</svg>

其中x1,y1为起点坐标,x2,y2为终点坐标。

<polyline> 标签用于绘制折线:

<svg width="300" height="180">
  <polyline points="3,3 30,28 3,53" fill="none" stroke="black" />
</svg>

其中points为折线的接点,接点直接用空格分开,接点的坐标值用逗号分开。

<rect> 标签用于绘制矩形:

<svg width="300" height="180">
  <rect x="0" y="0" height="100" width="200" style="stroke: #70d5dd; fill: #dd524b" />
</svg>

其中x,y为矩形左上角坐标,width,height为宽高。

<ellipse> 标签用于绘制椭圆:

<svg width="300" height="180">
  <ellipse cx="60" cy="60" ry="40" rx="20" stroke="black" stroke-width="5" fill="silver"/>
</svg>

其中cx,cy为椭圆圆心,rx,ry为横向半径和纵向半径 。

<polygon> 标签用于绘制多边形:

<svg width="300" height="180">
  <polygon fill="green" stroke="orange" stroke-width="1" points="0,0 100,0 100,100 0,100 0,0"/>
</svg>

其中points为多边形每一个端点的坐标。

<text> 标签用于绘制字体:

<svg width="300" height="180">
  <text x="50" y="25">Hello World</text>
</svg>

x,y文本区块基线(baseline)。

<tspan> 标签用于绘制字体,只能添加在text节点下面,用于调整个别文本的样式:

<svg width="300" height="180">
  <text x="50" y="25">
    <tspan x="10" y="0">SVG</tspan> 
    <tspan x="10" y="20">SVG</tspan> 
  </text>
</svg>

x,y文本区块基线(baseline)。

<path> 标签用于绘制路径:

<svg width="300" height="180">
<path d="
  M 18,3
  L 46,3
  L 46,40
  L 61,40
  L 32,68
  L 3,40
  L 18,40
  Z
"></path>
</svg>

d表示绘制的顺序,其中d里面的字母值代表用什么样的方式绘制,后面的数字为坐标。

M :移动到

L :画直线到

Z :闭合路径

除此之外,d里面还有其他属性:

H : 水平移动到

V : 垂直移动到

C : 绘制曲线

S : 平滑曲线

Q : 二次贝塞尔曲线

T : 平滑二次贝塞尔曲线

注意:以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。

<image> 标签用于显示图片:

<svg viewBox="0 0 100 100" width="100" height="100">
  <image xlink:href="path/to/image.jpg"
    width="50%" height="50%"/>
</svg>

其中link:href属性表示图片的资源路径。

小结

svg可视的标签,大概就是这些。