SVG 教程

280 阅读8分钟

SVG 意为可缩放矢量图形(Scalable Vector Graphics)。

什么是SVG?

  • SVG 指可伸缩矢量图形 (Scalable Vector Graphics)
  • SVG 用来定义用于网络的基于矢量的图形
  • SVG 使用 XML 格式定义图形
  • SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失
  • SVG 是万维网联盟的标准
  • SVG 与诸如 DOM 和 XSL 之类的 W3C 标准是一个整体

SVG 实例

下面的例子是一个简单的 SVG 文件的例子。SVG 文件必须使用 .svg 后缀来保存:

<?xml version="1.0" standalone="no"?>

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<circle cx="100" cy="50" r="40" stroke="black"
stroke-width="2" fill="red"/>

</svg>

代码解释:

第一行包含了 XML 声明。请注意 standalone 属性!该属性规定此 SVG 文件是否是“独立的”,或含有对外部文件的引用。

standalone="no" 意味着 SVG 文档会引用一个外部文件 - 在这里,是 DTD 文件。

第二和第三行引用了这个外部的 SVG DTD。该 DTD 位于 “www.w3.org/Graphics/SV… DTD 位于 W3C,含有所有允许的 SVG 元素。

SVG 代码以 元素开始,包括开启标签 和关闭标签 。这是根元素。width 和 height 属性可设置此 SVG 文档的宽度和高度。version 属性可定义所使用的 SVG 版本,xmlns 属性可定义 SVG 命名空间。

SVG 的 用来创建一个圆。cx 和 cy 属性定义圆中心的 x 和 y 坐标。如果忽略这两个属性,那么圆点会被设置为 (0, 0)。r 属性定义圆的半径。

stroke 和 stroke-width 属性控制如何显示形状的轮廓。我们把圆的轮廓设置为 2px 宽,黑边框。

fill 属性设置形状内的颜色。我们把填充颜色设置为红色。

关闭标签的作用是关闭 SVG 元素和文档本身。

注释:所有的开启标签必须有关闭标签!

SVG 文件可通过以下标签嵌入 HTML 文档:<embed><object> 或者 <iframe>

使用 <embed> 标签

<embed> 标签被所有主流的浏览器支持,并允许使用脚本。

注释:当在 HTML 页面中嵌入 SVG 时使用 <embed> 标签是 Adobe SVG Viewer 推荐的方法!然而,如果需要创建合法的 XHTML,就不能使用 <embed>。任何 HTML 规范中都没有 <embed> 标签。

  • 注释:pluginspage 属性指向下载插件的 URL。

    使用 <object> 标签

<object> 标签是 HTML 4 的标准标签,被所有较新的浏览器支持。它的缺点是不允许使用脚本。

注释:假如您安装了最新版本的 Adobe SVG Viewer,那么当使用 <object> 标签时 SVG 文件无法工作(至少不能在 IE 中工作)!

  • 注释:codebase 属性指向下载插件的 URL

    使用 <iframe> 标签

<iframe> 标签可工作在大部分的浏览器中。

## SVG 形状

SVG 有一些预定义的形状元素,可被开发者使用和操作:

  • 矩形 <rect>

  • 圆形 <circle>

  • 椭圆 <ellipse>

  • 线 <line>

  • 折线 <polyline>

  • 多边形 <polygon>

  • 路径 <path>

    <rect> 标签 矩形

代码解释:

  • rect 元素的 width 和 height 属性可定义矩形的高度和宽度

  • style 属性用来定义 CSS 属性

  • CSS 的 fill 属性定义矩形的填充颜色(rgb 值、颜色名或者十六进制值)

  • CSS 的 stroke-width 属性定义矩形边框的宽度

  • CSS 的 stroke 属性定义矩形边框的颜色

    例子,创建带有圆角的矩形:
    
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<rect x="20" y="20" rx="20" ry="20" width="250"
height="100" style="fill:red;stroke:black;
stroke-width:5;opacity:0.5"/>

</svg>
    
    rx 和 ry 属性可使矩形产生圆角。

<circle> 标签 圆形

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<circle cx="100" cy="50" r="40" stroke="black"
stroke-width="2" fill="red"/>

