색 바꾸기!!
<body>
<canvas>
</canvas>
<input id="line-width" type="range" min="1" max="10" value="5" step="0.1">
<input id="color" type="color">
<script src="js/app.js"></script>
</body>
input 태그를 추가해 준다.
그러면 바 옆에 색을 조정할 수 있는 게 생기고 여기서 원하는 색을 택할 수 있다.
하지만 자바스크립트랑 연결이 되지 않아서 현재 상태로는 색이 바뀌지 않는다.
const color = document.getElementById("color");
color.addEventListener("change", onColorChange);
자바스크립트로 가서 컬러 인풋태그를 가져오고 아까와 마찬가지로 change 이벤트를 추가해 줄 것이다.
onColorChange 함수를 만들어서 아까와 마찬가지로 콘솔로 event.target.value 값을 출력해보면 색의 코드가 출력되는 것을 볼 수 있다.
function onColorChange(event) {
ctx.strokeStyle = event.target.value;
ctx.fillStyle = event.target.value;
}
event.target.value을 strokeStyle과 연결시켜 주면 (fillColor는 뒤에 가서 페인트통 기능을 만들 것임)
색을 바꿀 때마다 선의 색도 바뀐다!
이번에는
이렇게 미리 저장되어 있는 색 팔레트를 만들어 볼 것이다.
<body>
<canvas>
</canvas>
<input id="line-width" type="range" min="1" max="10" value="5" step="0.1">
<input id="color" type="color">
<div class="color-option" style="background-color: #ffffff;" data-color="#ffffff"></div>
<div class="color-option" style="background-color: #c3c3c3;" data-color="#c3c3c3"></div>
<div class="color-option" style="background-color: #585858;" data-color="#585858"></div>
<div class="color-option" style="background-color: #000000;" data-color="#000000"></div>
<div class="color-option" style="background-color: #ffe396;" data-color="#ffe396"></div>
<div class="color-option" style="background-color: #ffff20;" data-color="#ffff20"></div>
<div class="color-option" style="background-color: #6dff4d;" data-color="#6dff4d"></div>
<div class="color-option" style="background-color: #1ede5e;" data-color="#1ede5e"></div>
<div class="color-option" style="background-color: #88fff3;" data-color="#88fff3"></div>
<div class="color-option" style="background-color: #3f3ae3;" data-color="#3f3ae3"></div>
<div class="color-option" style="background-color: #1c6cec;" data-color="#1c6cec"></div>
<div class="color-option" style="background-color: #ca74ff;" data-color="#ca74ff"></div>
<div class="color-option" style="background-color: #ffa0db;" data-color="#ffa0db"></div>
<div class="color-option" style="background-color: #ec1c24;" data-color="#ec1c24"></div>
<script src="js/app.js"></script>
</body>
먼저 html문서 내에다가 이와 같이 div태그를 만들고 style 옵션으로 팔레트에 들어갈 배경색상을 지정해 준다.
data-color안에도 마찬가지로 해당 색상코드를 넣는다 (data- 옵션은 우리가 원하는 옵션을 만들어서 지정해 줄 수 있다. data-color가 아니라 data-tomato로 적어도 상관없다. 이것을 자바스크립트로 가져와서 쓸 것이다.)
.color-option {
width: 30px; height: 30px;
cursor: pointer;
}
css로 와서 크기를 지정해 주면
이와 같이 팔레트가 생성되었다.
const colorOptions = Array.from(document.getElementsByClassName('color-option'));
자바스크립트로 와서 방금 적었던 div 태그들을 가져온다. 뒤에서 forEach를 사용해야 하는데 forEach를 사용하려면 배열로 반환해줘야 하기 때문에 Array.from()이라는 함수를 이용하였다.
function onColorClick(event) {
console.log(event.target);
}
colorOptions.forEach((color) => color.addEventListener("click", onColorClick));
colorOptions를 folEacg함수를 이용해서 가져와서 클릭 이벤트를 추가해 준다.
그리고 콘솔 dir로 event.target 확인해보면
dataset이라는 것이 나온다.
function onColorClick(event) {
console.dir(event.target.dataset.color);
}
이것을 이용하여 이렇게 작성한 후 클릭해 보면
색들을 클릭해보면 이렇게 색깔 코드만 출력이 된다.
function onColorClick(event) {
ctx.strokeStyle = event.target.dataset.color;
ctx.fillStyle = event.target.dataset.color;
}
아까와 비슷하게 연결시켜 줌
function onColorChange(event) {
colorStyle(event.target.value)
}
function onColorClick(event) {
const colorValue = event.target.dataset.color
colorStyle(colorValue)
color.value = colorValue;
}
function colorStyle(color) {
ctx.strokeStyle = color;
ctx.fillStyle = color;
}
중복되는 부분이 많기 때문에 따로 함수를 만들어서 바꿔주었다.
그리고 지정된 팔레트를 클릭했을 때 input의 색도 바뀌게 하기 위해 onColorClick함수 안에 color.value 값을 event.target.dataset.color 값으로 연결시켜주었다.
채우기 버튼
<button id="mode-btn">Fill</button>
html에 버튼을 만들어 준다.
버튼을 클릭하면 채우기모드, 한 번 더 클릭하면 그리기 모드로 바꾸는 기능을 만들 것이다.
function onModeClick() {
if(isFilling) {
isFilling = false;
modeBtn.innerText = "Fill";
} else {
isFilling = true;
modeBtn.innerText = "Draw";
}
}
modeBtn.addEventListener("click", onModeClick);
js로 와서 불러와준다. 이전에 선을 그릴 때 클릭여부에 따라 false, true로 바뀌는 값을 이용했던 것처럼 이번에도 isFilling의 불린값을 이용할 것이다.
버튼의 텍스트도 모드에 따라 바꿔준다.
function onCanvasClick() {
if(isFilling) {
ctx.fillRect(0,0,800,800);
}
}
canvas.addEventListener("click", onCanvasClick);
canvas에 click 이벤트를 추가해 주고 onCanvasClick 함수를 만들어 isFilling이 true일 때 fillRect()를 이용하여 캔버스 크기만큼의 사각형을 만들어 색이 채워지도록 한다.
초기화&지우개 버튼
<button id="destroy-btn">Destroy</button>
const destroyBtn = document.getElementById("destroy-btn");
html 문서 내에 destroy 버튼을 생성하고 자바스크립트로 가져온다.
function onDestroyClick() {
ctx.fillStyle = "white";
ctx.fillRect(0, 0, 800, 800);
}
destroyBtn.addEventListener("click", onDestroyClick);
destroy 버튼을 클릭하면 그림판이 초기화되도록 만들 것이기 때문에 아까 채우기와 동일한 방법으로 만들되 채워지는 색을 하얀색으로 바꿔줄 것이다.
const CANVAS_WIDTH = 800;
const CANVAS_HEIGHT = 800;
canvas.width = CANVAS_WIDTH;
canvas.height = CANVAS_HEIGHT;
function onCanvasClick() {
if(isFilling) {
ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
}
}
function onDestroyClick() {
ctx.fillStyle = "white";
ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
}
캔버스의 넓이와 높이값이 반복적으로 나오기 때문에 이것을 상수로 지정해 주고 높이값과 넓이값이 있는 곳들을 방금 만든 상수로 지정해준다.
<button id="eraser-btn">Eraser</button>
const eraserBtn = document.getElementById("eraser-btn");
지우개 버튼을 생성한다
function onEraserClick() {
ctx.strokeStyle = "white";
isFilling = false;
modeBtn.innerText = "Fill";
}
eraserBtn.addEventListener("click", onEraserClick);
stroke색을 white로 바꿔주로
만약 채우기 모드일 때 색이 채워지지 않도록 하기 위해 isFilling을 false로 지정해줘야한다. 버튼 텍스트도 바꿔준다.