본문 바로가기
항해99/온보딩 스터디

[항해99] 온보딩 스터디 - 3주차 1일 TIL

by junvely 2023. 3. 20.

🦄 온보딩 스터디 3주차 1일 TIL

✨03/20 : 목표 : CSS 1강 + 네이버 검색바 만들기

오늘부터 온보딩 스터디 CSS과정을 시작한다. CSS는 이미 어느정도 다룰 줄 알기 때문에 부족했던 flex, grid 개념 등과 SASS 등에 대해 보충하여 공부해보려고 한다. 오늘은 CSS기초 강의 1강과 연습삼아 네이버 검색바를 만들어 보았다.


📒CSS 1강 + 네이버 검색바 만들기

01 네이버 검색바 만들기

 

Html 

<body>
    <div class="wrap">
      <h1 class="logo"></h1>
      <div class="searchBar">
        <div class="inputBox">
          <input type="text" class="searchInput" />
          <div class="bottons">
            <button class="keyboard">⌨️</button>
            <button class="dropdownBtn">
              <i class="fa-solid fa-caret-down"></i>
            </button>
          </div>
        </div>
        <button class="searchBtn">
          <i class="fa-solid fa-magnifying-glass"></i>
        </button>
        <ul class="dropdown" data-dropdown="false">
          <li>List1</li>
          <li>List2</li>
          <li>List3</li>
          <li>List4</li>
          <li>List5</li>
        </ul>
      </div>
    </div>

 

CSS

- boder나 padding 요소에 box-sizing : border-box 해주기

.searchBar {
  width: 100%;
  max-width: 586px;
  display: flex;
  border: 2px solid #5fc04c;
  box-sizing: border-box;
  position: relative;
}

- dropdown메뉴 => 높이값이 없으면 해당 transition 효과가 잘 일어나지 않는다.

.dropdown {
  width: 100%;
  height: 0;
  background-color: #fff;
  border: 1px solid #ccc;
  position: absolute;
  left: 0;
  top: 100%;
  padding: 2%;
  z-index: -1;
  visibility: hidden;
  transition: all 0.3s;
  box-sizing: border-box;
  cursor: pointer;
}

.visible {
  height: 180px; // 높이를 auto로 지정해주면 해당transition효과가 일어나지 않는다.
  visibility: visible;
}

- ul 안의 li리스트가 동적으로 생성될 때 ul의 높이도 같이 조정되도록 하려고 했는데, 원하는 것처럼 잘되지는 않았다. 그렇게는 잘 사용하지 않는다고 하니 아이러니 하지만 일단 높이값을 정해두고 만들었다.

 

JS

- 검색바 또는 드롭다운 버튼 클릭 시 검색리스트(ul)가 나오게 만들기

"use strict";

const searchBar = document.querySelector(".searchBar");
const dropDownBtn = document.querySelector(".dropdownBtn");
const dropDown = document.querySelector(".dropdown");

const handleClick = (e) => {
  const target = e.target;
  console.log(target.className);
  if (
    target.className === "fa-solid fa-caret-down" ||
    target.className === "dropdownBtn" ||
    target.className === "searchInput"
  ) {
    dropDownClick();
  }
};

const dropDownClick = () => {
// event로 접근하지 않아도, 선택자의 class나 속성값에 접근 가능하다.
  const isDropDown = dropDown.getAttribute("data-dropdown");
  dropDown.setAttribute("data-dropdown", !isDropDown);
  dropDown.classList.toggle("visible");
  dropDownBtn.classList.toggle("triangleUp");
};

searchBar.addEventListener("click", handleClick);

❗event.target으로 굳이 접근하지 않아도 선택자의 class나 속성에 접근 가능하다.

event는 위임으로 원하는 요소 클릭 시 이벤트가 발생하도록 분기처리 하는 등에 사용하고,

요소에 접근하는 것은 class나 속성값으로 접근하는 것이 더 손쉽고 간편한 방법인 것 같다.

 

❗dataset 속성은 true나 false와 같은 boolean값도 전부 문자열데이터로 할당하기 때문에 비교연산자를 쓸 때, boolean이 아닌 문자열""로 비교해 주어야 한다. => isDropDown === true ❌ / isDropDown === "true"

 

- classList 속성 => classList .add() , classList .remove(), classList.toggle() 

각각 기존의 클래스리스트에서 추가, 삭제, 토글 기능도 넣고 뺄 수 있다.

- className과의 차이점은 className은 아예 클래스 자체를 설정한 값으로 새로 생성하고, classList는 기존의 클래스리스트에서 추가 등 수정한다는 점이다.

- className으로 클래스명 가져와 비교할 때는 모든 클래스명을 다 써줘야 한다.(여러개 존재할 때 한개만 비교 시, false 반환) => target.className === "fa-solid" ❌ / target.className === "fa-solid fa-caret-down" ⭕

 

 

 

결과🙌 => 검색창 클릭 시 드롭다운