Jieunny์˜ ๋ธ”๋กœ๊ทธ

S4) Unit 2. [HTML/CSS] CSS ์• ๋‹ˆ๋ฉ”์ด์…˜ & Canvas ๋ณธ๋ฌธ

CodeStates/learning contents

S4) Unit 2. [HTML/CSS] CSS ์• ๋‹ˆ๋ฉ”์ด์…˜ & Canvas

Jieunny 2023. 3. 17. 12:00

๐Ÿ“ฃ  CSS ์• ๋‹ˆ๋ฉ”์ด์…˜

๐Ÿญ. CSS ์• ๋‹ˆ๋ฉ”์ด์…˜

โœ”๏ธ ์—ฌ๋Ÿฌ ๊ฐœ์˜ CSS ์Šคํƒ€์ผ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ „ํ™˜์‹œ์ผœ์ค€๋‹ค.

โžฐ @keyframes ํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‹œ๊ฐ„ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฐ€ํ•˜๊ฒŒ ์งœ์—ฌ์ง„ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿฎ. @keyframes

1๏ธโƒฃ CSS๋กœ ํ‚คํ”„๋ ˆ์ž„ ๋ธ”๋ก ๋งŒ๋“ค๊ธฐ

/* '%' ๋‹จ์œ„๋กœ ์‹œ๊ฐ„ ์ง„ํ–‰์— ๋”ฐ๋ฅธ ์ƒํƒœ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. */

@keyframes ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋ฆ„ {
	0% {            /* from ์ด๋ผ๊ณ  ์ž‘์„ฑํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.*/
		CSS์†์„ฑ : ์†์„ฑ๊ฐ’; 
	}

	50% {           /* ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง„ํ–‰๋„์— ๋”ฐ๋ฅธ ์Šคํƒ€์ผ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. */
                  /* ํ•„์š”ํ•˜๋‹ค๋ฉด 1๋ถ€ํ„ฐ 99๊นŒ์ง€๋„, ์†Œ์ˆ˜์ ๊นŒ์ง€๋„ ๋ชจ๋‘ ์ž‘์„ฑํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.*/
		CSS์†์„ฑ : ์†์„ฑ๊ฐ’;
	}

	100% {          /* to ๋ผ๊ณ  ์ž‘์„ฑํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.*/
		CSS์†์„ฑ : ์†์„ฑ๊ฐ’;
	}
}

 

2๏ธโƒฃ ํ‚คํ”„๋ ˆ์ž„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋งŒ๋“ค๊ธฐ

@keyframes lotate {
	0% {
		transform : rotate(0deg)
	}

	50% {
		transform : rotate(180deg)
	}

	100% {
		transform : rotate(360deg)
	}
}

/* ์‹œ์ž‘ ์‹œ์ ์—์„  0๋„, 50% ์‹œ์ ์—์„  180๋„, ์™„๋ฃŒ ์‹œ์ ์—์„  360๋„ ํšŒ์ „์‹œํ‚ค๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ž…๋‹ˆ๋‹ค. */

 

3๏ธโƒฃ ์ ์šฉ์‹œํ‚ค๊ณ  ์‹ถ์€ ์š”์†Œ์— animation ์†์„ฑ์œผ๋กœ ํ‚คํ”„๋ ˆ์ž„ ์ด๋ฆ„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

 

๐Ÿฏ. animation ์†์„ฑ

โœ”๏ธ animation : ๋„์–ด์“ฐ๊ธฐ๋กœ ์†์„ฑ์„ ๋‚˜์—ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ animation-name : ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ค‘๊ฐ„ ์ƒํƒœ๋ฅผ ์ง€์ •ํ•˜๋Š” ์ด๋ฆ„.  @keyframes ๋ธ”๋ก์— ์ž‘์„ฑ

โžฐ animation-duration : ํ•œ ์‹ธ์ดํด์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์žฌ์ƒ๋  ์‹œ๊ฐ„ ์ง€์ •

โžฐ animation-delay : ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์‹œ์ž‘์„ ์ง€์—ฐ์‹œํ‚ฌ ์‹œ๊ฐ„ ์ง€์ •

โžฐ animation-direction : ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ๋ฐฉํ–ฅ์„ ์ง€์ •

โžฐ animation-iteration-count : ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ช‡ ๋ฒˆ ๋ฐ˜๋ณต๋ ์ง€ ์ง€์ •

