概述
SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector Graphics)。其他图像格式都是基于像素处理的,SVG 则是属于对图像的形状描述,所以它本质上是文本文件,体积较小,且不管放大多少倍都不会失真。
SVG 文件可以直接插入网页,成为 DOM 的一部分,然后用 JavaScript 和 CSS 进行操作。
上面是 SVG 代码直接插入网页的例子。
SVG 代码也可以写在一个独立文件中,然后用<img>
、<object>
、<embed>
、<iframe>
等标签插入网页。
CSS 也可以使用 SVG 文件。
SVG 文件还可以转为 Base64 编码,然后作为 Data URI 写入网页。
语法
<svg>
标签
SVG 代码都放在顶层标签<svg>
之中。下面是一个例子。
<svg>
的width
属性和height
属性,指定了 SVG 图像在 HTML 元素中所占据的宽度和高度。除了相对单位,也可以采用绝对单位(单位:像素)。如果不指定这两个属性,SVG 图像的大小默认为300像素(宽)x 150像素(高)。
如果只想展示 SVG 图像的一部分,就要指定viewBox
属性。
<viewBox>
属性的值有四个数字,分别是左上角的横坐标和纵坐标、视口的宽度和高度。上面代码中,SVG 图像是100像素宽 x 100像素高,viewBox
属性指定视口从(50, 50)
这个点开始。所以,实际看到的是右下角的四分之一圆。
注意,视口必须适配所在的空间。上面代码中,视口的大小是 50 x 50,由于 SVG 图像的大小是 100 x 100,所以视口会放大去适配 SVG 图像的大小,即放大了四倍。
如果不指定width
属性和height
属性,只指定viewBox
属性,则相当于只给定 SVG 图像的长宽比。这时,SVG 图像的大小默认是所在的 HTML 元素的大小。
<circle>
标签
<circle>
标签代表圆形。
上面的代码定义了三个圆。<circle>
标签的cx
、cy
、r
属性分别为横坐标、纵坐标和半径,单位为像素。坐标都是相对于<svg>
画布的左上角原点。
class
属性用来指定对应的 CSS 类。
SVG 的 CSS 属性与网页元素有所不同。
- fill:填充色
- stroke:描边色
- stroke-width:边框宽度
<line>
标签: 绘制直线
<line>
标签用来绘制直线。
上面代码中,<line>
标签的x1
属性和y1
属性,表示线段起点的横坐标和纵坐标;x2
属性和y2
属性,表示线段终点的横坐标和纵坐标;style
属性表示线段的样式。
<polyline>
标签:绘制折线
<polyline>
标签用于绘制一根折线。
<polyline>
的points
属性指定了每个端点的坐标,横坐标与纵坐标之间与逗号分隔,点与点之间用空格分隔。
<rect>
标签:绘制矩形
<rect>
标签用于绘制矩形。
<rect>
的x
属性和y
属性,指定了矩形左上角端点的横坐标和纵坐标;width
属性和height
属性指定了矩形的宽度和高度(单位像素)。
<ellipse>
标签: 绘制椭圆
<ellipse>
标签用于绘制椭圆。
<ellipse>
的cx
属性和cy
属性,指定了椭圆中心的横坐标和纵坐标(单位像素);rx
属性和ry
属性,指定了椭圆横向轴和纵向轴的半径(单位像素)。
<polygon>
标签: 绘制多边形
<polygon>
标签用于绘制多边形。
<polygon>
的points
属性指定了每个端点的坐标,横坐标与纵坐标之间与逗号分隔,点与点之间用空格分隔。
<path>
标签: 绘制路径
<path>
标签用于绘制路径。
<path>
的d
属性表示绘制顺序,它的值是一个长字符串,每个字母表示一个绘制动作,后面跟着坐标。
- M:移动到(moveto)
- L:画直线到(lineto)
- Z:闭合路径
<text>
标签: 绘制文本
<text>
标签用于绘制文本。
<text>
的x
属性和y
属性,表示文本区块基线(baseline)起点的横坐标和纵坐标。文字的样式可以用class
或style
属性指定。
<use>
标签: 复制一个形状
<use>
标签用于复制一个形状。
<use>
的href
属性指定所要复制的节点,x
属性和y
属性是<use>
左上角的坐标。另外,还可以指定width
和height
坐标。
<g>
标签: 多个形状组成一个组
<g>
标签用于将多个形状组成一个组(group),方便复用。
<defs>
标签: 自定义形状
<defs>
标签用于自定义形状,它内部的代码不会显示,仅供引用。
<pattern>
标签: 自定义一个形状平铺区域
<pattern>
标签用于自定义一个形状,该形状可以被引用来平铺一个区域。
上面代码中,<pattern>
标签将一个圆形定义为dots
模式。patternUnits="userSpaceOnUse"
表示<pattern>
的宽度和长度是实际的像素值。然后,指定这个模式去填充下面的矩形。
<image>
标签: 插入图片文件
<image>
标签用于插入图片文件。
上面代码中,<image>
的xlink:href
属性表示图像的来源。
<animate>
标签: 产生动画效果
<animate>
标签用于产生动画效果。
上面代码中,矩形会不断移动,产生动画效果。
<animate>
的属性含义如下。
- attributeName:发生动画效果的属性名。
- from:单次动画的初始值。
- to:单次动画的结束值。
- dur:单次动画的持续时间。
- repeatCount:动画的循环模式。
可以在多个属性上面定义动画。
<animate>
标签对 CSS 的transform
属性不起作用,如果需要变形,就要使用<animateTransform>
标签。
上面代码中,<animateTransform>
的效果为旋转(rotate
),这时from
和to
属性值有三个数字,第一个数字是角度值,第二个值和第三个值是旋转中心的坐标。from="0 200 200"
表示开始时,角度为0,围绕(200, 200)
开始旋转;to="360 400 400"
表示结束时,角度为360,围绕(400, 400)
旋转。
JavaScript 操作
DOM 操作
如果 SVG 代码直接写在 HTML 网页之中,它就成为网页 DOM 的一部分,可以直接用 DOM 操作。
上面代码插入网页之后,就可以用 CSS 定制样式。
然后,可以用 JavaScript 代码操作 SVG。
上面代码指定,如果点击图形,就改写circle
元素的r
属性。
获取 SVG DOM
使用<object>
、<iframe>
、<embed>
标签插入 SVG 文件,可以获取 SVG DOM。
注意,如果使用<img>
标签插入 SVG 文件,就无法获取 SVG DOM。
读取 SVG 源码
由于 SVG 文件就是一段 XML 文本,因此可以通过读取 XML 代码的方式,读取 SVG 源码。
使用XMLSerializer
实例的serializeToString()
方法,获取 SVG 元素的代码。
首先,需要新建一个Image
对象,将 SVG 图像指定到该Image
对象的src
属性。
然后,当图像加载完成后,再将它绘制到<canvas>
元素。
实例:折线图
下面将一张数据表格画成折线图。
Date |Amount
-----|------
2014-01-01 | $10
2014-02-01 | $20
2014-03-01 | $40
2014-04-01 | $80
上面的图形,可以画成一个坐标系,Date
作为横轴,Amount
作为纵轴,四行数据画成一个数据点。
参考链接