1. 程式人生 > >web前端:Canvas 基礎(一)

web前端:Canvas 基礎(一)

0.前言

最近忙裡偷閒,來寫寫文章。

————-我是華麗的分割線————–

終於把這篇文章寫完了,關於本文,針對讀者主要是之前從未接觸過 Canvas的同學。當然,你要學 canvas 一定要有 JS 基礎啦。

其次就是,因為前前後後耽誤了兩天時間,可能在書寫和描述中出現一些小的紕漏,請各位讀者老爺見諒。

最後,也希望這篇文章能夠對迷茫的你產生一些幫助,感謝。

1. canvas 簡介

1.1 canvas 是什麼?

是HTML5中重要的元素,和audio、video元素類似完全不需要任何外部外掛就能夠執行.

Canvas中文翻譯就是”畫布”.它提供了強大的圖形的處理功能(繪製,變換,畫素處理…)。

但是需要注意,canvas 元素本身並不繪製圖形,它只是相當於一張空畫布。

如果開發者需要向 canvas 上繪製圖形,則必須使用 JavaScript 指令碼進行繪製。

1.2 canvas 能夠做什麼?

  • 基礎圖形的繪製
  • 文字的繪製
  • 圖形的變形和圖片的合成
  • 圖片和視訊的處理
  • 動畫的實現
  • 小遊戲的製作

1.3 支援的瀏覽器

大多數現代瀏覽器都是支援Canvas的,比如 Firefox, safari, chrome, opera的最近版本以及IE9都支援.

 IE8及以下不支援HTML5,但是我們可以進行提示使用者更新到最新的版本

1.4 關於canvas 標籤的基本概念

在 HTML 頁面上定義 canvas 元素與定義其他普通元素並無任何不同,它吃了可以指定 id, style ,class ,hidden 等通用屬性之外,還可以設定 width 和 height 兩個屬性。

為什麼要特意去說這個呢?

咱們在 章節 2.2 中詳細去說明。

除此之外,我們在網頁中定義 canvas 元素之後,它只是一張空白的畫布,想要在畫布上繪畫,一定要經過下面幾步。

  1. 獲取 canvas 元素對應的 DOM 物件,這必須是一個 canvas 物件
  2. 呼叫 canvas 物件的 getContext( ) 方法,該方法返回一個 canvasRenderingContext2D 物件,該物件可以繪製圖形。
  3. 呼叫 canvasRenderingContext2D 物件的方法進行繪圖。

那麼我們就來開始我們的canvas 實戰,來看看 canvas 該如何會繪製圖形。

2.canvas 實戰

2.1 檢視當前瀏覽器對 canvas 的支援情況

我們在上面也說明了,我們的一些瀏覽器是不支援 canvas 的,這個時候我們應該怎麼去做呢?

這時候我們可以直接在 canvas 標籤之間去書寫內容,這麼做的好處是當你的瀏覽器不支援 canvas 的時候,我們可以去展示標籤之間的內容,具體如下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        html,body{
            margin: 0px;
        }
        canvas{
            background: #ccc;
        }
    </style>
</head>
<body>
    <canvas>
        我們在設定 canvas 之前需要首先監測使用者電腦是否支援 canvas
    </canvas>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

既然已經建立完成了具體的內容,那我們現在可以看見了麼?

我們雖然沒有給定 canvas 的寬度和高度,但是實際上我們的canvas 在頁面中是可見的

需要注意,canvas 預設樣式的寬度和高度 是 300px * 150px.

即使我們不去設定具體的寬度和高度,它也是可以顯示的。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <style type="text/css">
  html,body{
   margin: 0px;
  }
  canvas{
   background: #ccc;
  }
 </style>
</head>
<body>
 <canvas>
  我們在設定 canvas 之前需要首先監測使用者電腦是否支援 canvas
 </canvas>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2.png

那我們該如何去修改畫布的預設大小呢?

2.2 修改 Canvas 的畫布

按照我們正常的思路來說,我們會直接去使用 canvas_1.style.width = "500px"; 來去修改我們的 canvas 的寬度,但是這樣真的對麼?

答案當然是否定的,canvas 相當於是一張圖片,如果我們設定 <canvas width="500" height="500">.

這樣寫相當於圖片的實際大小是 500 * 500.

但是,假如我們這樣去書寫。

<canvas style="width:500px;height:500px;">

這樣實際是把 canvas 預設的 300 * 150 的圖片強行拉伸為 500px * 500px 了,所以這樣會導致我們的內容被強行縮放,從而導致問題。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <style type="text/css">
  html,body{
   margin: 0px;
  }
  canvas{
   background: #ccc;
  }
 </style>
