svg可缩放矢量图形(scalable vector graphics)是基于可扩展标记语言(xml),用于描述二维矢量图形的一种图形格式。svg是w3c制定的一种新的二维矢量图形格式,也是规范中的网络矢量图形标准。svg严格遵从xml语法,并用文本格式的描述性语言来描述图像内容,因此是一种和图像分辨率无关的矢量图形格式。

什么是svg?

  svg 指可伸缩矢量图形 (scalable vector graphics)
  svg 用来定义用于网络的基于矢量的图形
  svg 使用 xml 格式定义图形
  svg 图像在放大或改变尺寸的情况下其图形质量不会有所损失
  svg 是万维网联盟的标准
  svg 与诸如 dom 和 xsl 之类的 w3c 标准是一个整体 

canvas 和 svg 的区别:

svg

svg 是一种使用 xml 描述 2d 图形的语言。
svg 基于 xml,这意味着 svg dom 中的每个元素都是可用的。您可以为某个元素附加 javascript 事件处理器。
在 svg 中,每个被绘制的图形均被视为对象。如果 svg 对象的属性发生变化,那么浏览器能够自动重现图形。

特点: 

不依赖分辨率
支持事件处理器
最适合带有大型渲染区域的应用程序(比如谷歌地图)
复杂度高会减慢渲染速度(任何过度使用 dom 的应用都不快)
不适合游戏应用 

canvas 

canvas 通过 javascript 来绘制 2d 图形。
canvas 是逐像素进行渲染的。
在 canvas 中,一旦图形被绘制完成,它就不会继续得到浏览器的关注。如果其位置发生变化,那么整个场景也需要重新绘制,包括任何或许已被图形覆盖的对象。

特点:

依赖分辨率
不支持事件处理器
弱的文本渲染能力
能够以 .png 或 .jpg 格式保存结果图像
最适合图像密集型的游戏,其中的许多对象会被频繁重绘

简单例子:

<svg width="100%" height="100%"  >
        <circle cx="300" cy="60" r="50" stroke="#ff0" stroke-width="3" fill="red" />
</svg>

位图与矢量图

  以前,浏览器中显示的图形,例如jpeg、gif等,都是位图,这些图像格式是基于光栅的。在光栅图像中,图像文件定义了图像中每个像素的颜色值。浏览器需要读取这些值并做出相应行动。这种图像的再现能力比较强,但是在某些情形下会显得不足。例如,当浏览器以不同大小显示一副图像时,通常会产生锯齿边缘,这时,浏览器不得不为那些在原始图像中不存在的像素插入或猜测数值;这样会导致图像失真。此外,针对位图进行动画,最多也仅限于生成“翻动书本”类型的动画,即快速连续地显示单独图像。

  矢量图通过指定为确定每个像素的值所需的指令而不是指定这些值本身,克服了这些困难中的一部分。例如,向量图形不再为一个直径一英寸的圆提供像素值,而是告诉浏览器创建一个直径一英寸的圆,然后让浏览器(或插件)做其余事情。这消除了光栅图形的许多限制;使用向量图形,浏览器只要知道它必须画一个圆。如果图像需要以正常大小的三倍来显示,那么浏览器只要按正确的大小画圆而不必执行光栅图像通常的插入法。类似地,浏览器接收的指令可以更容易地与外部信息源(如应用程序和数据库)绑定,要对图像制作动画,浏览器只要接收有关如何操纵属性(如半径或颜色)的指令即可。

  html体系中,最常用的绘制矢量图的技术是svg和html5新增加的canvas元素。这两种技术都支持绘制矢量图和光栅图。

svg概述

  可缩放矢量图形(scalable vector graphics,简称svg)是一种使用xml来描述二维图形的语言(svg严格遵从xml语法)。 svg允许三种类型的图形对象:矢量图形形状(例如由直线和曲线组成的路径)、图像和文本。 可以将图形对象(包括文本)分组、样式化、转换和组合到以前呈现的对象中。 svg 功能集包括嵌套转换、剪切路径、alpha 蒙板和模板对象。 

  svg绘图是交互式和动态的。 例如,可使用脚本来定义和触发动画。这一点与flash相比很强大。flash是二进制文件,动态创建和修改都比较困难。而svg是文本文件,动态操作是相当容易的。而且,svg直接提供了完成动画的相关元素,操作起来非常方便。

  svg与其他web标准兼容,并直接支持文档对象模型dom。这一点也是与html5中的canvas相比很强大的地方(这里注意,svg内部也是用一个类似的canvas这样的东西来展示svg图形,到后面你会发现很多特性和html5的canvas还有点像;文中如果没明确说明是svg的canvas的话,都代指html5中的canvas元素)。因而,可以很方便的使用脚本实现svg的很多高级应用。而且svg的图形元素基本上都支持dom中的标准事件。可将大量事件处理程序(如“onmouseover”和“onclick”)分配给任何svg图形对象。 虽然svg的渲染速度比不上canvas元素,但是胜在dom操作很灵活,这个优势完全可以弥补速度上的劣势。

  svg既可以说是一种协议,也可以说是一门语言;既是html的一个标准元素,也是一种图片格式。
  svg并不是html5中的东西,但是也算页面时兴的技术之一,姑且也放到这个专题下了。

