๐Ÿ’ป Programming/JS, TS

[JavaScript] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํฌ๋ฆฌ์Šค๋งˆ์Šค๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„ ๊ณ„์‚ฐํ•˜๊ธฐ

Jiwon() 2023. 6. 21. 14:09

 

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ํฌ๋ฆฌ์Šค๋งˆ์Šค์˜ ๋ถ„์œ„๊ธฐ์™€ ๋ฌด๋“œ๋ฅผ ๋งค์šฐ ๋งค์šฐ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ์ด๋‹ค. ์•„์ง ํ•œ์—ฌ๋ฆ„๋„ ์ฑ„ ์˜ค์ง€ ์•Š์•˜์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ฌํ•ด ํฌ๋ฆฌ์Šค๋งˆ์Šค๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•ด ๋ณด์ž!


1. JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋ฆฌ์Šค๋งˆ์Šค๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„ ๊ณ„์‚ฐํ•˜๊ธฐ

๋จผ์ € HTML์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ดค์Œ! ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ธ”๋Ÿญ ๋‚ด์— ์ˆœ์„œ ๋‹จ๊ณ„๋ฅผ ์ฃผ์„์œผ๋กœ ์ ์–ด๋‘์—ˆ๊ณ , ์ž์„ธํ•œ ์„ค๋ช…์€ ์ฝ”๋“œ๋ธ”๋Ÿญ ํ•˜๋‹จ์—์„œ ํ’€์–ด์„œ ์ ์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


<!DOCTYPE html>
<html>
  <head>
    <title>Santa is coming!<</title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <h1>Santa is coming!</h1>
    <h2 class="countdown"></h2>
    <script src="src/index.js"></script>
  </body>
</html>
// 1) ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•  HTML ์š”์†Œ ์ง€์ •
const countdownClock = document.querySelector(".countdown");

// 2) ํ•จ์ˆ˜ ์ž‘์„ฑํ•˜๊ธฐ
const waitingXmas = () => {
  // (1) ์˜ค๋Š˜ ๋‚ ์งœ์™€ ์˜ฌํ•ด ํฌ๋ฆฌ์Šค๋งˆ์Šค ๋‚ ์งœ ๊ตฌํ•˜๊ธฐ
  const today = new Date();
  const currentYear = today.getFullYear();
  const xmas = new Date(currentYear, 11, 25);

  // (2) ํฌ๋ฆฌ์Šค๋งˆ์Šค์™€ ์˜ค๋Š˜ ๋‚ ์งœ ์ฐจ์ด ๊ตฌํ•˜๊ธฐ
  const diff = Math.abs(xmas - today);

  // (3) ์ผ, ์‹œ, ๋ถ„, ์ดˆ ๋‹จ์œ„์— ๋งž์ถ”์–ด ํ‘œํ˜„
  const days = Math.floor(diff / (1000 * 60 * 60 * 24));
  const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
  const seconds = Math.floor((diff % (1000 * 60)) / 1000);

  // (4) innerHTML๋กœ ํ™”๋ฉด์— ํ‘œํ˜„
  const countdown = `${days}d ${hours}h ${minutes}m ${seconds}s`;
  countdownClock.innerHTML = countdown;
};

// 3) ์ดˆ๊ธฐํ™” ํ›„ 1์ดˆ ๋‹จ์œ„๋กœ ๋‹ค์‹œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฆฌ์…‹
waitingXmas();
setInterval(waitingXmas, 1000);

1) ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•  HTML ์š”์†Œ ์ง€์ •

  • Document.querySelector()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTML์˜ h2 ์š”์†Œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • Document.querySelector()๋Š” ์ œ๊ณตํ•œ ์„ ํƒ์ž ๋˜๋Š” ์„ ํƒ์ž ๋ญ‰์น˜์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ ๋‚ด ์ฒซ ๋ฒˆ์งธ Element๋ฅผ ๋ฐ˜ํ™˜ (๋‹จ, ์ผ์น˜ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด `null` ๋ฐ˜ํ™˜)

 

2) ํ•จ์ˆ˜ ์ž‘์„ฑ