</head>
<body>
 <canvas id="canvas_1">
  我們在設定 canvas 之前需要首先監測使用者電腦是否支援 canvas
 </canvas>
</body>
<script type="text/javascript">
 var canvas_1 = document.getElementById("canvas_1");
 // 設定寬度和高度,但是這種寫法會造成額外的問題
 // 畫布會拉伸
 // canvas_1.style.width = "500px";
 // canvas_1.style.height = "500px";

 // 所以推薦寫法
 // 1.使用內聯樣式表
 // 2.去使用點(.)
 canvas_1.width = "500"; //注意,不要加 px
 canvas_1.height = "500";

</script>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

2.3 獲取繪製環境

我們在上面已經設定了我們的畫布的大小,但是存在一個問題。

我們還沒有找到我們的畫布呀!~

要是我們連具體的畫布都沒有,我們又該向哪裡去繪畫呢?

實際上我們可以通過 var ctx = canvas_1.getContext("2d"); 來去獲取到我們的繪製環境。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <canvas id="canvas_1" width="500" height="400" style="box-shadow: 0 0 20px black;">
        當前瀏覽器不支援 canvas
    </canvas>
</body>
<script type="text/javascript">

    // 獲取 canvas 元素對應的 DOM 物件
    var canvas_1 = document.getElementById("canvas_1");

    // 獲取在 canvas 上繪圖的 canvasRenderingContent2D 物件
    var ctx = canvas_1.getContext("2d");

    // 列印一下,檢視是否能夠顯示具體環境
    console.log(ctx);

</script>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

假如列印成功,我們應該可以在瀏覽器中的 console 中檢視到我們的畫布具體資訊。

3.png

但是請注意,getContext("2d"); 中一定是2d而不是2D,否則不會生效。

2.4 繪製的座標軸

既然我們已經能夠獲取到我們具體的畫布了,那我們是不是開始繪製了呀。

先等等,我們首先先來分析一個問題,就是我們繪製圖形的時候,以這個一個區域,我們應該從哪裡開始,設定的數值又應該從哪裡開始呢?這時候你就應該去想一想,是不是存在這麼一個座標軸,可以根據這個座標軸來書寫我們的數值呢?

Paste_Image.png

請注意,橫軸向右是正,縱軸向下是正

2.5 繪製直線

我們既然要畫一條直線,我們是不是至少應該有這麼幾個條件呢?

  • 線的起點
  • 線的終點
  • 線的顏色
  • 線的寬度

所以我們接下來,就需要開始我們的程式碼書寫了。

我們該如何去進行繪製呢?

我們需要一些工具,需要具體的方法。

方法 說明
beginPath() 開始定義路徑
closePath() 關閉前面定義的路徑
moveTo(float x,float y) 把 canvas 的當前路徑的結束點移動到 x, y 對應的點
lineTo(float x,float y) 把 canvas 的當前路徑從當前結束點連線到 x , y 對應的點

需要注意,moveTo 可以簡單理解為,把當前繪製圖像的起點設定為某一特定座標,而 lineTo 則是將當前的起點和你想要設定的那個點之間連線起來。

而 beginPath 是表示開始定義路徑,不會產生特殊的效果。而 closePath 除了表示關閉當前定義的路徑之外,還會有一個特殊的作用,就是可以將當前繪製圖形的最後一個點和我們繪製圖形開始的點進行連線,這一點咱們在章節2.6 中詳細去看一下。當然,如果你只需要畫一條線,不去加beginPath 和 closep 你的內容實際也是可以出來的,但是推薦加上。

這個時候我們可以來執行一下,看看效果是否能夠出來。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div>
        <canvas id="canvas_1" width="1000" height="500" style="box-shadow: 0px 0px 20px black;">
            當前瀏覽器不支援 canvas
        </canvas>
    </div>
</body>
<script type="text/javascript">
    // 獲取 canvas 元素對應的 DOM 物件
    var canvas_1 = document.getElementById("canvas_1");

    // 獲取在 canvas 上繪圖的 canvasRenderingContent2D 物件
    var ctx = canvas_1.getContext("2d");

    // 列印一下,檢視是否能夠顯示具體環境
    console.log(ctx);

    // 開始繪製
    ctx.beginPath();

    //設定繪製起點
    ctx.moveTo(0,0);

    //設定繪製下一個點
    ctx.lineTo(700,400);

    //結束繪製
    ctx.closePath();

</script>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31