햄버거 메뉴

Hamburger menu

가로줄 3개로 된 아이콘 버튼. 누르면 숨어 있던 내비게이션(주로 드로어)이 나타납니다.

다른 이름: Menu iconNav toggleHamburger icon
···
html
<div class="hmw">
  <button class="ham" id="ham" aria-label="메뉴 열기" aria-expanded="false"><i></i><i></i><i></i></button>
  <div class="peek" id="peek"><span>알림</span><span>설정</span><span>계정</span></div>
</div>
css
.hmw{position:relative;width:100%;height:100%}
.ham{position:absolute;top:14px;left:14px;width:36px;height:36px;border-radius:9px;border:1px solid var(--line);background:var(--surface);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;cursor:pointer}
.ham i{display:block;width:16px;height:2px;background:var(--fg);border-radius:1px;transition:transform .25s,opacity .2s}
.ham[aria-expanded=true] i:nth-child(1){transform:translateY(7px) rotate(45deg)}
.ham[aria-expanded=true] i:nth-child(2){opacity:0}
.ham[aria-expanded=true] i:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
.peek{position:absolute;top:0;right:0;bottom:0;width:min(120px,42%);background:var(--surface);border-left:1px solid var(--line);
  display:grid;gap:10px;align-content:start;padding:16px 12px;transform:translateX(100%);transition:transform .28s ease;font-size:11px;color:var(--fg)}
.peek[data-open]{transform:translateX(0)}
js
const ham = document.getElementById('ham'), peek = document.getElementById('peek');
function open(v) { ham.setAttribute('aria-expanded', String(v)); peek.toggleAttribute('data-open', v); }
let auto = true;
ham.addEventListener('click', () => { auto = false; open(ham.getAttribute('aria-expanded') !== 'true'); });
function loop() { if (!auto) return; open(ham.getAttribute('aria-expanded') !== 'true'); setTimeout(loop, 1600); }
setTimeout(loop, 900);

아이콘 자체는 의미를 전달하지 못하므로 aria-label="메뉴 열기"(또는 텍스트 라벨 병기)를 반드시 달고, aria-expanded로 열림 상태를 알립니다. 세 줄이 X자로 모핑되는 애니메이션은 상태가 바뀌었다는 걸 시각적으로도 보여줍니다.

드로어 항목과 관계가 있습니다 — 햄버거 메뉴는 그 드로어를 여는 "트리거 아이콘"일 뿐, 드로어 자체는 아닙니다. 둘은 항상 짝을 이루지만 서로 다른 컴포넌트입니다.

모바일에서 오랫동안 관례로 자리 잡았지만, 메뉴 항목이 3~4개뿐이라면 숨기지 않고 그대로 노출하는 게 발견성 면에서 더 낫다는 지적도 있습니다 — "숨겨진 서랍" 자체가 존재를 모르면 안 열어보는 문제가 있습니다.