(1) ์˜ค๋Š˜ ํ˜„์žฌ ๋‚ ์งœ์™€ ์˜ฌํ•ด ํฌ๋ฆฌ์Šค๋งˆ์Šค ๋‚ ์งœ ๊ตฌํ•˜๊ธฐ

  • ๊ทธ๋ƒฅ Date()๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ๋˜๋‚˜? ์•ž์— new ์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์—ฌ์„œ new Date()๋กœ ์ž‘์„ฑํ•˜๋Š” ์ด์œ 
์ƒˆ๋กœ์šด Date ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•ฉ๋‹ˆ๋‹ค. now = Date();์ฒ˜๋Ÿผ Date๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์ƒˆ๋กœ์šด Date ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

new Date()๋Š” Date ๊ฐ์ฒด, Date()๋Š” ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Date.prototype.getMonth() : ํ˜„์ง€ ์‹œ๊ฐ„ ๊ธฐ์ค€ ์›”์„ ๋‚˜ํƒ€๋‚ด๋Š” 0์—์„œ 11 ์‚ฌ์ด์˜ ์ •์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, 0์€ 1์›”, 1์€ 2์›”... 11์€ 12์›”์„ ์˜๋ฏธํ•จ์— ์œ ์˜ํ•  ๊ฒƒ! 

 

(2) ํฌ๋ฆฌ์Šค๋งˆ์Šค์™€ ์˜ค๋Š˜ ๋‚ ์งœ ์ฐจ์ด ๊ตฌํ•˜๊ธฐ

  • const diff = Math.abs(xmas - today)
    • (xmas - today)๋ฅผ ํ†ตํ•ด ๊ตฌํ•œ diff ๊ฐ’์€ ํฌ๋ฆฌ์Šค๋งˆ์Šค ๋‚ ์งœ์—์„œ ์˜ค๋Š˜ ๋‚ ์งœ๋ฅผ ๋บ€ ๊ฐ’์„ ์–ป๊ฒŒ ๋˜๊ณ , ์ด ๊ฐ’์€ ๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. (์ด ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์€ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐ๋จ)
    • Math.abs() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์˜ ์ ˆ๋Œ“๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค. ์ ˆ๋Œ“๊ฐ’์„ ์ทจํ•˜๋ฉด ํ•ญ์ƒ ์–‘์ˆ˜๊ฐ€ ๋˜๊ณ , diff ๋ณ€์ˆ˜์—๋Š” ํฌ๋ฆฌ์Šค๋งˆ์Šค์™€ ์˜ค๋Š˜ ๋‚ ์งœ ์‚ฌ์ด์˜ ์ ˆ๋Œ€์ ์ธ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ด ์ €์žฅ๋œ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ๊ตฌํ•œ diff ๊ฐ’์€ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์ด๋ฏ€๋กœ, ์ด ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ผ, ์‹œ, ๋ถ„, ์ดˆ ๋‹จ์œ„๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์นด์šดํŠธ๋‹ค์šด์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Œ

 

(3) ์ผ, ์‹œ, ๋ถ„, ์ดˆ ๋‹จ์œ„์— ๋งž์ถ”์–ด ํ‘œํ˜„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์‹œ๊ฐ„์„ ๋ณดํ†ต ๋ฐ€๋ฆฌ์ดˆ(ms) ๋‹จ์œ„๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. 1s = 1,000ms

diff ๋ณ€์ˆ˜์—๋Š” ํฌ๋ฆฌ์Šค๋งˆ์Šค์™€ ์˜ค๋Š˜๊ณผ์˜ ์‹œ๊ฐ„ ์ฐจ์ด๊ฐ€ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ด ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๊ฐ๊ฐ ์ดˆ, ๋ถ„, ์‹œ, ์ผ ๋‹จ์œ„์— ๋งž์ถฐ์„œ ๋ณ€ํ™˜ํ•ด์ฃผ์–ด์•ผ ํ•จ

  • const seconds = Math.floor((diff % (1000 * 60)) / 1000)
    • diff % (1000 * 60) : ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์—์„œ ๋ถ„ ๋‹จ์œ„๋ฅผ ์ดˆ๊ณผํ•œ ๋‚˜๋จธ์ง€ ์‹œ๊ฐ„์„ ๊ตฌํ•จ
    • diff % (1000 * 60) / 1000 : ๋‚˜๋จธ์ง€ ์‹œ๊ฐ„์„ 1000์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์—์„œ ์ดˆ ๋‹จ์œ„๋กœ ๋ณ€ํ™˜
  • const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))
    • diff % (1000 * 60 * 60) : ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์—์„œ ์‹œ๊ฐ„ ๋‹จ์œ„๋ฅผ ์ดˆ๊ณผํ•œ ๋‚˜๋จธ์ง€ ์‹œ๊ฐ„์„ ๊ตฌํ•จ
    • diff % (1000 * 60) / (1000 * 60) : ์‹œ๊ฐ„ ๋‹จ์œ„๋ฅผ ๋ถ„ ๋‹จ์œ„๋กœ ๋ณ€ํ™˜

 

