[ํฌ์Šค์ฝ” x ์ฝ”๋”ฉ์˜จ] ์›น ๊ฐœ๋ฐœ์ž ๋ถ€ํŠธ์บ ํ”„ 6์ฃผ์ฐจ ์ˆ˜์—… ํšŒ๊ณ 

2023. 3. 7. 00:18ใ†Coding On X Posco

๐Ÿฏ  TEST-WORLD ํŒ€ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  

 

Test-World ํŒ€ ํ”„๋กœ์ ํŠธ

์ด๋ฒˆ์ฃผ๋Š” 4๋ช…์ด์„œ ํŒ€์„ ์ด๋ค„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ฃผ์ œ๋Š” ๊ฒฝ๋ ฅ ์œ ํ˜• ๊ฒ€์‚ฌ, ์„ฑ๊ฒฉ ์œ ํ˜• ๊ฒ€์‚ฌ, ๋ฐ˜์‘์†๋„ ํ…Œ์ŠคํŠธ, ์ƒ‰๊น” ์ฐพ๊ธฐ ํ…Œ์ŠคํŠธ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ชจ๋ฐ”์ผ ๊ธฐ์ค€์˜ ์›น์•ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

์‚ฌ์ „ ํšŒ์˜๋ฅผ ํ†ตํ•ด ๋””์ž์ธ ์ปจ์…‰์€ ํ”ฝ์…€๊ฒŒ์ž„ ์ปจ์…‰์œผ๋กœ ๊ฒฐ์ •ํ•˜์˜€๊ณ  ์ด๋ฆ„๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ์—ฌ์žˆ์œผ๋‹ˆ test-world๋กœ ์ •ํ•˜์˜€๋‹ค.

๋‚˜๋Š” ๋ฐ˜์‘์†๋„ ํ…Œ์ŠคํŠธ ๋ถ€๋ถ„์„ ๋งก์•˜๊ณ  ์ผ์ฃผ์ผ๋™์•ˆ ํŒ€์›๋“ค๊ณผ ๋งž์ถฐ๊ฐ€๋ฉฐ ๋ ˆ์ด์•„์›ƒ๊ณผ ๋””์ž์ธ์„ ์ž…ํžˆ๊ณ  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

์ฃผ์š” ๋ฒ„ํŠผ๋“ค์€ ํ”ฝ์…€ ์ปจ์…‰์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ  ํ•„์š”์‹œ aํƒœ๊ทธ๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค.

 

ํ”„๋กœ์ ํŠธ ํŽ˜์ด์ง€:  https://posco-test-world.netlify.app/index.html

 

Test-World

4๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณด์„ธ์š”!

posco-test-world.netlify.app

 

- ๋ฉ”์ธ ํŽ˜์ด์ง€

 

๋ฉ”์ธ ํŽ˜์ด์ง€๋Š” ๊ฐ ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๊ฒ€์‚ฌ ํŽ˜์ด์ง€๋กœ ์ด๋™ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

๋ชจ๋“  ํŽ˜์ด์ง€๋Š” ๋ชจ๋ฐ”์ผ ๊ธฐ์ค€์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด Bootstrap์˜ container-sm์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…์ธ ๋“ค์„ ๋„ฃ์—ˆ๋‹ค.

header์™€ content, footer๋กœ ์ด๋ฃจ์–ด์ง„ html์„ ์ž‘์„ฑํ–ˆ๊ณ  css๋Š” scss๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

๊ฐ€์žฅ ๊ธฐ์–ต์— ๋‚จ๋Š”๊ฑด ์ œ๋ชฉ ๋ถ€๋ถ„์— ํƒ€์ดํ•‘ ํšจ๊ณผ๋ฅผ ์ฃผ๋Š” ๋ถ€๋ถ„์„ ๋‚ด๊ฐ€ ๋งก์•„ ๊ตฌํ˜„ํ–ˆ์—ˆ๋Š”๋ฐ ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰์‹œํ‚ค๋Š” setInterval์„ ์ด์šฉํ•˜์˜€๋‹ค.

์ œ๋ชฉ์˜ ์ปจํ…์ธ ๋ฅผ ์ธ๋ฑ์Šค 1๊ฐœ์”ฉ ์ž˜๋ผ์„œ ์ธ๋ฑ์Šค ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ํ…์ŠคํŠธ์— ํ•˜๋‚˜์”ฉ ๋”ํ•œ ํ•จ์ˆ˜๋ฅผ setInterval๋กœ ์‹คํ–‰์‹œ์ผฐ๊ณ  