โžฐ animation-play-state : ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์žฌ์ƒ ์ƒํƒœ. ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋‹ค์‹œ ์žฌ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

โžฐ animation-timing-function : ์ค‘๊ฐ„ ์ƒํƒœ๋“ค์˜ ์ „ํ™˜์„ ์–ด๋–ค ์‹œ๊ฐ„๊ฐ„๊ฒฉ์œผ๋กœ ์ง„ํ–‰ํ• ์ง€ ์ง€์ •

โžฐ animation-fill-mode : ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์žฌ์ƒ ์ „ ํ›„์˜ ์ƒํƒœ ์ง€์ •

#logo {
	**animation-name : lotate;**    /* lotate ๋ผ๋Š” ์ด๋ฆ„์˜ ํ‚คํ”„๋ ˆ์ž„ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ */
	animation-duration : 3s;               /* 3์ดˆ ๋™์•ˆ ์žฌ์ƒํ•˜๋ฉฐ, */
	animation-iteration-count : infinite;  /* ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•˜๊ณ , */
    animation-timing-function : linear;    /* ์„ ํ˜•์œผ๋กœ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค. */
}

/* ์•„๋ž˜์™€ ๊ฐ™์ด ์ผ๊ด„ ์ž‘์„ฑํ•ด๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ */

#logo {
	animation : **lotate** 3s infinite linear;
}

๐Ÿ“ฃ  Canvas

๐Ÿญ. Canvas

โœ”๏ธ ๋‹จ์ˆœํ•œ ๋„ํ˜•๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”, ์• ๋‹ˆ๋ฉ”์ด์…˜, ์›น ๊ฒŒ์ž„ ๋“ฑ์˜ ์ปจํ…์ธ ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿฎ. Canvas ์‚ฌ์šฉ๋ฒ•

1๏ธโƒฃ ์บ”๋ฒ„์Šค ํƒœ๊ทธ ์ž‘์„ฑ

<canvas id="canvas">
	์บ”๋ฒ„์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์บ”๋ฒ„์Šค ๋Œ€์‹  ํƒœ๊ทธ ์‚ฌ์ด ๋‚ด์šฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
</canvas>

 

2๏ธโƒฃ canvas ์—˜๋ฆฌ๋จผํŠธ๋ฅผ DOM์œผ๋กœ ์กฐ์ž‘

const canvas = document.querySelector("#canvas");

 

3๏ธโƒฃ canvas ํฌ๊ธฐ ์„ค์ •

<canvas id="canvas" width="500" height="500"></canvas>

<canvas id="canvas" width="50vw" height="40vh"></canvas>
    		// vw, vh๋ฅผ ์ „๋‹ฌํ–ˆ์ง€๋งŒ 50ํ”ฝ์…€ * 40ํ”ฝ์…€๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

โžฐ ์บ”๋ฒ„์Šค ํƒœ๊ทธ์˜ width, height ์†์„ฑ์€ ํ”ฝ์…€ ๋‹จ์œ„๋กœ๋งŒ ๋ช…์‹œํ•ด์•ผ ์ธ์‹ํ•œ๋‹ค.

 

// ํ™”๋ฉด ํฌ๊ธฐ์— ๋งž์ถฐ์„œ ์„ค์ •ํ•ด์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;

    // ํ™”๋ฉด ํฌ๊ธฐ๋ฅผ ๊ฐ€์ ธ์™€ ๊ทธ์— ๋น„๋ก€ํ•˜์—ฌ ์„ค์ •ํ•ด์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    canvas.width = window.innerWidth * 0.5;
    canvas.height = window.innerHeight * 0.4;

    // DOM์œผ๋กœ ์„ค์ •ํ•  ์‹œ, ํ”ฝ์…€ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ vw, vh๋กœ ๋‹จ์œ„๊ฐ’์„ ์ง€์ •ํ•ด๋„ ์„ค์ •์ด ๋ฉ๋‹ˆ๋‹ค. 
    // ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ style ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ํฌ๊ธฐ์— ๋ณ€ํ™”๋ฅผ ์ฃผ๋Š” ๊ฒฝ์šฐ๋Š” ํ”ฝ์…€์˜ ํฌ๊ธฐ๊นŒ์ง€ ํ•ด๋‹น ๋‹จ์œ„์— ๋น„๋ก€ํ•ด ํ™•๋Œ€ํ•˜๋Š” ๊ฐœ๋…์ด๋ฏ€๋กœ, 
    // ํŠน์ •ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ์„ ์ž์ œํ•ฉ๋‹ˆ๋‹ค.
    canvas.style.width = "50vw";
    canvas.style.height = "40vh";

