html5中的SVG和Canvas

学习html5时都会碰到svg和canvas,这两个都可以在浏览器中绘制图形,那么这两个有什么区别呢。下面对两者进行比较。


SVG介绍

SVG(Scable vector Graphics 可缩放矢量图形)
是一种使用XML来描述2D图形的语言;
因为是基于XML,那么svg DOM中的每一个元素都可以,绑定上javascript事件处理器;
在svg中每一个绘制的图形都被视为对象,svg元素的属性发生变化那么浏览器也会重新渲染图形的。

注意:

1、SVG并不属于html5专有内容,在html5之前就有SVG。

2、SVG文件的扩展名是".svg"。

3、SVG绘制的图像在图片质量不下降的情况下被放大。

4、SVG图像经常在网页中制作小图标和一些动态效果图。

使用

在html5中使用svg必须使用<svg></svg>标签。(svg绘制所有的图形必须都要在<svg></svg>中绘制)。

<svg></svg>形成的区域大小为300px*150px

1、绘制矩形
<svg style="background:pink;width:400px;height:400px">
   <reac x="10" y="10" width="100" height="100" fill="blue"  stroke="black" stroke-weight="5"/>
</svg>

其中svg标签里的style是svg的属性,不是css属性。

2、绘制圆形
<svg>
<circle cx="" cy="" r=""/>
</svg>

cx和cy表示圆心的坐标,r表示圆的半径

3、绘制椭圆
<svg>
    <ellipse cx="" cy="" rx="" ry=""/>
</svg>

cx和cy表示椭圆的中心,rx和ry表示椭圆的长轴和短轴。

4、绘制直线
<svg>
  <line x1="" y1=""  x2="" y2="" />
</svg>

x1和y1表示起始点的坐标,x2,y2终止点的坐标。

5、绘制折线
<svg>
<polyline points="10,10 200,10 200,200 10,200 " stroke-width="5" stroke="black" />
</svg>
6、绘制多边形
<svg>
<polyline points="10,10 200,10 200,200 10,200  10,10" stroke-width="5" stroke="black" fill="white"/>
</svg>

特殊元素

渐变,渐变元素定义在<defs></defs>标签内

1、线性渐变

<linearGradient>标签

<svg width="400px" height="400px">
<defs>
  <linearGradient id="mygrad" x1="0" y1="0" x2="100%",y2="100%">
   <stop offset="0" stop-color="red"/>
   <stop offest="50%" stop-color="green">
   <stop offest="100%" stop-color="blue">
 </linearGrdient>
</defs>
<react x="0" y="0" width="400" height="400" fill="url(#mygrad)"/>
</svg>

注意linearGradient的id和react的填充地址。

2、扇形渐变

<radialGradient>,使用方式同上

3、滤镜(高斯模糊)

<feGaussianBlur>,高斯模糊是滤镜的一种特殊使用方式

<svg width="500px" heihgt="600px">
  <defs>
    <filter id="myfilter">
      <feGaussianBlur in="sourceGraphics" stdDeviation=5/>
    <filter>
  </defs>
 <react x="0" y="0" width="400" height="400" fill="url(#myfilter)"/>
</svg>

其中in=“sourceGraphics”是固定写法,stdDeviation=5用来设置模糊程度。

Canvas介绍

Canvas是通过javascript来绘制2D图像的;
Canvas是逐像素进行渲染的;
在Canvas中一旦图形被绘制完成,它就不会得到浏览器的关注,一旦其位置发生变化,那么整个场景需要重新绘制,包括任何已被该图形覆盖了的图形。

使用

canvas使用javascript在网页上绘制图像,本身并没有绘制能力。
canvas是一个矩形区域可以控制其中的每一个元素。
canvas具有多种绘制路径、圆形、矩形、字符以及图像的方法。
下面是典型的常用的绘图方式。

1、填充画布
<canvas id="myCanvas" width="200px" height="100px" style="border:1px solid #333">
</canvas>
<script type="text/javascript">
    var c=document.getElementById("myCanvas");
    var ct=c.getContext("2d");
    ct.fillStyle="#ccc";
    ct.fillRect(5,10,150,10);
</script>

getContext("2d")是内建的html5对象,拥有多种绘制路径,矩形,圆形,字符和图像的方法。
设计fillStyle属性可以是css颜色、渐变或图案,fillStyle的默认值是“#000000”。

2、canvas中的路径

在canvas中画线我们将使用两种方法:
moveTo(x,y)路径开始的坐标
lineTo(x,y)路径结束的坐标
stroke();绘制

<canvas id="myCanvas" width="200px" height="100px" style="1px solid #333">
</canvas>
<script type="text/javascript">
    var c=document.getElementById("myCanvas");
    var ct=c.getContext("2d");
    ct.moveTo(0,0);
    ct.lineTo(50,50);
    ct.stroke();
</script>
3、canvas中绘制圆
<canvas id="myCanvas" width="200px" height="100px" style="1px solid #333">
</canvas>
<script type="text/javascript">
    var c=document.getElementById("myCanvas");
    var ct=c.getContext("2d");
    ct.beginPath();
    ct.arc(50,50,30,0,2*Math.PI);
    ct.stroke();
</script>
4、canvas绘制文本

canvas绘制文本主要属性如下:
font——定义字体样式;
fillText(text,x,y)——在canvas上绘制实心的文本
strokeText(text,x,y)——在canvas上绘制空心的文本

<canvas id="myCanvas" width="200px" height="100px" style="1px solid #333">
</canvas>
<script>
var c=document.getElementById("myCanvas");
    var ct=c.getContext("2d");
    ct.font="30px Arial";
    ct.fillText("Hello World",10,50);
    ct.strokeText("Hello web",20,20);
</script>
5、canvas中的渐变

渐变可以填充在矩形, 圆形, 线条, 文本等等, 各种形状可以自己定义不同的颜色。
以下有两种不同的方式来设置Canvas渐变:
createLinearGradient(x,y,x1,y1);
createRadialGradient(x,y,r,x1,y1,r1);
当我们使用渐变对象必须使用两种或者两种以上的的停止颜色。
addColorStop(),指定颜色停止,参数使用坐标来描述,可以是0至1。
使用渐变,设置fillStyle和strokeStyle的值为渐变,然后绘制形状如矩形、直线、文本。

实例

创建一个线性渐变,使渐变填充整个矩形

<canvas id="myCanvas" width="500px" height="500px" style="border:1px solid #333">
</canvas>
<script type="text/javascript">
    var c=document.getElementById("myCanvas");
    var ct=c.getContext("2d");
    //创建渐变
    var grd=ct.createLinearGradient(0,0,200,0);
    grd.addColorStop(0,"red");
    grd.addColorStop(1,"white");
    //填充渐变
    ct.fillStyle=grd;
    ct.fillRect(10,10,150,80);
</script>
6、canvas绘制图像

把一副图片绘制到画布上
drawImage(img,x,y);

<body>
<p>Image to use:</p>
![](img_the_scream.jpg)<p>Canvas:</p>
<canvas id="myCanvas" width="250" height="300" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。</canvas>
<script>
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var img=document.getElementById("scream");

img.onload = function() {
    ctx.drawImage(img,10,10);
} 
</script>
</body>

以上是对SVG和Canvas的简单介绍

SVG和Canvas的区别

Canvas

1.依赖分辨率
2.不支持事件绑定
3.弱的文本渲染能力
4.能够以.png和.jpg的格式保存结果图像
5.最适合图像密集的游戏,其中许多对象将会被频繁重绘

SVG

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容