์ธ๋ฑ์Šค๊ฐ’์ด ์ปจํ…์ธ ์™€ ๊ฐ™์•„์ง€๋ฉด clearInterval์„ ํ†ตํ•ด ์ข…๋ฃŒํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค.

์ปค์„œ๊ฐ€ ๊นœ๋นก๊ฑฐ๋ ธ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ํšจ๊ณผ๋Š” css keyframe์„ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

const headerTxt = document.querySelector(".header__text");
let content = "Test-World";
let i = 0;

function typingHeader() {
  if (i < content.length) {
    let text = content.charAt(i);
    headerTxt.innerHTML += text;
    i++;
  } // content์˜ i๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ text์— ๋„ฃ์–ด headerTxt์— ๋ฐ€์–ด๋„ฃ๊ธฐ
  if (content.length - 1 === i) {
    clearInterval(typingHeader);
  } // ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ i๊ฐ€ content์˜ ๊ธธ์ด -1 ์ด๋˜๋ฉด clearInterval๋กœ ๋ฐ˜๋ณต ์ค‘์ง€ 
}

window.onload = () => {
  setInterval(typingHeader, 150);
};

 

 // HEADER
    header {
      display: flex;
      border: 3px solid black;
      justify-content: center;
      align-items: center;
      height: 130px;
      width: 100%;
      padding: 20px;
      font-size: 50px;
      background-color: rgba(255, 255, 255, 0.5);
      p {
        margin: 0;

        &::after {
          content: "";
          margin-left: 0.4rem;

          animation: cursor 0.9s 5 steps(2);
        }
        @keyframes cursor {
          0% {
            border-right: none;
          }
          99% {
            border-right: 2px solid #181818;
          }
          100% {
            border-right: none;
          }
        }
      }
    }

 

 

- ๋ฐ˜์‘์†๋„ ํ…Œ์ŠคํŠธ?

 

๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ๋ฐ˜์‘์†๋„ ํ…Œ์ŠคํŠธ๋Š” ์ƒ‰๊น”์ด ๋ฐ”๋€Œ๋Š” ์ˆœ๊ฐ„ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜์—ฌ ๋ฐ˜์‘์†๋„๋ฅผ ์ฒดํฌํ•˜๋Š” ํ…Œ์ŠคํŠธ์˜€๋‹ค. 

 

 

- ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€: ๋ฉ”์ธํŽ˜์ด์ง€

 

PLAY ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ…Œ์ŠคํŠธ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•˜์˜€๊ณ  testํŽ˜์ด์ง€์˜ html์„ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ ๋งํฌ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€ ์ „ํ™˜์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธํŽ˜์ด์ง€ : ํŒจ๋„

 

ํ…Œ์ŠคํŠธํŽ˜์ด์ง€์˜ ํŒจ๋„์€ ์ƒ‰์ด ๋ฐ”๋€Œ์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ ํ˜ธ๋ฅผ ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๊ทธ๋งŒํผ ๋Œ€๊ธฐ์ƒ‰๊ณผ ์‹ ํ˜ธ์ƒ‰์˜ ์ฐจ์ด๊ฐ€ ๋ˆˆ์— ํ™• ๋„์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋Œ€๊ธฐ ํŒจ๋„์€ ๋…ธ๋ž€์ƒ‰ ์‹ ํ˜ธํŒจ๋„์€ ์ดˆ๋ก์ƒ‰์œผ๋กœ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

๋Œ€๊ธฐํ™”๋ฉด์—์„œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ๊ฒƒ์€ ๋ฐ˜์น™์ด๋ฏ€๋กœ(๊ด‘ํด(?)์„ ํ†ตํ•ด ๋น ๋ฅธ ๊ธฐ๋ก์ด ๊ฐ€๋Šฅํ•ด์„œ) ๋นจ๊ฐ„์ƒ‰ ํŒจ๋„์„ ๋„์šธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.

๊ฐ๊ฐ ํŒจ๋„์˜ ์ƒ‰์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ํŒจ๋„์˜ ์ƒ‰์ด ๋ฐ”๋€Œ์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.

