次世代のhtmlとして策定が進んでいるhtml5の仕様の中にある要素で、javascriptにより、直接画像を作る仕組みです。次世代のブラウザでの標準ですが、firefoxで既に使える他、Safari, Operaなどでも使用可能です。インターネットエクスプローラでも「ExplorerCanvas」というライブラリを導入することで使えます。
本来はhtml5のDOCTYPE宣言の書き方があり、それ以前のhtml4やxhtml1.1ではcanvasは不正な要素、あるはずのない要素になってしまいますが、ここは「おためし」ということでxhtml1.1の環境で無理矢理書いてしまいます。
<canvas id="graph" width="450" height="300"></canvas>
枠線をいれるためにスタイルシートをつかっています(後述)。
width="450" height="300" と指定したcanvasの中は次のような座標を持っています。この座標を使って図形を描きます。

marginの設定と、border(枠線)をいれるためにはスタイルシートをつかいます。必ず入れなければならないということはありません。必要に応じて指定します。
<style type="text/css">
canvas {
border:solid 1px #999999;
margin:1% 2%;
}
</style>
図を描くにはjavascriptに記述します。//以下は注釈でプログラム実行では無視されます。
// ページの表示が終わったら(onload)draw()を実行するため
onload = function() {
draw();
}
// 実際の描画プログラム
function draw() {
var canvas1 = document.getElementById('graph');
var ctx = canvas1.getContext('2d');
// □■
ctx.strokeRect(20, 20, 200, 40);
ctx.fillRect(20, 120, 200, 40);
// ○
ctx.beginPath();
ctx.arc(300, 50, 40, 0, Math.PI*2, false); /*anticlockwise=false*/
ctx.stroke();
//.....以下略...
}
実行のタイミングです。onload = function() は決まり文句です。その後の{ }の中には実行したい function の名前を書きます。ここでは draw() しかありません。
// ページの表示が終わったら(onload)draw()を実行するため
onload = function() {
draw();
};
もしdraw1()とdraw2()というfunftionがあって両方やらせたい時は、
onload = function() {
draw1();
draw2();
}
と書きます。
// 実際の描画プログラム
function draw() {
//ここにdraw()の内容(プログラム)を書く
}
名前は自分で決められます。onload に指定する名前と合わせます。複数あってもかまいません。
function draw1() {
//ここにdraw1()の内容(プログラム)を書く
}
function draw2() {
//ここにdraw2()の内容(プログラム)を書く
}
var canvas1 = document.getElementById('graph');
var ctx = canvas1.getContext('2d');
var の後の canvas1 と ctx は変数です。自分で名前を決めることができます。canvas1 はここの2つがあっていなければなりません。ctx はここでは Context の省略からこの名前にしました。ctxはこのあと、何度も使っていきます。
'graph' はキャンバスに付けた id です。
1行目で graph という id の canvas 要素を見つけてそれを canvas1 と呼ぶことにします。
2行目で、その canvas1 を '2D' (2次元平面の画像)として取り扱うこととし、その対象を ctx と呼ぶことにします。
2Dは決まり文句です。これ以外を指定できません。将来的には3Dというのもできるようになる可能性はあります。
canvas1 と ctx の名前は自由なのでこのようにしてもかまいません
var canv = document.getElementById('graph');
var g = canv.getContext('2d');
次のページから少しずつ解説します。
// □■ ctx.strokeRect(20, 20, 200, 40); ctx.fillRect(20, 120, 200, 40); // ○ ctx.beginPath(); ctx.arc(300, 50, 40, 0, Math.PI*2, false); /*anticlockwise=false*/ ctx.stroke(); //.....以下略...