(4) innerHTML๋กœ ํ™”๋ฉด์— ํ‘œํ˜„

  • innerHTML์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜์Œ์— Document.querySelector๋กœ ์ง€์ •ํ•ด๋’€๋˜ HTML <h2> ์š”์†Œ์— ์‹œ๊ฐ„์„ ์ผ, ์‹œ, ๋ถ„, ์ดˆ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํ‘œ์‹œํ•œ๋‹ค.

 

3) ์ดˆ๊ธฐํ™”? ๊ทธ๋ฆฌ๊ณ  setInverval()

waitingXmas(); // ์ดˆ๊ธฐํ™”
setInterval(waitingXmas, 1000);
  • ์ฒ˜์Œ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ `waitingXmas()` ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ ํฌ๋ฆฌ์Šค๋งˆ์Šค๊นŒ์ง€์˜ ๋‚จ์€ ์‹œ๊ฐ„์ด ๊ณ„์‚ฐ๋˜์–ด `countdownClock` ์š”์†Œ์— ํ‘œ์‹œ๋œ๋‹ค. ์ด๊ฒƒ์€ ํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆด ๋•Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ดˆ๊ธฐ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•จ.
  • ๊ทธ ํ›„์—๋Š” `setInterval(waitingXmas, 1000);`์„ ์‚ฌ์šฉํ•˜์—ฌ `waitingXmas()` ํ•จ์ˆ˜๊ฐ€ 1์ดˆ๋งˆ๋‹ค ์ฃผ๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋„๋ก ํ•ด์„œ ๋‚จ์€ ์‹œ๊ฐ„์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  • ์ •๋ฆฌํ•˜๋ฉด, `waitingXmas()`๋ฅผ ์‹คํ–‰ํ•ด์„œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์€ ํŽ˜์ด์ง€๊ฐ€ ์ตœ์ดˆ ๋กœ๋”ฉ๋  ๋•Œ ์ตœ์ดˆ๋กœ ๋‚จ์€ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๊ณ  ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ ์ดํ›„๋กœ๋Š” `setInterval()`์„ ํ†ตํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง.
  • setInterval(waitingXmas, 1000) :์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ 1,000ms, ์ฆ‰ 1s ๊ฐ„๊ฒฉ์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋„ํ•˜๋„๋ก ์ž…๋ ฅํ•ด์ค€๋‹ค.

 


2. ์‹œ, ๋ถ„, ์ดˆ๋ฅผ 2์ž๋ฆฌ ์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๊ธฐ

์˜ˆ๋ฅผ ๋“ค๋ฉด, 1h 5m 8s โžก๏ธ 01h 05m 08s ํ˜•์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ ค๊ณ  ํ•จ!

1) String.prototype.padStart()

//String().padStart(2, '0')
const days = String(Math.floor(diff / (1000 * 60 * 60 * 24))).padStart(2, '0');
const hours = String(Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))).padStart(2, '0');
const minutes = String(Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))).padStart(2, '0');
const seconds = String(Math.floor((diff % (1000 * 60)) / 1000)).padStart(2, '0');
padStart() ๋ฉ”์„œ๋“œ๋ž€?
ํ˜„์žฌ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘์„ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ์ฑ„์›Œ, ์ฃผ์–ด์ง„ ๊ธธ์ด๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฑ„์›Œ๋„ฃ๊ธฐ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘(์ขŒ์ธก)๋ถ€ํ„ฐ ์ ์šฉ๋œ๋‹ค.