๋Œ€๊ธฐ์ƒ‰์—์„œ ์‹ ํ˜ธ์ƒ‰์œผ๋กœ ํŒจ๋„์˜ ์ƒ‰์„ ๋ฐ”๊ฟ€ ๋•Œ์—๋Š” ์ผ์ • ์‹œ๊ฐ„์— ํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ ์‹คํ–‰์‹œํ‚ค๋Š” setTimeout๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒจ๋„์„ ๊ต์ฒดํ•˜์˜€๋‹ค.

์‹คํ–‰ ์‹œ๊ฐ„์€ Math.random์„ ์ด์šฉํ•˜์—ฌ 3~7์ดˆ ์‚ฌ์ด์˜ ๋žœ๋ค ์‹œ๊ฐ„์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

 

 

//ํŒจ๋„,๋ฒ„ํŠผ ์ƒ‰๊น” ๋ฐ”๊พธ๊ธฐ
function setYellowPanel() {
  testScreen.style.backgroundColor = YELLOW;
  testScreenText.textContent = "Wait for Green";
  recordBtn.setAttribute("src", "./img/btn/btn_yellow.png");
}

function setGreenPanel() {
  testScreen.style.backgroundColor = GREEN;
  testScreenText.textContent = "Push!";
  recordBtn.setAttribute("src", "./img/btn/btn_green.png");
}

function setRedPanel() {
  testScreen.style.backgroundColor = RED;
  testScreenText.innerHTML = `์ดˆ๋ก์ƒ‰์— ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š” <br> ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์„ธ์š”!`;
  recordBtn.setAttribute("src", "./img/btn/btn_red.png");
}

 

// ์ •๋‹ต ๋…ธ์ถœ ํ•จ์ˆ˜
function timer() {
  const randomTime = Math.floor(Math.random() * 5 + 3) * 1000;
  timeOut = setTimeout(() => {
    recordBtn.classList.add("animate__animated", "animate__bounceIn");
    setGreenPanel();
    START_TIME = new Date();
  }, randomTime);
}

 

ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ - ๋ฒ„ํŠผ

 

๊ฐ€์žฅ ์‚ฝ์งˆ์„ ๋งŽ์ดํ–ˆ๋˜ ๋ฒ„ํŠผ ๋ถ€๋ถ„์ด๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์–ด๋– ํ•œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ ์šฉ์‹œ์ผœ์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์„ ๋งŽ์ดํ–ˆ๊ณ 

์—ฌ๋Ÿฌ๋ฒˆ ์ˆ˜์ •ํ•œ ๋์— ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ์กฐ๊ฑด์„ ๊ฑธ์–ด ๋‹ค์–‘ํ•œ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.

๋˜ navigator๊ฐ์ฒด์˜ userAgent์— ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค๋ฅผ ํ™•์ธํ•ด ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋Š” touchdown์ด๋ฒคํŠธ๋ฅผ ์ ์šฉํ•˜๊ณ  pcํ™˜๊ฒฝ์—์„œ๋Š” mousedown์ด๋ฒคํŠธ๋ฅผ ์ ์šฉํ•˜์˜€๋‹ค. ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ๋Š” ์‹œ๊ฐ„์ธก์ •์˜ ๋ฐ˜์‘์ด ๋นจ๋ผ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ click์ด๋ฒคํŠธ๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  mousedown ์ด๋ฒคํŠธ๋ฅผ ์จ๋ณด์•˜๋‹ค.

