본문 바로가기

TIL

[TIL-120] 위코드 19일차: 위스타그램 Wrap-Up / Javascript 테스트

CSS

 

bottom-up

개념

자식 태그에 속성을 먼저 부여하고 그에 따라 부모 태그의 속성이 결정되게 하는 방식이다. 예를 들어, 부모 태그에 고정된 크기를 주는 게 아니라, 그 안의 자식 요소들의 크기를 부여하여 부모 요소의 크기가 결정되게 한다. 그럼 내부의 자식 요소에 변동이 있을 때 부모 요소도 알아서 조절되기 때문에 변화에 유연하다는 장점이 있다.

하지만 무조건 bottom-up 방식을 쓰는 것은 아니다. 예를 들어, 부모 요소의 정해진 크기(영역)을 초과하도록 자식 요소가 추가될 경우 스크롤해서 확인할 수 있게 할 때가 있다.

.boxComponent {
  height: 200px;
  padding: 10px;
  margin: 10px 0;
  overflow: scroll;
  background-color: white;
  border: 2px solid #efefef;
}
  • overflow : 해당 속성의 값을 "scroll"로 해두면 요소의 영역을 초과하는 내용은 스크롤해서 확인할 수 있게 스크롤바가 생긴다.

 

 

 

flex 컨테이너의 width/height

개념

자식 요소를 가운데 정렬하기 위해 부모 요소를 flex로 했을 때(부모 요소=flex 컨테이너), flex 컨테이너가 자식 요소보다 큰 너비/높이를 갖지 않으면 정렬의 효과가 없다. 보통 가운데 정렬을 할 때는 기준이 되는 영역의 너비를 flex 컨테이너가 꽉 채우고 있어야 한다. 따라서 flex 컨테이너와 그 부모의 부모를 모두 width/height = 100%로 해주어야 한다. 혹은 flex 컨테이너에 width/height = 100vw/vh로 해주어도 된다. 하지만 %viewport 기준 너비/높이는 다르기 때문에 상황에 따라 선택한다.

.loginMain {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-color: #fbfafb;
}

 


 

Javascript

 

<button> 태그의 type="submit"

개념

<form> 태그 안의 <button> 태그는 기본적으로 type="submit" 속성을 갖고 있다. 이 버튼을 클릭하면 submit이 동작하면서 페이지가 새로고침된다. 새로고침되면 버튼 클릭 이후에 해당 페이지에서 더 실행하고 싶은 코드를 진행할 수 없다. 그래서 새로고침을 원치 않으면 속성값을 type="button"으로 바꾸어주면 된다. 혹은 클릭 이벤트 발생 시, event.preventDefault() 메서드로 기본값인 새로고침이 동작하는 것을 막을 수 있다. 

 

[관련] <form> 태그 : 시맨틱 웹 & 이벤트 위임

<input>과 <button>을 <form> 안에 넣는 이유는 <div>로 감싸도 되지만, 보다 semantic한 웹을 구현하기 위함이다.

<form> 태그 안에 여러 <input> 태그들이 있을 때, <form> 태그에 addEventListener()를 사용하면 하위 태그에 모두 해당 이벤트가 위임되므로 한번에 처리할 수 있다. 예를 들어, 여러 <input> 태그들에 값이 입력될 때 발생하는 keyboard 이벤트를 감지하려면 이 <input>들을 감싸고 있는 <form> 태그 하나에만 키보드 이벤트 발생에 대한 addEventListener()를 붙여주면 된다.

loginForm.addEventListener("keyup", () => {
  inputId.value && inputPw.value ? activeBtn() : inactiveBtn();
});

 

 

 

"input" 이벤트

개념

<input>에 값이 입력되는 것을 감지하려면, keyboard 이벤트를 이용할 수도 있지만 마우스로 문자열을 복사-붙여넣기 할 경우에 알아챌 수 없다. 그래서 "input" 이벤트를 사용하면 키보드로 입력하든 마우스로 입력하든 모두 감지할 수 있다.

loginForm.addEventListener("input", () => {
  inputId.value && inputPw.value ? activeBtn() : inactiveBtn();
});

 

 

 

<script src=".js"></script>

개념

자바스크립트 파일을 html 파일에 연결할 때, html <body>의 맨 마지막에 <script> 태그를 이용해서 담아야 한다. html 코드 전에 쓰면 그 뒤에 적힌 html 내용을 읽어올 수 없어서 DOM을 이용하여 태그에 접근하고 event를 listen할 수 없다.

이때 <script> 태그에 defer 속성을 쓰면 자바스크립트 파일을 연결하는 <script> 태그를 어디에 쓰든지 DOM으로 html을 읽어올 수 있다.

 

 

 

event.code

개념

키보드를 눌렀을 때 어떤 키가 눌렸는지 받아올 수 있다. event.keycode는 곧 지원되지 않을 수 있기 때문에 event.code를 쓰는 게 좋다.

 

 

 

querySelector()

개념

DOM 모델을 이용하여 태그의 태그명/클래스명/id명을 통해 자바스크립트에서 html 태그에 접근할 수 있게 해준다. getElementById나 getElementsByClassName 등은 document.getElementById("")로 document 전체에서만 검색할 수 있는 반면, htmlTag.querySelector의 형태로 태그 안에서도 검색할 수 있다. 그럼 document 전체에서 검색하는 것보다 빠르다.

 

 

 

function init() { addEventListener }

개념

function init()으로 선언한 함수 안에 addEventListener()들을 모아놓고, init()하여 실행한다. 이렇게 하면 init() 함수는 entry point로 분리하는 기능을 한다. addEventListener는 어떤 요소에서 특정 이벤트가 발생할 때 원하는 동작 실행시키는 코드다. 따라서 변수와 함수를 선언하는 코드와 구분하여 두는 것이 코드의 길이가 길 때 가독성이 좋다. 그렇지 않으면 수많은 변수와 함수들 사이에서 어떤 코드가 실제로 함수를 동작시키는지 찾기 힘들 수 있다.

 

 

 

 


 

indexOf() 메서드 대체

오답노트

function getFind(filter, sentence) { 
  const arr = sentence.split("");
  let space = 0;

  for(let i = 0; i < sentence.length; i++) {
    if (arr[i] === " ") {
      space++;
    } else if (arr[i] === filter) {
      return i - space + 1;
    }
  }
  
  return -1;
}
  • 찾는 값이 없을 때 반환할 값을 정해주지 않았다.
  • 원한 건 공백도 포함하여 위치를 계산한 값인데 공백을 제외하고 세서 틀렸다.
  • 위치는 인덱스 값으로 돌려주면 되는데 1을 더해서 반환했다.

 

 


 

버튼을 활성화할 때 disabled 속성을 이용할지, 조건을 충족할 때만 작동할 코드를 부여할지