</svg>
    
    cx 和 cy 属性定义圆点的 x 和 y 坐标。如果省略 cx 和 cy,圆的中心会被设置为 (0, 0)

r 属性定义圆的半径。

<ellipse> 标签 椭圆

  • cx 属性定义圆点的 x 坐标

  • cy 属性定义圆点的 y 坐标

  • rx 属性定义水平半径

  • ry 属性定义垂直半径

    椭圆与圆很相似。不同之处在于椭圆有不同的 x 和 y 半径,而圆的 x 和 y 半径是相同的。
    
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<ellipse cx="300" cy="150" rx="200" ry="80"
style="fill:rgb(200,100,50);
stroke:rgb(0,0,100);stroke-width:2"/>

</svg>

创建了三个累叠而上的椭圆:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<ellipse cx="240" cy="100" rx="220" ry="30"
style="fill:purple"/>

<ellipse cx="220" cy="70" rx="190" ry="20"
style="fill:lime"/>

<ellipse cx="210" cy="45" rx="170" ry="15"
style="fill:yellow"/>

</svg>

<line> 标签 线条

  • x1 属性在 x 轴定义线条的开始
  • y1 属性在 y 轴定义线条的开始
  • x2 属性在 x 轴定义线条的结束
  • y2 属性在 y 轴定义线条的结束
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<line x1="0" y1="0" x2="300" y2="300"
style="stroke:rgb(99,99,99);stroke-width:2"/>

</svg>

<polygon> 标签 多边图形(三个以上)

创建一个四边形:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<polygon points="220,100 300,210 170,250 123,234"
style="fill:#cccccc;
stroke:#000000;stroke-width:1"/>

</svg>

<path> 标签 路径

  • M = moveto
  • L = lineto
  • H = horizontal lineto
  • V = vertical lineto
  • C = curveto
  • S = smooth curveto
  • Q = quadratic Belzier curve
  • T = smooth quadratic Belzier curveto
  • A = elliptical Arc
  • Z = closepath

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

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<path d="M250 150 L150 350 L350 350 Z" />

</svg>

上面的例子定义了一条路径,它开始于位置 250 150,到达位置 150 350,然后从那里开始到 350 350,最后在 250 150 关闭路径。

SVG 渐变

渐变是一种从一种颜色到另一种颜色的平滑过渡。另外,可以把多个颜色的过渡应用到同一个元素上。

在 SVG 中,有两种主要的渐变类型:

  • 线性渐变
  • 放射性渐变

线性渐变

<linearGradient> 可用来定义 SVG 的线性渐变。

<linearGradient> 标签必须嵌套在 <defs> 的内部。<defs> 标签是 definitions 的缩写,它可对诸如渐变之类的特殊元素进行定义。

线性渐变可被定义为水平、垂直或角形的渐变:

  • 当 y1 和 y2 相等,而 x1 和 x2 不同时,可创建水平渐变
  • 当 x1 和 x2 相等,而 y1 和 y2 不同时,可创建垂直渐变
  • 当 x1 和 x2 不同,且 y1 和 y2 不同时,可创建角形渐变
    
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<defs>
<linearGradient id="orange_red" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:rgb(255,255,0);
stop-opacity:1"/>
<stop offset="100%" style="stop-color:rgb(255,0,0);
stop-opacity:1"/>
</linearGradient>
</defs>

<ellipse cx="200" cy="190" rx="85" ry="55"
style="fill:url(#orange_red)"/>

