🐨CoalaCoding
Docs▾
JavaScriptReactHTML & CSSBackendAI & LLMDev ToolsCreative
B반1
👾숏츠
🙉B반2
게시판
🐨CoalaCoding

개발자를 위한 한국어 웹 기술 문서

문서

  • JavaScript
  • React
  • HTML & CSS
  • Backend
  • AI & LLM
  • Dev Tools
  • Creative

커뮤니티

  • 게시판
  • 예제 모음

기타

  • 관리자

정책

  • 소개
  • 개인정보처리방침
  • 이용약관
  • 연락처
© 2026 CoalaCoding. All rights reserved.
  • 1. topBtn
  • 2. rollingBanner
  • 3. menu
  • 4. stickyMenu
  • 5. accordion
  • 6. swiper
  • 7. activeMenu
  • 9. slide
  • 10. tab
  • 11. scrollEffect
  • 12. ajax
  • 13. tabSlide
  • 15. adaption
  • 18. 게슈탈트이론
  • 19. 색채심리학
  • 20. 황금비율
  • 21. 컬러모드
  • 22. 디자인실무용어
  • 23. 이미지파일의특징
  • 24. 폰트와사이즈
  • 25. 레이아웃기초
  • 26. 10가지법칙
  • 27. 아이트래킹
  • 28. 색상을성공적으로고르는방법
  • 29. 타이포그래피10가지팁
  • 30. 스타일가이드만들기
  • 31. 모바일디자인버튼
  • 32. 조형요소
  • 33. 6가지비주얼체계규칙
  • 34. 아이콘디자인이론
  • 35. 해상도와그리드시스템
  • 36. 피그마란
  • 37. 작업환경세팅
  • 38. 인터페이스예제
  • 39. 기능심화
  • 40. 인터페이스설계
  1. 홈
  2. 문서
  3. HTML & CSS
  4. UI 컴포넌트
  5. 3. menu

3. menu

미리보기

HTML

```html
<!DOCTYPE html>
  <html lang="ko">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2단계 메가메뉴</title>
    <link rel="stylesheet" href="menu.css">
  </head>
  <body>
    <nav class="nav">
      <ul class="menu">
        <li class="item">
          <a href="#" class="link">카테고리1</a>
          <div class="mega">
            <div class="row">
              <div class="col">
                <h3>서브1-1</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                  <li><a href="#">항목3</a></li>
                </ul>
              </div>
              <div class="col">
                <h3>서브1-2</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                  <li><a href="#">항목3</a></li>
                </ul>
              </div>
              <div class="col">
                <h3>서브1-3</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                  <li><a href="#">항목3</a></li>
                </ul>
              </div>
            </div>
          </div>
        </li>
        <li class="item">
          <a href="#" class="link">카테고리2</a>
          <div class="mega">
            <div class="row">
              <div class="col">
                <h3>서브2-1</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                </ul>
              </div>
              <div class="col">
                <h3>서브2-2</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                </ul>
              </div>
            </div>
          </div>
        </li>
        <li class="item">
          <a href="#" class="link">카테고리3</a>
          <div class="mega">
            <div class="row">
              <div class="col">
                <h3>서브3-1</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                  <li><a href="#">항목3</a></li>
                  <li><a href="#">항목4</a></li>
                </ul>
              </div>
              <div class="col">
                <h3>서브3-2</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                </ul>
              </div>
              <div class="col">
                <h3>서브3-3</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                  <li><a href="#">항목3</a></li>
                </ul>
              </div>
              <div class="col">
                <h3>서브3-4</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                </ul>
              </div>
            </div>
          </div>
        </li>
        <li class="item">
          <a href="#" class="link">카테고리4</a>
          <div class="mega">
            <div class="row">
              <div class="col">
                <h3>서브4-1</h3>
                <ul>
                  <li><a href="#">항목1</a></li>
                  <li><a href="#">항목2</a></li>
                  <li><a href="#">항목3</a></li>
                </ul>
              </div>
            </div>
          </div>
        </li>
      </ul>
    </nav>

    <section>
      <h1>2단계 메가메뉴 예제</h1>
      <p>상단 메뉴에 마우스를 올려보세요.</p>
    </section>

    <script src="menu.js"></script>
  </body>
  </html>
```

CSS

```css
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }

  body {
    font-family: sans-serif;
  }

  .nav {
    background: #333;
    position: relative;
    z-index: 999;
  }

  .menu {
    list-style: none;
    display: flex;
    justify-content: space-evenly;
    align-items: center;
    width: 100%;
    max-width: 1200px;
    margin: auto;
    text-align: center;
  }

  .item {
    width: calc(80% / 4);
  }

  .link {
    display: block;
    padding: 15px 20px;
    color: #fff;
    text-decoration: none;
  }

  .link:hover {
    background: #555;
  }

  .mega {
    position: absolute;
    top: 100%;
    left: 0;
    width: 100vw;
    background: #eee;
    border-bottom: 1px solid #ddd;
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.3s;
    z-index: 1000;
  }

  .item:hover .mega,
  .item:focus-within .mega,
  .item.on .mega {
    max-height: 500px;
  }

  .row {
    display: flex;
    padding: 20px;
    gap: 30px;
    max-width: 1200px;
    margin: 0 auto;
  }

  .col {
    flex: 1;
  }

  .col h3 {
    margin-bottom: 10px;
    font-size: 14px;
  }

  .col ul {
    list-style: none;
  }

  .col ul li {
    margin-bottom: 5px;
  }

  .col ul li a {
    color: #333;
    text-decoration: none;
    font-size: 13px;
  }

  .col ul li a:hover {
    text-decoration: underline;
  }

  .cnt {
    padding: 50px;
  }

  section {
    padding: 2vw;
    height: 100vh;
  }
```

JS

```js
const nav = document.querySelector('.nav');
const items = document.querySelectorAll('.item');

// 마우스 오버로 메뉴 열기
items.forEach(item => {
  item.addEventListener('mouseenter', () => {
    // 다른 메뉴 닫기
    items.forEach(i => i.classList.remove('on'));
    // 현재 메뉴 열기
    item.classList.add('on');
  });
});

// nav 영역 벗어나면 모두 닫기
nav.addEventListener('mouseleave', () => {
  items.forEach(item => item.classList.remove('on'));
});

// ESC 키로 닫기
document.addEventListener('keydown', (e) => {
  if (e.key === 'Escape') {
    items.forEach(item => item.classList.remove('on'));
  }
});
```

스티키

```css
  .nav.sticky {
  position: fixed;     /* 고정 상태 */
  top: 0;
  left: 0;
  width: 100%;
}
```

```js
// nav의 시작 위치 저장
  const navTop = nav.offsetTop;

  // 스크롤 이벤트
  window.addEventListener('scroll', () => {
    if (window.scrollY > navTop) {
      nav.classList.add('sticky');    // nav 높이 넘으면 고정
    } else {
      nav.classList.remove('sticky'); // 위로 올라가면 해제
    }
  });
```