svg与其它图片格式的比较
  svg与其它的图片格式相比,有很多优点(很多优点来源于矢量图的优点):
• svg文件是纯粹的xml, 可被非常多的工具读取和修改(比如记事本)。
• svg 与jpeg 和gif图像比起来,尺寸更小,且可压缩性更强,总结,矢量图,内存小,放大不失真。
• svg 是可伸缩的,可在图像质量不下降的情况下被放大,可在任何的分辨率下被高质量地打印。
• svg 图像中的文本是可选的,同时也是可搜索的(很适合制作地图)。
• svg 可以与 java 技术一起运行。
• svg 是开放的标准。

svg与flash的比较

  svg 的主要竞争者是flash。与flash相比,svg 最大的优势是它与其他标准(比如xsl和dom)相兼容,操作方便,而flash则是未开源的私有技术。其它的比如存储的格式,动态生成图形等方面,svg也占有很大的优势。

svg的呈现方式

  关于支持html5与svg的浏览器不是这里讨论的重点,基本上装上最新的chrome或者firefox浏览器就差不多了(ie用户请装ie9就对了,至于ie9之前的版本,需要装svg的插件,这里就直接略过了)。对于直接支持svg的浏览器,svg主要采用两面两种呈现的方式。

 内联到html

   svg是标准的html元素,直接写到html中就可以了,看下面的例子:

<?xml version="1.0" encoding="utf-8"?>
<!doctype html>
<html>
<head>
  <!-- <meta content="text/html; charset=utf-8" http-equiv="content-type" /> -->
  <title> my first svg page</title>
</head>
<body>
  <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
       width="200px" height="200px">
    <rect x="0" y="0" width="100%" height="100%"
          fill="none" stroke="black"/>
    <circle cx="100" cy="100" r="50"
            style="stroke: black; fill: red;"/>
  </svg>
</body>
</html>

  请注意开头的部分xml声明,与svg的命名空间xmlns、版本version等部分,主要是考虑兼容性的问题;这些部分在html5中基本都可以不用写了(写不写还是自己瞧着办吧)。

 独立svg文件

 独立svg指的是通过使用svg文件扩展名来提供向量图形文件格式。在浏览器中嵌入这个svg文件就可以使用了。

1.独立的svg文件/页面,定义的模板基本就像下面的一样:

<svg width="100%" height="100%">   
  <!-- svg markup here. -->    
</svg>

把这样的文本文件保存成以svg为扩展名的文件,例如sun.svg,这样的文件可以直接用浏览器打开浏览,也可以作为引用嵌入到别的页面中。

2.html引用外部的svg文件。

使用object或者img元素嵌入svg图形就可以了,例如下面的小例子:

<!doctype html>
<html>
<head>
  <title> my first svg page</title>
</head>
<body>
  <object data="sun.svg" type="image/svg+xml"
          width="300px" height="300px">
    <!-- implement fallback code here, or display a message: -->
    <p>your browser does not support svg - please upgrade to a modern browser.</p>
  </object>

  <img src="sun.svg" alt="svg not supported!" />
</body>
</html>

其实svg也可以放在其他的xml文档中,也可以像其他的xml文档一样,使用xml相关的技术格式化和验证,这个不是重点,此处略去了。

svg的渲染顺序

svg是严格按照定义元素的顺序来渲染的,这个与html靠z-index值来控制分层不一样。在svg中,写在前面的元素先被渲染,写在后面的元素后被渲染。后渲染的元素会覆盖前面的元素,虽然有时候受透明度影响,看起来不是被覆盖的,但是svg确实是严格按照先后顺序来渲染的。

注意:svg是以xml定义的,所以是大小写敏感的,这点与html不一样。

突袭html5之svg 2d入门2 – 图形绘制

<svg width="200" height="250">
  <rect x="10" y="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5"/>
  <rect x="60" y="10" rx="10" ry="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5"/>

  <circle cx="25" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
  <ellipse cx="75" cy="75" rx="20" ry="5" stroke="red" fill="transparent" stroke-width="5"/>

  <line x1="10" x2="50" y1="110" y2="150" stroke="orange" fill="transparent" stroke-width="5"/>
  <polyline points="60 110 65 120 70 115 75 130 80 125 85 140 90 135 95 150 100 145"
      stroke="orange" fill="transparent" stroke-width="5"/>

  <polygon points="50 160 55 180 70 180 60 190 65 205 50 195 35 205 40 190 30 180 45 180"
      stroke="green" fill="transparent" stroke-width="5"/>

  <path d="m20,230 q40,205 50,230 t90,230" fill="none" stroke="blue" stroke-width="5"/>
</svg>

这个例子画了很多形状:正常的矩形,带圆角的矩形,圆形,椭圆形,直线,折线,多边形,还有路径。这些都属于基本的图形元素。虽然绘制一个图形有很多种方式,比如矩形可以用rect实现,也可以用path等实现,但是我们还是应该尽量保持svg的内容短小精悍,易于阅读。