html5中的SVG和Canvas

學(xué)習(xí)html5時(shí)都會(huì)碰到svg和canvas,這兩個(gè)都可以在瀏覽器中繪制圖形,那么這兩個(gè)有什么區(qū)別呢豁护。下面對(duì)兩者進(jìn)行比較。


SVG介紹

SVG(Scable vector Graphics 可縮放矢量圖形)
是一種使用XML來(lái)描述2D圖形的語(yǔ)言欲间;
因?yàn)槭腔赬ML楚里,那么svg DOM中的每一個(gè)元素都可以,綁定上javascript事件處理器猎贴;
在svg中每一個(gè)繪制的圖形都被視為對(duì)象班缎,svg元素的屬性發(fā)生變化那么瀏覽器也會(huì)重新渲染圖形的。

注意:

1她渴、SVG并不屬于html5專(zhuān)有內(nèi)容达址,在html5之前就有SVG。

2趁耗、SVG文件的擴(kuò)展名是".svg"沉唠。

3、SVG繪制的圖像在圖片質(zhì)量不下降的情況下被放大苛败。

4满葛、SVG圖像經(jīng)常在網(wǎng)頁(yè)中制作小圖標(biāo)和一些動(dòng)態(tài)效果圖径簿。

使用

在html5中使用svg必須使用<svg></svg>標(biāo)簽。(svg繪制所有的圖形必須都要在<svg></svg>中繪制)纱扭。

<svg></svg>形成的區(qū)域大小為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標(biāo)簽里的style是svg的屬性,不是css屬性乳蛾。

2暗赶、繪制圓形
<svg>
<circle cx="" cy="" r=""/>
</svg>

cx和cy表示圓心的坐標(biāo),r表示圓的半徑

3肃叶、繪制橢圓
<svg>
    <ellipse cx="" cy="" rx="" ry=""/>
</svg>

cx和cy表示橢圓的中心蹂随,rx和ry表示橢圓的長(zhǎng)軸和短軸。

4因惭、繪制直線
<svg>
  <line x1="" y1=""  x2="" y2="" />
</svg>

x1和y1表示起始點(diǎn)的坐標(biāo)岳锁,x2,y2終止點(diǎn)的坐標(biāo)。

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>

特殊元素

漸變,漸變?cè)囟x在<defs></defs>標(biāo)簽內(nèi)

1勿决、線性漸變

<linearGradient>標(biāo)簽

<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”是固定寫(xiě)法嘉冒,stdDeviation=5用來(lái)設(shè)置模糊程度。

Canvas介紹

Canvas是通過(guò)javascript來(lái)繪制2D圖像的咆繁;
Canvas是逐像素進(jìn)行渲染的讳推;
在Canvas中一旦圖形被繪制完成,它就不會(huì)得到瀏覽器的關(guān)注玩般,一旦其位置發(fā)生變化银觅,那么整個(gè)場(chǎng)景需要重新繪制,包括任何已被該圖形覆蓋了的圖形壤短。

使用

canvas使用javascript在網(wǎng)頁(yè)上繪制圖像设拟,本身并沒(méi)有繪制能力。
canvas是一個(gè)矩形區(qū)域可以控制其中的每一個(gè)元素久脯。
canvas具有多種繪制路徑、圓形镰吆、矩形帘撰、字符以及圖像的方法。
下面是典型的常用的繪圖方式万皿。

1摧找、填充畫(huà)布
<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")是內(nèi)建的html5對(duì)象核行,擁有多種繪制路徑,矩形蹬耘,圓形芝雪,字符和圖像的方法。
設(shè)計(jì)fillStyle屬性可以是css顏色综苔、漸變或圖案惩系,fillStyle的默認(rèn)值是“#000000”。

2如筛、canvas中的路徑

在canvas中畫(huà)線我們將使用兩種方法:
moveTo(x,y)路徑開(kāi)始的坐標(biāo)
lineTo(x,y)路徑結(jié)束的坐標(biāo)
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上繪制實(shí)心的文本
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中的漸變

漸變可以填充在矩形, 圓形, 線條, 文本等等, 各種形狀可以自己定義不同的顏色。
以下有兩種不同的方式來(lái)設(shè)置Canvas漸變:
createLinearGradient(x,y,x1,y1);
createRadialGradient(x,y,r,x1,y1,r1);
當(dāng)我們使用漸變對(duì)象必須使用兩種或者兩種以上的的停止顏色妖胀。
addColorStop(),指定顏色停止芥颈,參數(shù)使用坐標(biāo)來(lái)描述,可以是0至1赚抡。
使用漸變爬坑,設(shè)置fillStyle和strokeStyle的值為漸變,然后繪制形狀如矩形怕品、直線妇垢、文本。

實(shí)例

創(chuàng)建一個(gè)線性漸變肉康,使?jié)u變填充整個(gè)矩形

<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");
    //創(chuàng)建漸變
    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繪制圖像

把一副圖片繪制到畫(huà)布上
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 標(biāo)簽。</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>

以上是對(duì)SVG和Canvas的簡(jiǎn)單介紹

SVG和Canvas的區(qū)別

Canvas

1.依賴分辨率
2.不支持事件綁定
3.弱的文本渲染能力
4.能夠以.png和.jpg的格式保存結(jié)果圖像
5.最適合圖像密集的游戲吼和,其中許多對(duì)象將會(huì)被頻繁重繪

SVG

1.不依賴分辨率
2.支持事件處理器
3.最適合帶有大型渲染區(qū)域的應(yīng)用程序(比如谷歌地圖)
4.復(fù)雜度高會(huì)減慢渲染速度(任何過(guò)度使用DOM的應(yīng)用都不快)
5.不適合游戲應(yīng)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涨薪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炫乓,更是在濱河造成了極大的恐慌刚夺,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件末捣,死亡現(xiàn)場(chǎng)離奇詭異侠姑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)箩做,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)莽红,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事安吁∽硪希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鬼店,是天一觀的道長(zhǎng)网棍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)妇智,這世上最難降的妖魔是什么滥玷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮俘陷,結(jié)果婚禮上罗捎,老公的妹妹穿的比我還像新娘。我一直安慰自己拉盾,他們只是感情好桨菜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著捉偏,像睡著了一般倒得。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夭禽,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天霞掺,我揣著相機(jī)與錄音,去河邊找鬼讹躯。 笑死菩彬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潮梯。 我是一名探鬼主播骗灶,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秉馏!你這毒婦竟也來(lái)了耙旦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤萝究,失蹤者是張志新(化名)和其女友劉穎免都,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體帆竹,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绕娘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栽连。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片业舍。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖升酣,靈堂內(nèi)的尸體忽然破棺而出舷暮,到底是詐尸還是另有隱情,我是刑警寧澤噩茄,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布下面,位于F島的核電站,受9級(jí)特大地震影響绩聘,放射性物質(zhì)發(fā)生泄漏沥割。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一凿菩、第九天 我趴在偏房一處隱蔽的房頂上張望机杜。 院中可真熱鬧,春花似錦衅谷、人聲如沸椒拗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蚀苛。三九已至,卻和暖如春玷氏,著一層夾襖步出監(jiān)牢的瞬間堵未,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工盏触, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渗蟹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓赞辩,卻偏偏與公主長(zhǎng)得像雌芽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诗宣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容