</svg>
  • <linearGradient> 标签的 id 属性可为渐变定义一个唯一的名称
  • fill:url(#orange_red) 属性把 ellipse 元素链接到此渐变
  • <linearGradient> 标签的 x1、x2、y1、y2 属性可定义渐变的开始和结束位置
  • 渐变的颜色范围可由两种或多种颜色组成。每种颜色通过一个<stop>标签来规定。offset 属性用来定义渐变的开始和结束位置。

放射性渐变

<radialGradient> 用来定义放射性渐变。

<radialGradient> 标签必须嵌套在 <defs> 中。<defs> 标签是 definitions 的缩写,它允许对诸如渐变等特殊元素进行定义

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<defs>
<radialGradient id="grey_blue" cx="50%" cy="50%" r="50%"
fx="50%" fy="50%">
<stop offset="0%" style="stop-color:rgb(200,200,200);
stop-opacity:0"/>
<stop offset="100%" style="stop-color:rgb(0,0,255);
stop-opacity:1"/>
</radialGradient>
</defs>

<ellipse cx="230" cy="200" rx="110" ry="100"
style="fill:url(#grey_blue)"/>

</svg>

<radialGradient> 标签的 id 属性可为渐变定义一个唯一的名称,fill:url(#grey_blue) 属性把 ellipse 元素链接到此渐变,cx、cy 和 r 属性定义外圈,而 fx 和 fy 定义内圈 渐变的颜色范围可由两种或多种颜色组成。

每种颜色通过一个 <stop> 标签来规定。

offset 属性用来定义渐变的开始和结束位置。

SVG 元素

元素列中的链接指向了具体元素的相关属性和更多有用的信息。

元素描述
a定义超链接
altGlyph允许对象性文字进行控制,来呈现特殊的字符数据(例如,音乐符号或亚洲的文字)
altGlyphDef定义一系列象性符号的替换(例如,音乐符号或者亚洲文字)
altGlyphItem定义一系列候选的象性符号的替换
animate随时间动态改变属性
animateColor规定随时间进行的颜色转换
animateMotion使元素沿着动作路径移动
animateTransform对元素进行动态的属性转换
circle定义圆
clipPath 
color-profile规定颜色配置描述
cursor定义独立于平台的光标
definition-src定义单独的字体定义源
defs被引用元素的容器
desc对 SVG 中的元素的纯文本描述 - 并不作为图形的一部分来显示。用户代理会将其显示为工具提示。
ellipse定义椭圆
feBlendSVG 滤镜。使用不同的混合模式把两个对象合成在一起。
feColorMatrixSVG 滤镜。应用matrix转换。
feComponentTransferSVG 滤镜。执行数据的 component-wise 重映射。
feCompositeSVG 滤镜。
feConvolveMatrixSVG 滤镜。
feDiffuseLightingSVG 滤镜。
feDisplacementMapSVG 滤镜。
feDistantLightSVG 滤镜。 Defines a light source
feFloodSVG 滤镜。
feFuncASVG 滤镜。feComponentTransfer 的子元素。
feFuncBSVG 滤镜。feComponentTransfer 的子元素。
feFuncGSVG 滤镜。feComponentTransfer 的子元素。
feFuncRSVG 滤镜。feComponentTransfer 的子元素。
feGaussianBlurSVG 滤镜。对图像执行高斯模糊。
feImageSVG 滤镜。
feMergeSVG 滤镜。创建累积而上的图像。
feMergeNodeSVG 滤镜。feMerge的子元素。
feMorphologySVG 滤镜。 对源图形执行"fattening" 或者 "thinning"。
feOffsetSVG 滤镜。相对与图形的当前位置来移动图像。
fePointLightSVG 滤镜。
feSpecularLightingSVG 滤镜。
feSpotLightSVG 滤镜。
feTileSVG 滤镜。
feTurbulenceSVG 滤镜。
filter滤镜效果的容器。
font定义字体。
font-face描述某字体的特点。
font-face-format 
font-face-name 
font-face-src 
font-face-uri 
foreignObject 
g用于把相关元素进行组合的容器元素。
glyph为给定的象形符号定义图形。
glyphRef定义要使用的可能的象形符号。
hkern 
image 
line定义线条。
linearGradient定义线性渐变。
marker 
mask 
metadata规定元数据。
missing-glyph 
mpath 
path定义路径。
pattern 
polygon定义由一系列连接的直线组成的封闭形状。
polyline定义一系列连接的直线。
radialGradient定义放射形的渐变。
rect定义矩形。
script脚本容器。(例如ECMAScript)
set为指定持续时间的属性设置值
stop 
style可使样式表直接嵌入SVG内容内部。
svg定义SVG文档片断。
switch 
symbol 
text 
textPath 
title对 SVG 中的元素的纯文本描述 - 并不作为图形的一部分来显示。用户代理会将其显示为工具提示。
tref 
tspan 
use 
view 
vkern