Javascript小型專案練習10-Fun with HTML5 Canvas(JS30-8)

今天繼續來做JS30~!說真的,因為插入了node跟其他課程,這部分的進度停了好幾天QAQ
這次的主題較為特別,利用了HTML的canvas標籤做一個簡單的畫布,配合JS的事件監聽完成奇妙的小畫家系統~!

HTML

<body>
  <canvas id="draw" width="800" height="800"></canvas>
</body> 

CSS

  html,
    body {
      margin: 0;
    } 

Javascript

    const canvas = document.querySelector('#draw')
    const ctx = canvas.getContext('2d')
    //將畫布設至為視窗大小
    canvas.width = window.innerWidth
    canvas.height = window.innerHeight
    //設置畫筆的粗度以及形狀
    ctx.lineJoin = 'round'
    ctx.lineCap = 'round'
    ctx.lineWidth = 25;
    //設置flag以及起始座標
    let isDrawing = false;
    let lastX = 0;
    let lastY = 0;
    //色彩設置
    let hue = 0


    function draw(e) {
      if (!isDrawing) return;
      ctx.strokeStyle = `hsl(${hue},100%,50%)`
      ctx.beginPath()
      ctx.moveTo(lastX, lastY)
      ctx.lineTo(e.offsetX, e.offsetY)
      ctx.stroke();
      [lastX, lastY] = [e.offsetX, e.offsetY]
      hue <= 360 ? hue++ : hue = 0;
    }

    canvas.addEventListener('mousedown', (e) => {
      isDrawing = true;
      [lastX, lastY] = [e.offsetX, e.offsetY]
    });
    canvas.addEventListener('mousemove', draw)
    canvas.addEventListener('mousedown', () => isDrawing = true)
    canvas.addEventListener('mouseup', () => isDrawing = false)
    canvas.addEventListener('mouseout', () => isDrawing = false) 

學習重點

  • 利用mousemove、 mousedown、 mouseup以及mouseout等不同事件操作HTML元素
  • 了解hsl顏色設置(類似RGB,不過起點是紅色,另外還帶有其他參數)
  • 了解如何在canvas上繪製路徑
    ctx.beginPath() 開啟路徑
    ctx.moveTo(起點位置)
    ctx.lineTo(終點位置)
    ctx.stroke()結束路徑
    在觸動mousemove事件時,都會在事件內儲存offsetX以及offsetY的參數,利用這兩個參數來做為終點位置的座標。

最終成品

設置完JS部分的程式碼後,就可以畫自己想畫的東西囉! 順帶一提,我畫的是皮卡丘,我繪畫水平跟小孩子沒兩樣,當時在補習班教書我屢戰屢敗給一群小鬼頭。

參考文章

RGB、HSL、Hex 網頁色彩碼,看完這篇全懂了
Canvas 基本用途
繪製圖形

發表留言