1. 程式人生 > 其它 >canvas實現簡易簽字板

canvas實現簡易簽字板

最近看到有些線上文件可以進行簽名,以防以後專案中會用到,提前用canvas練習一下,先看下最後實現的效果:

思路

  1. 在canva中監聽滑鼠按下事件(mousedown),獲取按下時滑鼠到canvas左上角的距離
  2. 以滑鼠按下的點為canvas畫筆的起點,監聽滑鼠移動事件(mousemove),根據滑鼠移動到的位置實時繪製線條
  3. 監聽滑鼠彈起事件(mouseup),移除對mousemove事件的監聽,防止滑鼠彈起繼續繪製

搭建html結構

html結構比較簡單,直接使用一個canvas標籤,設定其背景色,寬度和高度。背景色是為了方便看效果,寬度預設300px,高度預設150px,設定寬高時不用帶單位px

<!DOCTYPE html>
<html lang="en">

<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">
    <title>簡易簽名板</title>
</head>

<body>
    <canvas style="background-color: skyblue;" id="canvas" width="400" height="200"></canvas>

    <script src="./canvas.js"></script>
</body>

</html>

在canvas.js中實現功能

  1. 獲取canvas物件,獲取2D畫筆
const canvas = document.querySelector('#canvas')
if (canvas.getContext) {
  const ctx = canvas.getContext('2d');
}
  1. 根據滑鼠移動繪製路徑
// 監聽滑鼠按下事件
canvas.onmousedown = function(mousedownEvent) {
  // 獲取繪製起點,即滑鼠點選到canvas元素左上角的距離
  const startX = mousedownEvent.offsetX;
  const startY = mousedownEvent.offsetY;
  ctx.beginPath();
  // 將畫筆移動到起點
  ctx.moveTo(startX, startY);

  // 監聽滑鼠移動事件
  canvas.onmousemove = function(mousemoveEvent) {
    // 跟隨滑鼠移動來移動畫筆
    ctx.lineTo(mousemoveEvent.offsetX, mousemoveEvent.offsetY);
    // 實時繪製
    ctx.stroke();
  }

  // 監聽滑鼠彈起事件
  canvas.onmouseup = function() {
    canvas.onmousemove = null
    // 閉合路徑,使用之後線條起點和終點會自動連起來
    // ctx.closePath();
    // 滑鼠彈起時再繪製
    // ctx.stroke();
  }

  // 監聽滑鼠移出canvas區域事件
  canvas.onmouseout = function() {
    // 滑鼠移出時,停止對mousemove事件的監聽,否則在移出時滑鼠彈起事件監聽失效
    canvas.onmousemove = null
  }
}

注意點clientX/Y和offsetX/Y

擴充套件:將canvas轉化為圖片

// 按鈕點選事件
btn.onclick = function() {
  // 方法一
  const canvasData = canvas.toDataURL()
  const img = document.createElement('img')
  img.src=canvasData;
  body.appendChild(img)

  // 方法二
  // canvas.toBlob(function(blob) {
  //   var url = URL.createObjectURL(blob);
  //   const img = document.createElement('img')
  //   img.src=url;
  //   // 圖片載入成功後清除url,避免佔用記憶體
  //   img.onload = function() {
  //     URL.revokeObjectURL(url)
  //   };
  //   body.appendChild(img)
  // })
}