Javascript: canvasについて、基礎的な部分をまとめてみた。
初めて記事を書きます。何事も挑戦。
お絵描きアプリを作りたい!ということでcanvasについて勉強しました。
復習がてら、学んだことの一部を記述していきます。
参考教材はドットインストールです。すごくわかりやすいです。
目次
1.canvasとは?
2.描いていく
- 図形を描く
- 直線を引く
- 画像の描画
canvasとは?
簡単に言うと、絵が描けてしまうAPIです。
htmlに<canvas></canvas>タグを記述します。
初期値
height: 150px
width: 300px
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<title>CANVAS!!</title>
</head>
<body>
<canvas width="700px" height="700px" style="background-color: #35907f;">
お使いのブラウザではcanvasが使用出来ません。
</canvas>
<script src="index.js"></script>
</body>
</html>
今回は縦横700pxの正方形にしました。
また、背景色を青緑色にしています。
こんな画面になりました。
描いていく
使用言語はjavascriptです。
大体x,yの座標の指定が必須な気がします。
const Draw=()=>{
const canvas = document.querySelector("canvas")
if(typeof canvas.getContext === "undefined"){
return;
}
const draw = canvas.getContext("2d")
//以下にどう描画していくかを記述していく。
.
.
.
}
Draw() //描画を実行
描画する関数を定義し、中身を記述していきます。
最初にcanvas要素を取得しています。
if(typeof canvas.getContext === "undefined"){
return;
この記述を行うことで、canvasが対応していないブラウザでは処理が止まります。
const hoge = canvas.getContext("2d")
2dはそのまま2dの意味です。3dにすることも出来ます。
このようにして下準備を行います。
図形を描く
四角形を描く
fillRect()
とfillstrokeRect()
を使います。
hoge.fillRect(x,y,width,height)
指定したx,y座標からwidth,height分塗りつぶす。
hoge.fillstrokeRect(x,y,width,height)
指定したx,y座標からwidth,height分の外枠を塗りつぶす。
hoge.fillRect(300,250,100,100) //上
hoge.strokeRect(300,400,100,100) //下
このようにすると
こうなります。
ちなみにfillRect()の前に
hoge.fillStyle="white"
と記述すると
こうなります。
丸を描く
丸を描くにはarc()
を使用します。
四角形を描く時と違って
描き初めにはbeginPath()
が、描き終わりにはfill()
もしくはstroke()
が必要になります。
hoge.beginPath()
hoge.arc(350,350,100,0,2 * Math.PI)
hoge.fill()
hoge.beginPath()
hoge.arc(350,450,100,0,2 * Math.PI)
hoge.stroke()
beginPath()
は描画の始まりを示し、fill()
は塗りつぶし,stroke()
は枠線を意味します。
実行すると
こうなります。
今回は、四角計と丸を例に出してみました。
直線を引く
直線にはmoveTo()
,lineTo()
を使います。
moveTo(x,y) 描画の開始始点を決める
lineTo(x,y) 線を引く座標を指定
lineTo()を繰り返し使うことで、好きな形を作ることが出来ます。
今回は、ハートを描いてみます。
hoge.beginPath()
hoge.moveTo(200,100)
hoge.lineTo(240,100)
hoge.lineTo(270,140)
hoge.lineTo(300,100)
hoge.lineTo(340,100)
hoge.lineTo(370,140)
hoge.lineTo(370,180)
hoge.lineTo(340,220)
hoge.lineTo(270,270)
hoge.lineTo(200,220)
hoge.lineTo(170,180)
hoge.lineTo(170,140)
hoge.lineTo(200,100)
hoge.stroke()
こうなります。fill()
にすると塗り潰されます。
ちなみに
hoge.lineWidth="5" //線の太さが5pxに
hoge.lineCap="round" //線の両端の形が丸くなる
hoge.lineJoin="round" //線の繋ぎ目が丸くなる
こうすると
こうなります。
画像の描画
画像を表示させることも出来ます。
この画像を表示させたい時
const img = document.createElement('img') //img要素を作る
img.src="img/cat.png" //パス指定
img.addEventListener('load', () ⇒{
hoge.drawImage(img, 200,200, 300,300) })
//(img,表示座標のx,y,サイズ指定width,height)}) ロードした後に、指定した座標にimg表示
こうなります。
ちなみに
img.addEventListener('load', () => {
const pattern = hoge.createPattern(img, "repeat")
//repeat-x,reperat-y,no-repeatと指定できる。
hoge.fillStyle = pattern;
hoge.fillRect(0,0,canvas.width,canvas.height) //x=0,y=0を開始にして画像でcanvasいっぱいに塗りつぶし
})
こうすると
元画像がでかすぎて見切れてしまいました。キャンバスいっぱいを画像で埋め尽くすことが出来ます。
drawImage()
を使って、一部分だけ切り出すことも出来ます。
これ以外にも様々なメソッドが存在します。点線にしたり、三角関数を使ってアニメーションをつけたり・・・
アウトプット&練習がてらの記事執筆でしたが、今後質のいいものを作れるよう学習を進めていきたいです。
Discussion