Web 初學者的第七堂課

 

在網頁上畫畫 -- Canvas

 

什麼是 Canvas?

沒錯!就是畫布

 

什麼是 Canvas?

 

Canvas元素是HTML5的一部分,允許腳本語言動態渲染位圖像。 它最初由蘋果內部使用自己Mac OS X WebKit推出,供應用程序使用像儀錶盤的構件和Safari瀏覽器使用。 後來,有人通過Gecko內核的瀏覽器,Opera和Chrome,和超文本網絡應用技術工作組建議為下一代的網絡技術使用該元素。Novell生產的XForms處理器插件作為Internet Explorer插件支持Canvas 元素。 也有人努力使用VML和JavaScript在Internet Explorer支持Canvas功能而不需要插件。

 

怎麼用 Canvas?

<canvas> 並不困難,但你需要瞭解基本的 HTML 與JavaScript。 舊版瀏覽器不支援 <canvas>,不過基本上現今所有主流的瀏覽器都有支援。預設的畫布大小是 300px * 150px (寬 * 高)。但你也可以透過 CSS 的寬、高屬性自訂。為了在畫布上作畫,我們使用了一個 javascript context 物件來即時繪製圖形。

 

怎麼用 Canvas?

 

大多數 Canvas 繪圖 API 都沒有定義在 <canvas> 元素本身上,而是定義在通過畫布的 getContext() 方法獲得的一個「繪圖環境」對象上。
Canvas API 也使用了路徑的表示法。但是,路徑由一系列的方法調用來定義,而不是描述為字母和數字的字符串,比如調用 beginPath() 和 arc() 方法。
一旦定義了路徑,其他的方法,如 fill(),都是對此路徑操作。繪圖環境的各種屬性,比如 fillStyle,說明了這些操作如何使用。

 

怎麼用 Canvas?

 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>長條圖 - handsome Sunny!</title>
</head>
<body>
  <h1>Sunny so handsome!</h1>
  <label for="num">請輸入數字,以逗點分隔</label>
  <br>
  <input type="text" id="num">
  <button type="button" id="ok">確定</button>
  <br>
  <canvas id="myCanvas" width="1200" height="1200"></canvas>
</body>
</html>

HTMLCanvasElement

  • width
  • height
  • toDataURL()
  • toBlob()
  • getContext()

CanvasRenderingContext2D

 
  • fillStyle
  • fillReact(x,y,w,h)
  • clearReact(x,y,w,h)
  • fillText(str,x,y)
 
  • moveTo(x,y)

  • lineTo(x,y)
  • stroke()
  • beginPath()
  • arc(x,y,r,sAngle,eAngle,clockwise);
  • closePath()
  • fill()

來試著在網頁上劃出一個方型吧!

來試著在網頁上劃出一個圓型吧!

填好填滿的圓形

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
var centerX = canvas.width / 2;
var centerY = canvas.height / 2;
var radius = 70;

context.beginPath();
context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);
context.fillStyle = 'green';
context.fill();
context.lineWidth = 5;
context.strokeStyle = '#003300';
context.stroke();

Canvas 不只如此!

我們可以在照片上做修改

var src_img = new Image();
src_img.onload = function(){
    var c = document.getElementById("myCanvas");
    c.width = src_img.width;
    c.height = src_img.height+30;
    var ctx = c.getContext("2d");
    ctx.drawImage(src_img,0,0);
    ctx.font="24px sans-serif";
    ctx.fillText("Sunny is handsome",15,src_img.height+20);
};
src_img.src = "http://tchinfo.ttu.edu.tw/main/getimage.php?id=slhsieh&Seq=40"
var c = myCanvas;
var ctx = c.getContext("2d");
function drawBar(n, l) {
    ctx.fillRect(0, n * 22, l * 10, 20);
}
ctx.clearRect(0, 0, c.width, c.height);
num.value.split(",").forEach(function (e, idx){
    drawBar(idx, e);
})

課堂作業

試著做出折線圖吧!

Web 初學者的第七堂課

By Albert Hsieh

Web 初學者的第七堂課

大同資訊創意研究社系列社課

  • 959