【三十八】Canvas

Canvas是HTML5新增的組件玩讳,它就像一塊幕布输枯,可以用JavaScript在上面繪制各種圖表、動畫等券坞。
沒有Canvas的年代鬓催,繪圖只能借助Flash插件實現(xiàn),頁面不得不用JavaScript和Flash進(jìn)行交互恨锚。有了Canvas宇驾,我們就再也不需要Flash了,直接使用JavaScript完成繪制猴伶。
一個Canvas定義了一個指定尺寸的矩形框课舍,在這個范圍內(nèi)我們可以隨意繪制:

<canvas id="test-canvas" width="300" height="200"></canvas>

由于瀏覽器對HTML5標(biāo)準(zhǔn)支持不一致,所以蜗顽,通常在<canvas>內(nèi)部添加一些說明性HTML代碼布卡,如果瀏覽器支持Canvas,它將忽略<canvas>內(nèi)部的HTML雇盖,如果瀏覽器不支持Canvas忿等,它將顯示<canvas>內(nèi)部的HTML:

<canvas id="test-stock" width="300" height="200">
    <p>Curren Price: 25.51</p>
</canvas>

在使用Canvas前,用canvas.getContext來測試瀏覽器是否支持Canvas:

<!-- HTML代碼 -->
<canvas id="test-canvas" width="200" height="100">
    <p>你的瀏覽器不支持Canvas</p>
</canvas>
'use strict';
var canvas = document.getElementById('test-canvas');
if (canvas.getContext) {
    alert('你的瀏覽器支持Canvas!');
} else {
    alert('你的瀏覽器不支持Canvas!');
}

getContext('2d')方法讓我們拿到一個CanvasRenderingContext2D對象崔挖,所有的繪圖操作都需要通過這個對象完成贸街。

var ctx = canvas.getContext('2d');

如果需要繪制3D怎么辦?HTML5還有一個WebGL規(guī)范狸相,允許在Canvas中繪制3D圖形:

gl = canvas.getContext("webgl");

本節(jié)我們只專注于繪制2D圖形薛匪。

</br>

繪制形狀

我們可以在Canvas上繪制各種形狀。在繪制前脓鹃,我們需要了解一下Canvas的坐標(biāo)系統(tǒng):

Canvas的坐標(biāo)以左上角為原點逸尖,水平向右為X軸,垂直向下為Y軸瘸右,以像素為單位娇跟,所以每個點都是非負(fù)整數(shù)。
CanvasRenderingContext2D對象有若干個方法來繪制圖形:

'use strict';

var
    canvas = document.getElementById('test-shape-canvas'),
    ctx = canvas.getContext('2d');

ctx.clearRect(0, 0, 200, 200); // 擦除(0,0)位置大小為200x200的矩形太颤,擦除的意思是把該區(qū)域變?yōu)橥该?ctx.fillStyle = '#dddddd'; // 設(shè)置顏色
ctx.fillRect(10, 10, 130, 130); // 把(10,10)位置大小為130x130的矩形涂色

// 利用Path繪制復(fù)雜路徑:
var path=new Path2D();
path.arc(75, 75, 50, 0, Math.PI*2, true);
path.moveTo(110,75);
path.arc(75, 75, 35, 0, Math.PI, false);
path.moveTo(65, 65);
path.arc(60, 65, 5, 0, Math.PI*2, true);
path.moveTo(95, 65);
path.arc(90, 65, 5, 0, Math.PI*2, true);
ctx.strokeStyle = '#0000ff';
ctx.stroke(path);


繪制文本

繪制文本就是在指定的位置輸出文本苞俘,可以設(shè)置文本的字體、樣式龄章、陰影等吃谣,與CSS完全一致:

'use strict';

var
    canvas = document.getElementById('test-text-canvas'),
    ctx = canvas.getContext('2d');

ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.shadowOffsetX = 2;
ctx.shadowOffsetY = 2;
ctx.shadowBlur = 2;
ctx.shadowColor = '#666666';
ctx.font = '24px Arial';
ctx.fillStyle = '#333333';
ctx.fillText('帶陰影的文字', 20, 40);

Canvas除了能繪制基本的形狀和文本乞封,還可以實現(xiàn)動畫、縮放岗憋、各種濾鏡和像素轉(zhuǎn)換等高級操作肃晚。如果要實現(xiàn)非常復(fù)雜的操作,考慮一下優(yōu)化方案:

  • 通過創(chuàng)建一個不可見的Canvas來繪圖仔戈,然后將最終繪制結(jié)果復(fù)制到頁面的可見Canvas中陷揪;
  • 盡量使用整數(shù)坐標(biāo)而不是浮點數(shù);
  • 可以創(chuàng)建多個重疊的Canvas繪制不同的層杂穷,而不是在一個Canvas中繪制非常復(fù)雜的圖;
  • 背景圖片如果不變可以直接用<img>標(biāo)簽并放到最底層卦绣。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耐量,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滤港,更是在濱河造成了極大的恐慌廊蜒,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溅漾,死亡現(xiàn)場離奇詭異山叮,居然都是意外死亡,警方通過查閱死者的電腦和手機添履,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門屁倔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暮胧,你說我怎么就攤上這事锐借。” “怎么了往衷?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵钞翔,是天一觀的道長。 經(jīng)常有香客問我席舍,道長布轿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任来颤,我火速辦了婚禮汰扭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脚曾。我一直安慰自己东且,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布本讥。 她就那樣靜靜地躺著珊泳,像睡著了一般鲁冯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上色查,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天薯演,我揣著相機與錄音,去河邊找鬼秧了。 笑死跨扮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的验毡。 我是一名探鬼主播衡创,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晶通!你這毒婦竟也來了璃氢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狮辽,失蹤者是張志新(化名)和其女友劉穎一也,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喉脖,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡椰苟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了树叽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舆蝴。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖菱皆,靈堂內(nèi)的尸體忽然破棺而出须误,到底是詐尸還是另有隱情,我是刑警寧澤仇轻,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布京痢,位于F島的核電站,受9級特大地震影響篷店,放射性物質(zhì)發(fā)生泄漏祭椰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一疲陕、第九天 我趴在偏房一處隱蔽的房頂上張望方淤。 院中可真熱鬧,春花似錦蹄殃、人聲如沸携茂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讳苦。三九已至带膜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸳谜,已是汗流浹背膝藕。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咐扭,地道東北人芭挽。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蝗肪,于是被迫代替她去往敵國和親袜爪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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