JS로 드로잉 앱을 만들 수 있습니다.

이 기사에서는 JavaScript 및 HTML5 캔버스를 사용하여 그리기/고통 앱을 만드는 방법을 보여줍니다.

특징:


  • 캔버스에 그리기
  • 여러 색상
  • 클리어 캔버스
  • 도면을 이미지로 저장


  • 먼저 캔버스 요소가 있는 index.html 파일을 만듭니다.

    <!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">
        <link rel="stylesheet" href="style.css">
        <title>JavaScript Drawing APP</title>
    </head>
    <body>
        <canvas id="canvas"></canvas>
    
        <script src="main.js"></script>
    </body>
    </html>
    

    이제 기본 재설정으로 style.css를 만들어 보겠습니다.

    *{
        margin: 0;
        padding: 0;
    }
    

    그런 다음 마지막으로 캔버스를 대상으로 지정하고 크기를 화면 크기로 설정할 main.js를 만듭니다.

    const canvas = document.getElementById("canvas")
    canvas.height = window.innerHeight
    canvas.width = window.innerWidth
    
    // ctx is the context of our canvas
    // we use ctx to draw on the canvas
    const ctx = canvas.getContext("2d")
    
    // lets create a rectangle for testing purposes
    ctx.fillStyle = "red"
    ctx.fillRect(100, 100, 100, 100)
    

    이제 브라우저에서 열면 빨간색 사각형이 표시됩니다.


    좋습니다. 사각형을 삭제하고 사용자가 마우스를 움직일 때마다 마우스 위치를 얻고 싶습니다. 이를 위해 mousemove 이벤트를 사용할 수 있습니다.

    const canvas = document.getElementById("canvas")
    canvas.height = window.innerHeight
    canvas.width = window.innerWidth
    
    const ctx = canvas.getContext("2d")
    
    window.addEventListener("mousemove", (e) => {
        console.log("Mouse X: " + e.clientX)
        console.log("Mouse Y: " + e.clientY)
    })
    


    엄청난!!! 이제 이전 마우스 위치를 추적하고 이전 마우스 위치에서 현재 마우스 위치까지 선을 그려야 합니다.

    const canvas = document.getElementById("canvas")
    canvas.height = window.innerHeight
    canvas.width = window.innerWidth
    
    const ctx = canvas.getContext("2d")
    
    // previous mouse positions
    // They will be null initially
    let prevX = null
    let prevY = null
    
    // How thick the lines should be
    ctx.lineWidth = 5
    
    window.addEventListener("mousemove", (e) => {
        // initially previous mouse positions are null
        // so we can't draw a line
        if(prevX == null || prevY == null){
            // Set the previous mouse positions to the current mouse positions
            prevX = e.clientX
            prevY = e.clientY
            return
        } 
    
        // Current mouse position
        let currentX = e.clientX
        let currentY = e.clientY
    
        // Drawing a line from the previous mouse position to the current mouse position
        ctx.beginPath()
        ctx.moveTo(prevX, prevY)
        ctx.lineTo(currentX, currentY)
        ctx.stroke()
    
        // Update previous mouse position
        prevX = currentX
        prevY = currentY
    })
    


    이제 마우스를 움직이면 선이 그려지는 것을 볼 수 있습니다. 그러나 우리는 선이 통제할 수 없게 그려지는 것을 원하지 않습니다. 따라서 변수let draw = false를 선언합니다. 그리고 drawtrue만 그릴 것입니다.
    따라서 mousedownmouseup 이벤트를 들을 수 있습니다. 그리고 사용자가 마우스를 눌렀을 때 drawtrue로 설정하고 마우스를 놓았을 때 false로 설정합니다.

    const canvas = document.getElementById("canvas")
    canvas.height = window.innerHeight
    canvas.width = window.innerWidth
    
    const ctx = canvas.getContext("2d")
    
    let prevX = null
    let prevY = null
    
    ctx.lineWidth = 5
    
    let draw = false
    
    // Set draw to true when mouse is pressed
    window.addEventListener("mousedown", (e) => draw = true)
    // Set draw to false when mouse is released
    window.addEventListener("mouseup", (e) => draw = false)
    
    window.addEventListener("mousemove", (e) => {
        // if draw is false then we won't draw
        if(prevX == null || prevY == null || !draw){
            prevX = e.clientX
            prevY = e.clientY
            return
        }
    
        let currentX = e.clientX
        let currentY = e.clientY
    
        ctx.beginPath()
        ctx.moveTo(prevX, prevY)
        ctx.lineTo(currentX, currentY)
        ctx.stroke()
    
        prevX = currentX
        prevY = currentY
    })
    



    대박!!! 이제 HTML에 색상 변경, 캔버스 지우기 및 그림 저장을 위한 버튼을 추가해 보겠습니다.

    <!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">
        <link rel="stylesheet" href="style.css">
        <title>Document</title>
    </head>
    <body>
        <canvas id="canvas"></canvas>
        <div class="nav">
            <!-- We will be accessing the data-clr in JavaScript -->
            <div class="clr" data-clr="#000"></div>
            <div class="clr" data-clr="#EF626C"></div>
            <div class="clr" data-clr="#fdec03"></div>
            <div class="clr" data-clr="#24d102"></div>
            <div class="clr" data-clr="#fff"></div>
            <button class="clear">clear</button>
            <button class="save">save</button>
        </div>
    
        <script src="main.js"></script>
    </body>
    </html>
    

    또한 CSS에서 스타일을 지정해야 합니다.

    *{
        margin: 0;
        padding: 0;
    }
    
    .nav{
        width: 310px;
        height: 50px;
        position: fixed;
        top: 0;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        justify-content: space-around;
        opacity: .3;
        transition: opacity .5s;
    }
    .nav:hover{
        opacity: 1;
    }
    
    .clr{
        height: 30px;
        width: 30px;
        background-color: blue;
        border-radius: 50%;
        border: 3px solid rgb(214, 214, 214);
        transition: transform .5s;
    }
    .clr:hover{
        transform: scale(1.2);
    }
    .clr:nth-child(1){
        background-color: #000;
    }
    .clr:nth-child(2){
        background-color: #EF626C;
    }
    .clr:nth-child(3){
        background-color: #fdec03;
    }
    .clr:nth-child(4){
        background-color: #24d102;
    }
    .clr:nth-child(5){
        background-color: #fff;
    }
    
    button{
        border: none;
        outline: none;
        padding: .6em 1em;
        border-radius: 3px;
        background-color: #03bb56;
        color: #fff;
    }
    .save{
        background-color: #0f65d4;
    }
    

    페이지는 다음과 같아야 합니다.

    이제 클래스가 clr인 div를 클릭할 때마다 선의 색상을 해당 div의 data-clr 속성에 추가합니다.

    const canvas = document.getElementById("canvas")
    canvas.height = window.innerHeight
    canvas.width = window.innerWidth
    
    const ctx = canvas.getContext("2d")
    
    let prevX = null
    let prevY = null
    
    ctx.lineWidth = 5
    
    let draw = false
    
    // Selecting all the div that has a class of clr
    let clrs = document.querySelectorAll(".clr")
    // Converting NodeList to Array
    clrs = Array.from(clrs)
    
    clrs.forEach(clr => {
        clr.addEventListener("click", () => {
            ctx.strokeStyle = clr.dataset.clr
        })
    })
    
    window.addEventListener("mousedown", (e) => draw = true)
    window.addEventListener("mouseup", (e) => draw = false)
    
    window.addEventListener("mousemove", (e) => {
        if(prevX == null || prevY == null || !draw){
            prevX = e.clientX
            prevY = e.clientY
            return
        }
    
        let currentX = e.clientX
        let currentY = e.clientY
    
        ctx.beginPath()
        ctx.moveTo(prevX, prevY)
        ctx.lineTo(currentX, currentY)
        ctx.stroke()
    
        prevX = currentX
        prevY = currentY
    })
    


    예이!!! 이제 지우기 버튼이 작동하도록 합시다. 따라서 클릭하면 캔버스가 지워집니다.

    const canvas = document.getElementById("canvas")
    canvas.height = window.innerHeight
    canvas.width = window.innerWidth
    
    const ctx = canvas.getContext("2d")
    
    let prevX = null
    let prevY = null
    
    ctx.lineWidth = 5
    
    let draw = false
    
    let clrs = document.querySelectorAll(".clr")
    clrs = Array.from(clrs)
    clrs.forEach(clr => {
        clr.addEventListener("click", () => {
            ctx.strokeStyle = clr.dataset.clr
        })
    })
    
    let clearBtn = document.querySelector(".clear")
    clearBtn.addEventListener("click", () => {
        // Clearning the entire canvas
        ctx.clearRect(0, 0, canvas.width, canvas.height)
    })
    
    
    window.addEventListener("mousedown", (e) => draw = true)
    window.addEventListener("mouseup", (e) => draw = false)
    
    window.addEventListener("mousemove", (e) => {
        if(prevX == null || prevY == null || !draw){
            prevX = e.clientX
            prevY = e.clientY
            return
        }
    
        let currentX = e.clientX
        let currentY = e.clientY
    
        ctx.beginPath()
        ctx.moveTo(prevX, prevY)
        ctx.lineTo(currentX, currentY)
        ctx.stroke()
    
        prevX = currentX
        prevY = currentY
    })
    

    거의 다 왔어!!! 이제 우리가 해야 할 일은 저장 버튼을 클릭했을 때 그림을 저장하는 것입니다.

    최종 JavaScript 코드는 다음과 같습니다.



    const canvas = document.getElementById("canvas")
    canvas.height = window.innerHeight
    canvas.width = window.innerWidth
    
    const ctx = canvas.getContext("2d")
    
    let prevX = null
    let prevY = null
    
    ctx.lineWidth = 5
    
    let draw = false
    
    let clrs = document.querySelectorAll(".clr")
    clrs = Array.from(clrs)
    clrs.forEach(clr => {
        clr.addEventListener("click", () => {
            ctx.strokeStyle = clr.dataset.clr
        })
    })
    
    let clearBtn = document.querySelector(".clear")
    clearBtn.addEventListener("click", () => {
        ctx.clearRect(0, 0, canvas.width, canvas.height)
    })
    
    // Saving drawing as image
    let saveBtn = document.querySelector(".save")
    saveBtn.addEventListener("click", () => {
        let data = canvas.toDataURL("imag/png")
        let a = document.createElement("a")
        a.href = data
        // what ever name you specify here
        // the image will be saved as that name
        a.download = "sketch.png"
        a.click()
    })
    
    window.addEventListener("mousedown", (e) => draw = true)
    window.addEventListener("mouseup", (e) => draw = false)
    
    window.addEventListener("mousemove", (e) => {
        if(prevX == null || prevY == null || !draw){
            prevX = e.clientX
            prevY = e.clientY
            return
        }
    
        let currentX = e.clientX
        let currentY = e.clientY
    
        ctx.beginPath()
        ctx.moveTo(prevX, prevY)
        ctx.lineTo(currentX, currentY)
        ctx.stroke()
    
        prevX = currentX
        prevY = currentY
    })
    



    그리고 거기에서 우리는 해냈습니다. 완전한 소스 코드here를 얻을 수 있습니다.
    내 다른 기사와 YouTube 채널을 확인하십시오.





    도움이 되었나요? Patreon에서 저를 지원해주세요



    좋은 웹페이지 즐겨찾기