Navigate back to the homepage

Day8: Fun with HTML5 Canvas

JavaScript30
June 27th, 2021 · 1 min read

專案介紹: 練習操作 Canvas

作品頁面:https://iris1114.github.io/javascript30/08_Fun-with-HTML5-Canvas/index.html

Step1 : 設定變數

1//取得 #draw 元素。
2const canvas = document.querySelector("#draw");
3//getContext 取得context 來繪畫, 2d 代表二維繪圖
4const ctx = canvas.getContext("2d");
5
6//將原本高寬800的canvas設定為window寬高
7canvas.width = window.innerWidth;
8canvas.height = window.innerHeight;
9
10//設定樣式
11ctx.strokeStyle = "#BADA55"; //筆觸顏色
12ctx.lineJoin = "round"; //線條連接樣式
13ctx.lineCap = "round"; //線條結束樣式
14ctx.lineWidth = 100; //線條寬度
15
16//設定參數
17let isDrawing = false; //判斷是否執行畫圖中
18let lastX = 0; //繪畫位置
19let lastY = 0;
20let hue = 0; //顏色,在hsl中使用
21let direction = true; //判斷粗細增減用

Step 2 : 設定 draw() 函式

1function draw(e) {
2 if (!isDrawing) return; //如果沒有執行畫圖就停止
3 ctx.strokeStyle = `hsl(${hue}, 100%, 50%)`; //顏色
4 ctx.beginPath(); //初始化一條路徑。
5 // start from
6 ctx.moveTo(lastX, lastY); //初始位置
7 // go to
8 ctx.lineTo(e.offsetX, e.offsetY); //連接路徑終點到指定的座標中
9 ctx.stroke(); //繪製路徑
10 [lastX, lastY] = [e.offsetX, e.offsetY]; //把結束點放回 X 和 Y 變數
11
12 hue++;
13 if (hue >= 360) {
14 //當色碼超過360後歸零
15 hue = 0;
16 }
17 //如果筆觸粗細大於等於 50 或 小於等於 1 就反轉
18 if (ctx.lineWidth >= 50 || ctx.lineWidth <= 1) {
19 direction = !direction;
20 }
21
22 //// 增加或減少筆觸粗細
23 if (direction) {
24 ctx.lineWidth++;
25 } else {
26 ctx.lineWidth--;
27 }
28}

Step3 : 綁定 mouse 事件

1//mousedown 按下滑鼠按鍵畫的時候,isDrawing = true, 把目前滑鼠的位置設定為變數中的X、Y
2canvas.addEventListener("mousedown", (e) => {
3 isDrawing = true;
4 [lastX, lastY] = [e.offsetX, e.offsetY];
5});
6
7//滑鼠移動中
8canvas.addEventListener("mousemove", draw);
9//放開滑鼠按鍵時
10canvas.addEventListener("mouseup", () => (isDrawing = false));
11//滑鼠移開
12canvas.addEventListener("mouseout", () => (isDrawing = false));

補充: Canvas

HTML5 的 Canvas 只有兩個屬性跟兩個方法:

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

前三個是一定會用到的,我們通常一定會指定 canvas 的長寬。另外,不使用 getContext 來取得 context,就沒有方法繪圖了。

Canvas 2d context 的操作大概分成幾群:

  • 管理狀態:save(), restore()
  • 變形:scale(), rotate(), translate(), transform(), setTransform()
  • 畫面組成:globalAlpha, globalCompositionOperation
  • 色彩與風格:strokeStyle, fillStyle, createLinearGradient(), createRadialGradient(), createPattern()
  • 線條邊角及組合:lineWidth, lineCap, lineJoin, miterLimit
  • 陰影:shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor
  • 方形繪出:clearRect(), fillRect(), strokeRect()
  • 路徑 API:beginPath(), closePath(), moveTo(), lineTo(), quadraticCurveTo(), bezierCurveTo(), arcTo(), rect(), arc(), fill(), stroke(), clip(), isPointInPath()
  • 焦點管理:drawFocusRing()
  • 文字:font, textAlien, textBaseline, fillText(), strokeText(), measureText()
  • 影像:drawImage(), createImageData(), getImageData(), putImageData()

參考資料

https://ithelp.ithome.com.tw/articles/10055676 https://guahsu.io/2017/06/JavaScript30-08-Fun-with-HTML5-Canvas/

More articles from Iris Blog

Day7: Array Cardio Day 2

練習 array 第二波, 包含 some、 every、 find、 findIndex、slice

June 25th, 2021 · 1 min read

Day6: Type-Ahead

用 fetch 去 get 城市資料,並用正規表達式來回傳搜尋相關程式

June 23rd, 2021 · 1 min read
© 2020–2021 Iris Blog
Link to $mailto:qweichew@gmail.comLink to $https://github.com/iris1114Link to $https://www.instagram.com/iris.justdoit/Link to $https://www.linkedin.com/in/iris-chew