컴퓨터는 잘못이 없다..

[JavaScript]addEventListener을 이용해 그림판 만들어보기 본문

공부/JavaScript

[JavaScript]addEventListener을 이용해 그림판 만들어보기

도토리까꿍v 2020. 11. 9. 12:54
Contents 접기

[만들 그림판]

 

[그림판 예제 코드]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step07_DrawPanel.html</title>
    <!--css영역-->
    <style>
        canvas{
            border: 1px dashed gray;
            cursor: crosshair;
        }
    </style>
</head>
<body>
    <!--html영역-->
    <h1>그림판</h1>
    <canvas id="myCanvas" width="500" height="500"></canvas>
    <br/>
    <input type="color" id="inputColor"/>
    <select id="lineWidth">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option>4</option>
        <option selected>5</option>
        <option>6</option>
        <option>7</option>
        <option>8</option>
        <option>9</option>
        <option>10</option>
        <!--option selected 는 defalut로 선택되는 option-->
        <!--selected는 checkbox, radio의 checked 같은 역할!-->
        <!--value를 정해주지 않으면 innerText가 value가 된다!-->
    </select>
    <button id="fillBackBtn">배경색</button>
    <label>
        지우개 기능
        <input type="checkbox" id="eraseCheck"/>
    </label>
    <!--js 영역 시작-->
    <script>
        //canvas  요소의 참조값 얻어오기 
        let canvas=document.querySelector("#myCanvas");
        //canvas 에 렌더링 할수 있는 도구(context) 의 참조값 얻어오기 
        let context=canvas.getContext("2d");
        //페이지 로딩 시점에 선의 굵기 초기값 지정하기 
        let currentWidth=5;
        //선의 시작과 끝을 둥글게
        context.lineCap="round";
        //선의 교차점을 둥글게
        context.lineJoin="round";
        //선의 색상을 저장할 변수 만들고 "black" 으로 초기화 
        let color="black";
        //선의 색상 지정하기 
        context.strokeStyle=color;
        //마우스가 down 상태 인지 여부
        let isMouseDown=false;
        
        //그림을 그리는 상태인지 지우는 상태인지 여부 
        // false => 그림을 그리는 상태, true => 지우는 상태  
        let isErase=false; 


        //아래 6줄은 페이지가 로딩되는 시점에 그림판에 그림이 그려져있음 
        // context.beginPath();
        // context.moveTo(100, 100);
        // context.lineTo(200, 200);
        // context.lineTo(200, 100);
        // context.stroke();
        // context.closePath();


        //그림 그리는 상태 
        canvas.addEventListener("mousedown", function(event){
            //마우스 down 상태로 바꿔준다.
            isMouseDown=true;
            //이벤트가 일어난곳의 좌표
            let x=event.offsetX;
            let y=event.offsetY;
            //mousedown 이벤트가 일어난 지점에서 부터 그릴 준비를 한다. 
            context.beginPath();
            context.moveTo(x, y);
            //변수에 저장된 값으로 색상 지정
            context.strokeStyle=color;
            //변수에 저장된 값으로 선의 굵기 지정
            context.lineWidth=currentWidth;
        });

        //그림 그리는 상태 or 그림 지우는 상태 
        //canvas 에 mousemove 이벤트 처리 
        canvas.addEventListener("mousemove", function(event){
            //만일 마우스 down 상태 일때
            if(isMouseDown == true){
                //이벤트가 일어난곳의 좌표
                let x=event.offsetX;
                let y=event.offsetY;
                if(isErase){ //만일 지우는 작업 상태이면 
                    //현재 커서 위치에 10*10 사이즈의 흰색 블록이 생김
                    context.clearRect(x, y, 10, 10);
                }else{//지우는 작업 상태가 아니라면 (그리는 상태라면)
                    context.lineTo(x, y);
                    context.stroke();
                }
            }
        });

        //global변수 중 boolean type true, false 설정해주는 코드 
        canvas.addEventListener("mouseup", function(){
            //더이상 작업(그림 or 지우기) 않도록 상태값을 바꿔준다. 
            isMouseDown=false;
        });

        //global변수 중 boolean type true, false 설정해주는 코드 
        //체크박스의 체크 상태가 바뀌었을때 호출되는 함수 등록
        document.querySelector("#eraseCheck")
            .addEventListener("change", function(){
                //체크여부를 (true or false) 변수에 담는다.
                //★★★ 다른 input요소와는 다르게 checked 여부를 
                //불러올 수 있음!!
                isErase=this.checked;
                //지우는 상태 여부에 따라 커서의 모양을 바꿔준다.
                if(isErase){
                    document.querySelector("#myCanvas")
                        .style.cursor="not-allowed";
                }else{
                    document.querySelector("#myCanvas")
                        .style.cursor="crosshair";
                }
            });        

        //선의 색상 변경 
        document.querySelector("#inputColor")
            .addEventListener("change", function(){
                // color 변수에 현재 value 값을 대입한다. 
                color=this.value;
            });
        
        //선의 굵기 설정
        // select 요소에 change 이벤트가 발생했을때 실행할 함수 등록
        document.querySelector("#lineWidth")
            .addEventListener("change", function(){
                //change 이벤트가 일어난 요소의 value 값을 변수에 대입
                currentWidth=this.value;
            });

        //선의 배경색 설정
        //배경색상 버튼을 눌렀을때 실행할 함수 등록 
        document.querySelector("#fillBackBtn")
            .addEventListener("click", function(){
                //현재 선택된 색상을 체울 색으로 지정하고 
                context.fillStyle=color;
                // fillRect(x, y, width, height) 로 지정된 사각형 영역을 체운다.
                context.fillRect(0, 0, 500, 500);
            });


    </script>
</body>
</html>

 

[참고]

1. 여기서 등장하는 x축과 y축

 


 

2.casvas영역?


3.rgb

 

'공부 > JavaScript' 카테고리의 다른 글

[JavaScript]산술연산자  (0) 2020.11.09
[JavaScript]object type 참조하기  (0) 2020.11.09
[JavaScript]addEventListener 퀴즈  (0) 2020.11.09
Comments