str.padStart(targetLength [, padString])
  • targetLength : ๋ชฉํ‘œ ๋ฌธ์ž์—ด ๊ธธ์ด. ํ˜„์žฌ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์ฑ„์›Œ๋„ฃ์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
  • padString : ํ˜„์žฌ ๋ฌธ์ž์—ด์— ์ฑ„์›Œ๋„ฃ์„ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด. ๋ฌธ์ž์—ด์ด ๋„ˆ๋ฌด ๊ธธ์–ด ๋ชฉํ‘œ ๋ฌธ์ž์—ด ๊ธธ์ด๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค๋ฉด ์ขŒ์ธก ์ผ๋ถ€๋ฅผ ์ž˜๋ผ์„œ ๋„ฃ์Œ. ๊ธฐ๋ณธ๊ฐ’์€ " "์ด๋‹ค.

 


3. ์˜ฌํ•ด ํฌ๋ฆฌ์Šค๋งˆ์Šค๊ฐ€ ์ง€๋‚˜๋ฉด ๋‚ด๋…„ ํฌ๋ฆฌ์Šค๋งˆ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์นด์šดํŠธ๋‹ค์šด

  let xmas
  if (today.getMonth() === 11 && today.getDate() > 25) {
    xmas = new Date(currentYear + 1, 11, 25);
  } else {
    xmas = new Date(currentYear, 11, 25);
  }

  const diff = xmas - today;
  • xmas๋Š” ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋„๋ก const๊ฐ€ ์•„๋‹Œ let์œผ๋กœ ์„ ์–ธ
  • if๋ฌธ ์‚ฌ์šฉ
    • ์กฐ๊ฑด : ์˜ค๋Š˜ ๋‚ ์งœ๊ฐ€ 12์›”(today.getMonth() === 11), ๊ทธ๋ฆฌ๊ณ (&&) 25์ผ์ด ์ง€๋‚˜๋ฉด
    • ๋ฐ˜ํ™˜ : ์นด์šดํŠธ ํ•˜๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” xmas์˜ ์—ฐ๋„๋ฅผ ๋‚ด๋…„(currentYear + 1)์œผ๋กœ ๋ณ€๊ฒฝ
    • else ๋ฐ˜ํ™˜ : ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋ƒฅ currentYear, 12์›” 25์ผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
  • ์ด ๊ฒฝ์šฐ์—๋Š” xmas - today ์‚ฌ์ด์— ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์œผ๋‹ˆ Math.abs ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋จ!

 

 


4. ์ตœ์ข… ์™„์„ฑ ์ฝ”๋“œ


const countdownClock = document.querySelector(".countdown");

const waitingXmas = () => {
  const today = new Date();
  const currentYear = today.getFullYear();
  
  let xmas;
  if (today.getMonth() === 11 && today.getDate() > 25) {
    xmas = new Date(currentYear + 1, 11, 25);
  } else {
    xmas = new Date(currentYear, 11, 25);
  };

  const diff = xmas - today;

  const days = Math.floor(diff / (1000 * 60 * 60 * 24));
  const hours = String(
    Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
  ).padStart(2, "0");
  const minutes = String(
    Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))
  ).padStart(2, "0");
  const seconds = String(Math.floor((diff % (1000 * 60)) / 1000)
  ).padStart(2, "0");

  const countdown = `${days}d ${hours}h ${minutes}m ${seconds}s`;
  countdownClock.innerHTML = countdown;
};

waitingXmas();
setInterval(waitingXmas, 1000);

 

๊ฐ„๋‹จํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ๊ณต๋ถ€ํ•ด ๋ณผ ์š”์†Œ๋“ค์ด ๋งŽ์•„์„œ ๋”ฐ๋กœ ์ •๋ฆฌํ•ด๋ดค๋‹ค.

ํ‹€๋ฆฐ ๋‚ด์šฉ, ์ฐธ๊ณ ํ•  ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!

 


์ฐธ๊ณ  ์‚ฌ์ดํŠธ

MDN Web Docs

 

MDN Web Docs

The MDN Web Docs site provides information about Open Web technologies including HTML, CSS, and APIs for both Web sites and progressive web apps.

developer.mozilla.org