본문 바로가기
공부일지/Javascript

Vanilla JS. DropDown Menu(feat. CSS)

by 곰인간 2023. 1. 16.

* 오늘은 자바스크립트로 드롭다운 메뉴 만들기 도전

* 저번에 못 만들고 타협해서 셀렉트 박스로 바꿨었는데

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="dropdown closed"> // class에서 dropdown과 closed 2가지를 선언
        <h2 class="icon">DropDown <sapn></sapn></h2>
        <ul class="menu">
            <li><a href="https://www.youtube.com/" target="_blank">유튜브</a></li>
            <li><a href="#">menu 2</a></li>
            <li><a href="#">menu 3</a></li>
            <li><a href="#">menu 4</a></li>
        </ul>
    </div>
    <script src="app2.js"></script>
</body>
</html>

*  class에서 띄어쓰기를 하면 하나의 class가 아닌 다른 class로 선언된다.

body {
    margin: 0;
    font-family: Courier New;
    font-size: 20px;
  }
  ul {
    margin: 0;
    padding: 0;
    list-style-type: none;
  }
  a {
    text-decoration: none;
    color: black;
  }
  .dropdown {
      transition: all 0.2s ease-in-out;
      overflow: hidden; // overflow 속성 값을 hidden으로 해야 dropdown의 자식요소 부분이 숨겨진다.
      margin: 30px;
      background: rgb(248, 248, 248);
      border: solid 1px rgb(222, 222, 222);
      width: 320px;
      cursor: pointer;
    }
    .icon {
      display: flex;
      justify-content: space-between;
      padding: 0 25px 0 10px;
    }
    .menu {
      height: auto;
    }
    .menu li {
      font-size: 20px;
      text-align: center;
      text-transform: uppercase;
      padding: 14px 10px;
      border-top: solid 1px rgb(202, 202, 202);
    }
  
    .dropdown.closed .menu {
      height: 0px;
    } // dropdown의 자식요소인 메뉴의 범위?

 

CSS 마지막 부분의 자식요소인 메뉴의 나타나는 범위 지정

* 0px로 설정해야 메뉴바의 모습이 통째로 가려진다.

* overflow : hidden; 과 같이 써야 드롭다운 메뉴에서 하위 메뉴들이 표시가 되지않더라...고 지웠다 썼다를 반복한 끝에 알았다... 머리는 알겠는데 설명이 부족하다..

const dropDown = document.querySelector(".dropdown")

function mouseenter () {
    if(dropDown.classList.contains('closed')) {
        dropDown.classList.remove('closed')
    }
} // contains( String ) 지정한 클래스 값이 엘리먼트의 class 속성에 존재하는지 확인한다.

// if 문을 쓰지않고 dropDown.classList.toggle('closed') 만 함수에 사용해도 똑같이 작동한다.
// 본문에 쓰인건 조건문을 이용한 토글 기능

function mouseleave() {
    if(!dropDown.classList.contains('closed')) {
        dropDown.classList.add('closed')
    }
}   // !는 논리 연산자 NOT을 뜻 합니다.
// dropDown 클래스에 closed가 들어가 있지 않으면 closed를 추가해줍니다.


dropDown.addEventListener("mouseenter", mouseenter);
dropDown.addEventListener("mouseleave", mouseleave);

* 이렇게 하면 드롭다운 위에 마우스를 올렸을 때 하위 메뉴바들이 나타나며, 마우스가  드롭다운 위에서 떠났을 때 하위 메뉴바들이 사라집니다.

드롭다운 메뉴가 작동하는 모습, 유튜브에 링크를 걸어서 이동하는 모습

댓글