이번 글에서 다룰 내용
- canvas란?
- canvas 크기를 브라우저 창 크기로 지정
- 브라우저 크기가 변할 때마다 canvas 크기 새로 설정
- 고화질의 애니메이션을 위한 canvas 크기 설정
//app.js
class App () {
constructor() {
this.canvas = document.createElement('canvas');
this.context = this.canvas.getContext('2d');
document.body.appendChild(canvas);
}
...
}
canvas.getContext(contextType, contextAttribute)
2d
- 2차원 랜더링 컨텍스트ctx.rect(x, y, width, height);
class App {
constructor() {
...
// 직사각형 생성
this.ctx.rect(0, 0, this.canvas.width, this.canvas.height);
this.ctx.fillStyle = '#b197fc';
this.ctx.fill();
}
}
new App();
캔버스가 너무 작으니 클라이언트창만하게 바꿔보자
class App {
constructor() {
...
this.canvas.width = document.body.clientX;
this.canvas.height = document.body.clientY;
// 직사각형 생성
this.ctx.rect(0, 0, this.canvas.width, this.canvas.height);
this.ctx.fillStyle = '#b197fc';
this.ctx.fill();
}
}
new App();
html을 확인해보면 사이즈가 제한되어있음을 확인할 수 있다
/*
stylesheet.css
*/
html {
width: 100%;
height: 100%;
}
하지만 이번에는 body사이즈가 제한된 것을 볼 수 있다
따라서 body 사이즈도 100%로 조정해주었다
/*
stylesheet.css
*/
body {
width: 100%;
height: 100%;
}
//app.js
class App {
constructor() {
...
//윈도우 창 크기가 변할 때마다 resize 함수를 호출
window.addEventListener('resize', this.resize.bind(this));
this.resize();
}
//캔버스 사이즈 지정하는 함수
resize() {
this.canvas.width = document.body.clientWidth;
this.canvas.height = document.body.clientHeight;
this.animate();
}
//그림 그리는 함수
animate() {
//보라색으로 캔버스 채우기
this.ctx.rect(0, 0, this.canvas.width, this.canvas.height);
this.ctx.fillStyle = '#b197fc';
this.ctx.fill();
//핑크색 공 그리기
this.ctx.beginPath();
this.ctx.arc(200, 200, 50, 0, 2 * Math.PI);
this.ctx.fillStyle = '#faa2c1';
this.ctx.fill();
}
}
new App();
브라우저 창 크기가 변하면 보라색 상자크기도 맞춰 변한다
핑크 공은 지정사이즈라 변하지 않는다
//app.js
resize() {
...
this.stageWidth = document.body.clientWidth;
this.stageHeight = document.body.clientHeight;
this.canvas.width = this.stageWidth * 2;
this.canvas.height = this.stageHeight * 2;
}
/*
stylesheet.css
*/
canvas {
width: 100%;
height: 100%;
}
하지만 ctx로 그린 공의 크기가 너무 작아졌다. 캔버스의 크기가 커진만큼 ctx의 크기도 키워줘야 처음에 의도했던 비율대로 그림이 그려지게 된다
//app.js
resize() {
...
this.ctx.scale(2, 2);
...
}
//app.js
class App {
constructor() {
this.canvas = document.createElement('canvas');
this.canvas.setAttribute('id', 'canvas');
this.ctx = this.canvas.getContext('2d');
document.body.appendChild(this.canvas);
window.addEventListener('resize', this.resize.bind(this));
this.resize();
}
resize() {
this.stageWidth = document.body.clientWidth;
this.stageHeight = document.body.clientHeight;
this.canvas.width = this.stageWidth * 2;
this.canvas.height = this.stageHeight * 2;
this.ctx.scale(2, 2);
this.animate();
}
animate() {
this.ctx.rect(0, 0, this.stageWidth, this.stageHeight);
this.ctx.fillStyle = '#b197fc';
this.ctx.fill();
this.ctx.beginPath();
this.ctx.arc(200, 200, 50, 0, 2 * Math.PI);
this.ctx.fillStyle = '#faa2c1';
this.ctx.fill();
}
}
new App();
/*
stylesheet.css
*/
html {
width: 100%;
height: 100%;
}
body {
width: 100%;
height: 100%;
background-color: #161e38;
}
canvas {
width: 100%;
height: 100%;
}