Canvas基礎教學(章節1)

2020-10-04 18:00:07

  這是我的第一篇Canvas 基礎教學,我先簡述一下什麼是Canvas 。
  H5 新增內容,允許指令碼語言動態渲染影象,是由 HTML 程式碼配合高度和寬度屬性而定義出的可繪製區域。JavaScript 程式碼可以存取該區域,類似於其他通用的二維 API,通過一套完整的繪圖函數來動態生成圖形。一些可能的用途,包括使用 Canvas 構造圖形,動畫,遊戲和圖片。

Canvas 物件的屬性
height 屬性:
  畫布的高度。和一幅影象一樣,這個屬性可以指定為一個整數畫素值或者是視窗高度的百分比。當這個值改變的時候,在該畫布上已經完成的任何繪圖都會擦除掉。預設值是 150。

width 屬性:
  畫布的寬度。和一幅影象一樣,這個屬性可以指定為一個整數畫素值或者是視窗寬度的百分比。當這個值改變的時候,在該畫布上已經完成的任何繪圖都會擦除掉。預設值是 300。


那Canvas 繪製的圖形或動畫有哪些優點呢?

比如下面這張圖:
在這裡插入圖片描述
  先不考慮視訊,即便是 gif 動圖,這樣一張未壓縮的圖片,大小至少有 4MB ,瀏覽器渲染這張圖片的時候,相當於下載了一首 「流暢」 品質的歌曲,如果你希望這張圖片作為背景圖,那它會變得十分模糊。

  那假設是一幅 Canvas 畫布呢?它的大小隻有 2KB ,即便你是 2G 網路,它也能夠迅速的載入完畢,並且經得住無限放大。唯一的缺點是:圖片你只需要往上一拉,而 Canvas 要寫100行程式碼。


Canvas 動畫的製作原理
  1、更新繪製的物件(比如位置的移動)
  2、清除畫布
  3、在畫布上重新繪製物件
  簡單一句話概括:不斷的繪製與清除。


教學開始:
  在HTML中新增Canvas非常簡單,只需要在 < body> 裡,新增上 < canvas> 標籤就可以了!標籤通常需要指定一個id屬性 (指令碼中經常參照),width 和 height 屬性定義的畫布的大小。可以參考下面的程式碼。

<body>
    <canvas id="canvas" width="200" height="100">一張Canvas 畫布</canvas>
</body> 

獲取畫布

var c=document.getElementById(「canvas」);
var ctx=c.getContext(「2d」);

  這兩段程式碼必填,這是一個模板,從前期來講無論你畫什麼它都不會改變,這裡就不細講了,不容易理解。

Canvas - 文字

font - 定義字型
fillText(text,x,y) - 在 canvas 上繪製實心的文字
strokeText(text,x,y) - 在 canvas 上繪製空心的文字

Canvas - 影象

drawImage(image,x,y)

Canvas顏色

ctx.fillStyle = " "

Canvas 座標

canvas 是一個二維網格。
canvas 的左上角座標為 (0,0)。
X 座標向右增加。
Y 座標向著畫布底部增加。

在這裡插入圖片描述Canvas - 路徑

moveTo(x,y) 定義線條開始座標
lineTo(x,y) 定義線條結束座標

如果在canvas中繪製圓形,可以使用 arc(x,y,r,start,stop)

Canvas - 漸變

createLinearGradient(x,y,x1,y1) - 建立線條漸變
createRadialGradient(x,y,r,x1,y1,r1) - 建立一個徑向/圓漸變

畫布的使用

ctx.font=「bold 20px Arial」;
ctx.textAlign=「Hello W3Cschool」;
ctx.fillText(「Hello W3Cschool」, 20, 40);

在canvas 中,transform 屬性依然生效,不過被簡寫為:ctx.translate(x,y)、ctx.rotate(x) 等

需要注意的是:rotate 中不能再填寫角度了,應改為:

ctx.rotate((Math.PI / 180) * 25)

意為:順時針旋轉 25 deg