๋˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๋€Œ๋Š” ์ˆœ๊ฐ„์„ ์กฐ๊ธˆ ๋” ์ž˜ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๋ฒ„ํŠผ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋„ฃ์—ˆ๋Š”๋ฐ animate.css ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ตํ†ตํŠ€๋Š” ๊ท€์—ฌ์šด ๋ฒ„ํŠผ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.(https://animate.style/)

 

//์‚ฌ์šฉ์ž ๋””๋ฐ”์ด์Šค ํ™•์ธ
function isMobile() {
  const user = navigator.userAgent;
  let CHECK = false;

  if (
    user.indexOf("iPhone") > -1 ||
    user.indexOf("Android") > -1 ||
    user.indexOf("iPad") > -1
  ) {
    CHECK = true;
  }

  return CHECK;
}

//๊ฒŒ์ž„์‹œ์ž‘
function setGame() {
  setYellowPanel();
  timer();
  if (isMobile()) recordBtn.addEventListener("touchstart", touchEvent);
  if (!isMobile()) recordBtn.addEventListener("mousedown", touchEvent);
}

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜๋Š”

ํŒจ๋„์ด ๋…ธ๋ž€์ƒ‰์ผ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ˜์น™์ด๋ฏ€๋กœ ๋นจ๊ฐ„์ƒ‰ ํŒจ๋„๋กœ ๊ต์ฒดํ•œ ํ›„ clearTimeout์„ ์‹œ์ผœ timeout์„ ์ข…๋ฃŒ์‹œ์ผฐ๋‹ค.

ํŒจ๋„์ด ์ดˆ๋ก์ƒ‰์ผ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚ฌ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋…ธ๋ž€์ƒ‰ํŒจ๋„๋กœ ๋‹ค์‹œ ๊ต์ฒดํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  setTimeout์„ ๋‹ค์‹œ ํ™œ์„ฑํ™” ์‹œ์ผœ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค.

ํŒจ๋„์ด ๋นจ๊ฐ„์ƒ‰์ผ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ˜์น™์„ ํ•œ ์ƒํƒœ์—์„œ ํ•œ๋ฒˆ ๋” ํด๋ฆญ์„ ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๊ธฐ๋ก์„ ๋ชจ๋‘ ์ง€์šฐ๊ณ  ๋…ธ๋ž€์ƒ‰ ํŒจ๋„๋กœ ๋ฐ”๋€ ๋’ค setTimeout์„ ์‹คํ–‰์‹œ์ผœ ๊ฒŒ์ž„์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜์˜€๋‹ค.

// ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜
function touchEvent() {
  recordBtn.classList.remove("animate__animated", "animate__bounceIn");
  if (testScreen.style.backgroundColor === YELLOW) {
    setRedPanel();
    clearTimeout(timeOut);
    return;
  }
  if (testScreen.style.backgroundColor === GREEN) {
    setYellowPanel();
    timer();
    getRecord();
    isEnd();
    return;
  }
  if (testScreen.style.backgroundColor === RED) {
    clearResult();
    setYellowPanel();
    timer();
    return;
  }
}

 

ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ - ์‹œ๊ฐ„ ๊ธฐ๋ก

 

์‹œ๊ฐ„ ๊ธฐ๋ก์€ Date์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด ํŒจ๋„์ด ์ดˆ๋ก์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ๋Š” ์ˆœ๊ฐ„์„ START_TIME, ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜๋Š” ์ˆœ๊ฐ„์„ END_TIME์œผ๋กœ ์„ค์ •ํ•ด

๋‘ ์‹œ๊ฐ„์˜ ์ฐจ๋ฅผ ulํƒœ๊ทธ์˜ listํƒœ๊ทธ๋กœ ์ง‘์–ด๋„ฃ์—ˆ๋‹ค.

๋˜, ์ถ”ํ›„์˜ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€์— ํ•ด๋‹น ๊ธฐ๋ก๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— recordArr ์ „์—ญ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ๊ธฐ๋ก์„ ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค.

list๊ฐ€ 5๊ฐœ๊ฐ€ ๋˜๋ฉด(์ธก์ •์„ 5๋ฒˆ ํ•˜๋ฉด) ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€์˜ ๋ฒ„ํŠผ๊ณผ ํŒจ๋„์„ display-none ์ฒ˜๋ฆฌ ํ•˜์—ฌ ์—†์• ๊ณ  ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์š”์†Œ์— hide(display-none) class๋ฅผ ์ œ๊ฑฐํ•ด ๊ฒฐ๊ณผ ํ™”๋ฉด์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค.

// ์‹œ๊ฐ„ ๊ธฐ๋ก ํ•จ์ˆ˜
function getRecord() {
  END_TIME = new Date();
  const recordedTime = END_TIME - START_TIME;
  resultArr.push(recordedTime);
  const recordTimeList = document.createElement("li");
  recordTimeList.classList.add("content__record__list");
  recordTimeList.textContent = `Trial ${
    recordUl.childElementCount + 1
  }: ${recordedTime} ms`;
  recordTimeList.classList.add("animate__animated", "animate__bounceInLeft");
  recordUl.append(recordTimeList);
}
//๊ฒฐ๊ณผ ํ˜ธ์ถœ ํ•จ์ˆ˜
function isEnd() {
  if (recordUl.childElementCount === 5) {
    resultDiv.classList.remove("hide");
    const avgResult =
      resultArr.reduce((acc, cur) => {
        return acc + cur;
      }) / resultArr.length;
    const maxResult = Math.min(...resultArr);
    testScreen.style.display = "none";
    recordBtn.style.display = "none";
    printAnalyzeResult(avgResult);
    printMaxResult(maxResult);
    printAvgSpeed(avgResult);
    share.classList.remove("hide");
  }
}

 

๊ฒฐ๊ณผ ํŽ˜์ด์ง€

 

๊ฒฐ๊ณผ ํŽ˜์ด์ง€์—์„œ๋Š” ์ €์žฅํ•ด๋‘” resultArr๋ฅผ ํ†ตํ•ด ํ‰๊ท  ๋ฐ˜์‘์†๋„์™€ ์ตœ๊ณ ๋ฐ˜์‘์†๋„๋ฅผ ์ถœ๋ ฅํ–ˆ๊ณ  ํƒ€ ์‚ฌ์ดํŠธ์˜ ๊ธฐ์ค€๋“ค์„ ์ฐธ๊ณ ํ•ด ๊ฒฐ๊ณผ๋ถ„์„ ๋ฌธ๊ตฌ๋„ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜์˜€๋‹ค.

๋˜ ๊ฐ ์‹œ๋„์˜ ๊ธฐ๋ก๋“ค์„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ฉด์„œ ํ™•์ธํ•˜๊ธฐ ํž˜๋“ค๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ก์€ display-none์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ๋‚จ๊ฒจ๋‘์—ˆ๋‹ค.

์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰์‹œํ‚ค๋Š” setInterval์„ ํ†ตํ•ด ํ‰๊ท ๋ฐ˜์‘์†๋„์˜ count-up ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฒฐ๊ณผ๋ถ„์„์˜ ํƒ€์ดํ•‘ ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

๊ฒฐ๊ณผ ๊ณต์œ ๋Š” html2canvas์™€ ์นด์นด์˜คํ†กapi๋ฅผ ์ด์šฉํ•ด ์นดํ†ก ๊ฒฐ๊ณผ๊ณต์œ ์™€ ์ด๋ฏธ์ง€ ๊ฒฐ๊ณผ์ €์žฅ ๋ฒ„ํŠผ์„ ๋„ฃ์—ˆ๋‹ค.

//ํ‰๊ท  ๋ฐ˜์‘์†๋„ ์ถœ๋ ฅ ํ•จ์ˆ˜ (count up ์• ๋‹ˆ๋ฉ”์ด์…˜)
function printAvgSpeed(avgResult) {
  const result = document.createElement("p");
  result.classList.add("result--avg");

  let now = avgResult;
  const handle = setInterval(() => {
    if (avgResult - now < 150) {
      result.style.color = "red";
    }
    if (avgResult - now >= 150 && avgResult - now < 200) {
      result.style.color = "gold";
    }
    if (avgResult - now >= 200 && avgResult - now < 273) {
      result.style.color = "purple";
    }
    if (avgResult - now >= 273 && avgResult - now < 300) {
      result.style.color = "green";
    }
    if (avgResult - now >= 300 && avgResult - now < 370) {
      result.style.color = "white";
    }
    if (avgResult - now >= 370 && avgResult - now < 400) {
      result.style.color = "pink";
    }
    if (avgResult - now >= 400) {
      result.style.color = "blue";
    }

    result.innerHTML = `๋‹น์‹ ์˜ ํ‰๊ท  ๋ฐ˜์‘์†๋„<br>
    ${Math.round(avgResult - now)} ms`;

    if (now < 1) {
      clearInterval(handle);
    }
    const step = now / 10;
    now -= step;
  }, 50);
  resultDiv.prepend(result);
}

//์ตœ๊ณ  ์†๋„ ์ถœ๋ ฅ ํ•จ์ˆ˜
function printMaxResult(maxResult) {
  const maxResultText = document.createElement("p");
  maxResultText.classList.add("result--max");
  maxResultText.textContent = `์ตœ๊ณ  ์†๋„: ${maxResult} ms`;
  resultDiv.prepend(maxResultText);
}

 

//๊ฒฐ๊ณผ ๋ถ„์„ ํ•จ์ˆ˜
function printAnalyzeResult(avgResult) {
  let content = " ";
  const resultAnalyze = document.createElement("p");
  resultAnalyze.classList.add("result--analyze");
  resultDiv.prepend(resultAnalyze);

  if (avgResult < 150) {
    content = "์†์— ๊ผฝํžˆ๋Š” ๋ฐ˜์‘์†๋„๋„ค์š”! ๋‹น์‹ ์€ ๋ฐ˜์‘์†๋„ ๋žญ์ปค!";
  }

  if (avgResult >= 150 && avgResult < 200) {
    content = "์ˆ˜์ค€๊ธ‰์˜ ๋ฐ˜์‘์†๋„์ž…๋‹ˆ๋‹ค! ํ˜น์‹œ ํ”„๋กœ๊ฒŒ์ด๋จธ?";
  }

  if (avgResult >= 200 && avgResult < 273) {
    content = "ํ‰๊ท ๋ณด๋‹ค ์ข‹์€ ๋ฐ˜์‘์†๋„๋ฅผ ๊ฐ€์ง€์…จ๊ตฐ์š”!";
  }

  if (avgResult >= 273 && avgResult < 300) {
    content = "ํ‰๊ท ์ •๋„์˜ ๋ฐ˜์‘์†๋„ ์ž…๋‹ˆ๋‹ค!";
  }

  if (avgResult >= 300 && avgResult < 370) {
    content = "ํ‰๊ท ๋ณด๋‹ค ์กฐ๊ธˆ ๋А๋ฆฌ์‹œ๋„ค์š”! ์กฐ๊ธˆ๋” ํž˜๋‚ด๋ด…์‹œ๋‹ค!";
  }

  if (avgResult >= 370 && avgResult < 400) {
    content = "์•„์‰ฌ์šด ์†๋„์—์š” ใ… ใ…  ํ•œ๋ฒˆ ๋” ์‹œ๋„ํ•ด๋ณด์„ธ์š”!";
  }

  if (avgResult >= 400) {
    content = "์„ธ์›”์ด ์•ผ์†ํ•˜๋„ค์š” ใ… ใ…  ๋” ์—ฐ์Šตํ•ด๋ณผ๊นŒ์š”?";
  }

  //typing ํšจ๊ณผ
  let i = 0;
  function typingAnalyze() {
    if (i < content.length) {
      let text = content.charAt(i);
      resultAnalyze.innerHTML += text;
      i++;
    }
    if (content.length - 1 === i) {
      clearInterval(typingAnalyze);
    }
  }

  setInterval(typingAnalyze, 100);
}

 

ํ˜‘์—…

 

ํ˜‘์—…์€ github๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ํ•˜์˜€๊ณ  ํŒ€์› ๊ฐ๊ฐ branch์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  pushํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ž์˜ local main branch์— pull์„ ๋ฐ›๊ณ  ๋‹ค์‹œ ๊ฐ๊ฐ branch์— rebaseํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

pull request๋ฅผ comment๋ฅผ 1๊ฐœ์ด์ƒ ๋‹ฌ์•„์•ผ mergeํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜์˜€๋‹ค.

๊นƒ์„ ํ†ตํ•ด ํ˜‘์—…์„ ํ•ด๋ณธ ๊ฒƒ์€ ์ฒ˜์Œ์ด๊ณ  ๋‚ด ์ฝ”๋“œ๋งŒ ์žˆ๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋‹ค๋ณด๋‹ˆ ํ‘ธ์‰ฌ ํ•œ๋ฒˆ์ด ๋ฌด์„œ์› ๊ณ  conflict ๋‚ ๊นŒ๋ด ๋งŽ์ด ์กฐ์‹ฌ์Šค๋Ÿฌ์› ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜๋„ ์†Œํ†ต์„ ๊นƒ์„ ์‚ฌ์šฉํ•  ๋•Œ ํŒ€์›๋ผ๋ฆฌ ๋งŽ์ด ํ•˜๊ณ  ์• ์ดˆ์— ๊ฐ์ž ๊ธฐ๋Šฅ ํŒŒ์ผ์„ ๋‚˜๋ˆ ๋†“์€ ์ƒํƒœ๋ผ์„œ conflict๋Š” ๋งŽ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๊ณ  ๊ฑฑ์ • ํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค๋Š” ๋œ ํž˜๋“ค์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

git์„ ํ†ตํ•œ ํŒ€ ํ˜‘์—…์„ ๋ช‡๋ฒˆ ๋” ํ•ด์„œ git ํ˜‘์—…์— ์ž์‹ ์žˆ๊ฒŒ ๋‹ค๊ฐ€๊ฐ€๊ณ  ์‹ถ๋‹ค.

 

github: https://github.com/JKyEun/test-world

 

GitHub - JKyEun/test-world: 4๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ฐ”์ผ ๊ธฐ์ค€ ์›น์‚ฌ์ดํŠธ (์žฅ๊ฒฝ์€, ๊น€๊ณ„ํ™˜,

4๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ฐ”์ผ ๊ธฐ์ค€ ์›น์‚ฌ์ดํŠธ (์žฅ๊ฒฝ์€, ๊น€๊ณ„ํ™˜, ๋ฐ•์ง€์›, ๊น€๋ฏผ์ •) - GitHub - JKyEun/test-world: 4๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ฐ”์ผ ๊ธฐ์ค€ ์›น์‚ฌ์ดํŠธ (์žฅ๊ฒฝ์€, ๊น€๊ณ„ํ™˜, ๋ฐ•์ง€

github.com

์†Œ๊ฐ

์ฒ˜์Œ์œผ๋กœ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒฝํ—˜ ํ•ด ๋ณด์•˜๋Š”๋ฐ ์•„๋ฌด๋ž˜๋„ ํ˜ผ์žํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค๋ณด๋‹ˆ ์กฐ์‹ฌ์Šค๋Ÿฌ์› ๊ณ  ๊ฑฑ์ •๋ฌ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ •๋ง ์šด์ด ์ข‹๊ฒŒ ํŒ€์›๋“ค์ด ์ •๋ง ์ข‹์€ ์‚ฌ๋žŒ๋“ค ์ด์—ˆ๊ณ , ๋‹ค๋“ค ์ž์‹ ์˜ ๋งก์€ ๋ฐ”๋ฅผ ์—ด์‹ฌํžˆ ํ•ด์„œ ๋ฌด์‚ฌํžˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์น  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์šฐ๋ฆฌ๋ผ๋ฆฌ ๋จธ๋ฆฌ๋ฅผ ๋ชจ์•„ ์ •ํ•œ ์ฃผ์ œ์™€ ๋””์ž์ธ ์ปจ์…‰๋„ ๋งˆ์Œ์— ๋“ค์—ˆ๊ณ  ๊ทธ๋ž˜์„œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋” ์žฌ๋ฏธ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ผ์ฃผ์ผ์ด๋ผ๋Š” ์‹œ๊ฐ„์ด ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋Š” ๊ธธ๋‹ค๊ณ  ๋А๊ปด์กŒ์ง€๋งŒ ๋ง‰์ƒ ๋“ค์–ด๊ฐ€๊ณ  ๋‚˜๋‹ˆ ๊ธˆ๋ฐฉ ์ง€๋‚˜๊ฐ„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ๊ธˆ๋ฐฉ ํƒ! ํ•˜๊ณ  ๊ตฌํ˜„ํ•ด๋‚ผ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ๋‚˜๋Š” ๋„ˆ๋ฌด ๊ฐœ๋ฐœ ์ดˆ๋ณด์˜€๊ณ  ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ ํ•  ๋•Œ๋งˆ๋‹ค ์•ž์„œ ํ–ˆ๋˜ ์ž‘์—…๋“ค์ด ๊ณ ์žฅ๋‚ฌ๋‹ค. ๋•๋ถ„์— ์ฝ˜์†”์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ณ๋‹ค๋ณด๋ฉฐ ๋ช‡๋ฒˆ์ด๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ฌ์ง€์–ด JsํŒŒ์ผ๋„ ๊ฐˆ์•„ ์—Ž์—ˆ๋‹ค ใ…‹ใ…‹..

๋‹คํ–‰ํžˆ ์–ด๋А์ •๋„ ๋Šฅ์ˆ™ํ•ด์ ธ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๊ณ  ๋‚˜๋ฆ„ ๋ฟŒ๋“ฏํ•˜๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.

๊ต์œก๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฐฐ์› ๋˜ ๊ฒƒ๋“ค์„ ์ง์ ‘ ํ”„๋กœ์ ํŠธ์— ๋„ฃ์–ด ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ๊ณ  ์•ž์œผ๋กœ ์ด๋Ÿฐ ๊ธฐํšŒ๊ฐ€ ๋งŽ์ด ์ƒ๊ฒผ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œํ•œ๋ฒˆ ํ•จ๊ป˜ ๊ณ ์ƒํ•œ ์šฐ๋ฆฌ ํŒ€์›๋“ค์—๊ฒŒ ๊ณ ๋งˆ์›€์„ ๋А๊ผˆ๋‹ค..!