2주차 TIL & 회고 - 2

강성일·2023년 4월 23일
0
post-thumbnail

✅ TIL


어제 코드스테이츠 계산기에서 다뤘던 user flow를 내 커비 계산기에도 탑재할 것이다.

먼저 action을 number나 operator로 받아주기 위해, class 이름 통일이 필요했다.
현재 내 커비 계산기 파일은 각각 class 이름을 가지고 있기 때문이다.

숫자들은 class = number, 연산자는 operator, C는 clear 등 이름에 맞는 클래스로 코드를 리팩토링했다.

그리고 코드스테이츠 JS 파일을 가져와, 조금 수정해주었다.


const calculator = document.querySelector(".calculator");
const buttons = calculator.querySelector("main");

const operator = document.querySelector(".calculator__operator");
const calculatedResult = document.querySelector(".calculator__result");

function calculate(n1, operator, n2) {
  let result = 0;

  if (operator === "+") {
    result = n1 + n2;
  } else if (operator === "-") {
    result = n1 - n2;
  } else if (operator === "*") {
    result = n1 * n2;
  } else if (operator === "/") {
    result = n1 / n2;
  } else if (operator === "%") {
    result = n1 % n2;
  }

  return String(result);
}

const display = document.querySelector(".calculator_display");
let firstNum, operatorForAdvanced, previousKey, previousNum;

buttons.addEventListener("click", function (event) {
  const target = event.target;
  const action = target.classList[0];
  const buttonContent = target.textContent;

  if (action === "number") {
    if (display.textContent === "0" || previousKey === "operator") {
      display.textContent = buttonContent;
    } else {
      display.textContent += buttonContent;
    }
    previousKey = "number";
  }

  if (action === "operator") {
    firstNum = display.textContent;
    operatorForAdvanced = buttonContent;
    previousKey = "operator";
    if (operatorForAdvanced === buttonContent || display.textContent === "0") {
      display.textContent = buttonContent;
    }
  }

  if (action === "convert") {
    display.textContent = -display.textContent;
  }

  if (action === "decimal") {
  }

  if (action === "clear") {
    display.textContent = "0";
    displayNumber = null;
    firstNum = null;
    previousKey = null;
  }

  if (action === "calculate") {
    let n1 = Number(firstNum);
    let n2 = Number(display.textContent);
    display.textContent = calculate(n1, operatorForAdvanced, n2);
  }
});

살짝 다른 점이 있다면,
+/- 버튼이 있는데 음수와 양수로 변환해주는 기능이므로, 클래스 이름을 convert라고 지었다.

그리고 버튼 관련해서 css 기능을 추가시켜주었다.


* {
  margin: 0;
  padding: 0;
  border: 0px;
  box-sizing: border-box;
  font-family: monospace, cursive;
  color: black;
}

img {
  height: 95vh;
  width: 50%;
  position: absolute;
}

body {
  display: flex;
  justify-content: center; 
  align-items: center; 
  height: 100vh; 
  background: url("./img/kirby.gif") no-repeat center center fixed;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
}

.calculator_display {
  justify-content: center;
  text-align: end;
  color: white;
  font-size: 5rem;
  display: flex;
  flex-direction: column;
  flex: 25 0 0;
  margin-right: 2vw;
  margin-top: -2vh;
  margin-bottom: 3vh;
}

main {
  display: flex;
  flex-direction: column;
  justify-content: space-between; 
  align-items: center;
  flex: 75 0 0;
  margin-top: -1vh;
}

.numberline5,
.numberline4,
.numberline3,
.numberline2,
.numberline1 {
  display: flex;
  margin-top: -1vw; 
}

.calculator {
  width: 30vw;
  height: 80vh;
  position: absolute;
  display: flex;
  flex-direction: column;
}

.number,
.operator,
.clear,
.calculate,
.decimal,
.convert,
.double {
  background-color: rgba(250, 217, 222, 0.8);
  width: 7vw;
  height: 5vh;
  font-size: 1.5rem;
  border-radius: 3vw;
  font-weight: bold;
  cursor: pointer;
  margin: 2%;
  border: solid 1px;
  box-shadow: 0.5vh 0.5vh 0.5vh rgb(233, 83, 83);
  transition-duration: 0.2s;
}

button:hover {
  background-color: rgba(249, 201, 208, 0.5);
}

button:active {
  margin-left: 1vw;
  margin-top: 1vh;
  box-shadow: none;
}

.clear,
.convert,
.operator:nth-of-type(3) {
  color: red;
}

.double {
  width: 14.2vw;
}

@media screen and (max-width: 575px) {
  img {
    height: 50vh;
    width: 70%;
    position: absolute;
  }
  .calculator {
    width: 30vw;
    height: 45vh;
    position: absolute;
    display: flex;
    flex-direction: column;
  }
  .calculator_display {
    margin-right: 0vw;
    font-size: 2.5rem;
    text-align: center;
    margin-top: -20vh;
    margin-bottom: 20vh;
  }
  .number,
  .operator,
  .clear,
  .calculate,
  .decimal,
  .convert {
    width: 12vw;
    height: 4vh;
  }
  .double {
    width: 24vw;
  }
}

버튼에 마우스를 올려놨을 때, hover 기능과
버튼을 눌렀을 때, action 기능을 넣어 입체감을 주었다.

매번 무언가 컨텐츠가 생기고 많다는 것은 늘 즐거운 일이다 😚💕

profile
아이디어가 넘치는 프론트엔드를 꿈꿉니다 🔥

0개의 댓글