我們來寫一個簡單的小案例,看一下效果如何:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>

</head>
<body>
	<canvas id="canvas"  width="500" height="500"></canvas>
<script>
    var c=document.getElementById("canvas");
	var ctx=c.getContext("2d");
	ctx.translate(100, 150);
	ctx.fillText("after translate", 20, 40);
	ctx.fillStyle = "gray";
	ctx.fillRect(10,10, 100, 100);
	ctx.rotate( (Math.PI / 180) * 25);
	ctx.fillStyle = "orange";
	ctx.fillRect(10,10, 100, 100);
</script>
</body>
</html>

在這裡插入圖片描述  Canvas 最神奇的地方在於不斷新增,當你繪製好一個不錯的圖形時,讓它頻繁的克隆自身,這樣你就得到了 N 個繪製好的圖形,這也是開頭動畫的原理。如:

<body>
	<canvas id="canvas"  width="500" height="500"></canvas>
<script>
    var c=document.getElementById("canvas");
	var ctx=c.getContext("2d");
	ctx.strokeRect(10,10,30,20);
	ctx.scale(2,2);
	ctx.strokeRect(10,10,30,20);
	ctx.scale(2,2);
	ctx.strokeRect(10,10,30,20);
	ctx.scale(2,2);
	ctx.strokeRect(10,10,30,20);
</script>

效果圖:

在這裡插入圖片描述那我們用剛剛學到的內容做一個小練習:

<body>
    <canvas id="canvas"  width="500" height="500">
    <script>
        var testCanvas = document.getElementById("canvas");
        // 獲取getContext()物件
        var context = testCanvas.getContext("2d");
 
        context.fillStyle = "red";
        context.fillRect(10, 10, 100, 100);
        // 儲存狀態(紅色)
        context.save();
 
        context.fillStyle="blue";
        context.fillRect(60, 60, 100, 100);
        // 儲存狀態(藍色)
        context.save();
 
        // 恢復狀態(紅色)
        context.restore();
        context.fillRect(120, 120, 100, 100);
 
        // 恢復狀態(藍色)
        context.restore();
        context.fillRect(180, 180, 100, 100);
        context.beginPath();
    </script>
</body>

  看看你得到的圖案是不是下面這樣:
在這裡插入圖片描述
  讀到這裡,你是不是想問,那些移動的 canvas 動畫是如何製作的?

<style>
	.onfo {
		width: 600px;
		height: 400px;       
	}
	.onfo canvas {
		border: 1px solid #333;
	}
</style>
</head>
<body>
    <div class="onfo">
        <canvas id="canvas"  width="500" height="500">  
    </div>
<script>
    var testCanvas = document.getElementById("canvas");
    var context = testCanvas.getContext("2d");
    var x = 0;
    var y = 0;
    var timer = null;

    //清除畫布 再次繪製(迴圈操作)
    function draw(){
        // 不斷改變繪製物件的水平位置
        x++;
        // 清除畫布
        context.clearRect(0, 0, 600, 400);
        context.beginPath();
        context.fillStyle = "skyblue";
        context.arc(x, 200, 80, 0, 2 * Math.PI, true);
        context.closePath();
        // 繪製輪廓
        context.stroke();
        // 填充顏色
        context.fill();
    }
    
    // 設定計時器
    setInterval(draw, 20);
</script>
</body>

  來看下效果圖,是不是和我的一樣
在這裡插入圖片描述
  本期的 Canvas 教學到這裡就告一段落了,這門技術在以後的開發及裝 X 中都將大放異彩,勤學苦練使我們熟能生巧,關注一波吧老鐵在這裡插入圖片描述最後送大家三個高階又簡單的Canvas 動畫,既能練習又能裝 X,我是 「 我不是費圓 」,一個每天忙到深夜碼字的人,我從不輕言放棄,從不吝嗇自己的讚美之詞。如果你在 canvas 上有著更高的造詣,我希望能得到你的指教。反之,希望你能與我攜手並進。

推薦閱讀:
線條動畫
線條花環
怦然心動