โžฐ DOM์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์›ํ•˜๋Š” ๋‹จ์œ„๋กœ ์œ ๋™์ ์ธ ๊ฐ’์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ฃ  Canvas๋กœ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ

๐Ÿญ. ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ

โœ”๏ธ ์ƒ‰์น ๋œ ์‚ฌ๊ฐํ˜•

ctx.fillStyle = 'blue';
// ์ƒ‰์น ํ•  ์ƒ‰์ƒ
ctx.fillRext = (10, 10, 100, 50);
//์ „๋‹ฌ ์ธ์ž๋Š” ์ˆœ์„œ๋Œ€๋กœ x์ขŒํ‘œ, y์ขŒํ‘œ, ๊ฐ€๋กœ๊ธธ์ด, ์„ธ๋กœ๊ธธ์ด ์ž…๋‹ˆ๋‹ค.

 

โœ”๏ธ ์„ ์œผ๋กœ๋งŒ ๋œ ์‚ฌ๊ฐํ˜•

ctx.lineWidth = 5;
// ์„ ์˜ ๊ตต๊ธฐ
ctx.strokeStyle = "black";
// ์„ ์˜ ์ƒ‰์ƒ

ctx.strokeRect(10, 10, 100, 50);
//์ „๋‹ฌ ์ธ์ž๋Š” ์ด๋ฒˆ์—๋„ ์ˆœ์„œ๋Œ€๋กœ x์ขŒํ‘œ, y์ขŒํ‘œ, ๊ฐ€๋กœ๊ธธ์ด, ์„ธ๋กœ๊ธธ์ด ์ž…๋‹ˆ๋‹ค.
//์œ„์—์„œ ๊ทธ๋ ค์ค€ ์ƒ‰์น ๋œ ์‚ฌ๊ฐํ˜• ๋ฐ”๋กœ ์œ„์— ๊ทธ๋ ค๋ณด์„ธ์š”.

 

โœ”๏ธ ์‚ฌ๊ฐํ˜•์œผ๋กœ ์ง€์šฐ๊ธฐ

ctx.clearRect( 20, 20, 80, 30);
// ์ง€์šธ ๋ฒ”์œ„ ์„ค์ •
// ์ „๋‹ฌ ์ธ์ž๋Š” ์—ญ์‹œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ค๋†“์€ ์‚ฌ๊ฐํ˜• ๊ฐ€์šด๋ฐ ๋ถ€๋ถ„์„ ์ง€์›Œ๋ณด์„ธ์š”.

 

๐Ÿฎ. ์บ”๋ฒ„์Šค๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ ๋งŒ๋“ค๊ธฐ

โœ”๏ธ ์บ”๋ฒ„์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ํด๋ฆญํ•˜๋Š” ์œ„์น˜์— ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๋Š” ์ด๋ฒคํŠธ

canvas.onclick = function (event) {
	const x = event.clientX - ctx.canvas.offsetLeft
    // ํ™”๋ฉด์ƒ ๋งˆ์šฐ์Šค ์œ„์น˜ - ํ™”๋ฉด์ƒ ์บ”๋ฒ„์Šค ์œ„์น˜
	const y = event.clientY - ctx.canvas.offsetTop
		// ๊ตฌํ•œ ์ขŒํ‘œ๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

	ctx.fillRect(x - 15, y - 15, 30, 30);
		// ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค 30ํ”ฝ์…€*30ํ”ฝ์…€ ํฌ๊ธฐ์˜ ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฌ๋„๋ก ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
		// ์ด ๋•Œ, x, y๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ์ขŒํ‘œ๋ถ€ํ„ฐ ์‚ฌ๊ฐํ˜•์ด ์‹œ์ž‘๋˜์–ด ์–ด์ƒ‰ํ•œ ๋Š๋‚Œ์„ ์ค๋‹ˆ๋‹ค.
		// ํด๋ฆญํ•œ ์œ„์น˜๋ฅผ ์‚ฌ๊ฐํ˜•์˜ ์ •์ค‘์•™์ด ๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ์‚ฌ๊ฐํ˜•ํฌ๊ธฐ/2 ํ•œ ๋งŒํผ ์ขŒํ‘œ์—์„œ ๋นผ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
		// ๋”ฐ๋ผ์„œ x - 15, y - 15 ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
}