웹 프로젝트 기초집LESSON 11
메뉴와 스크롤: 접근 가능한 내비게이션과 섹션 이동 만들기
난이도초급
예상 시간45분
선수지식10강 데이터 기반 DOM 카드
11강. 메뉴와 스크롤: 접근 가능한 내비게이션과 섹션 이동 만들기
1. 이번 강의에서 해결할 문제
작은 화면에서 메뉴가 공간을 차지하거나 CSS로만 숨겨 키보드 초점이 보이지 않는 곳에 남습니다. 실제 버튼과 hidden 상태를 연결합니다.
2. 학습 목표
3. 핵심 개념
메뉴를 여는 요소는 button이고 aria-controls가 대상 id를 가리킵니다. 표시 상태와 aria-expanded를 한 함수에서 동기화합니다. 기본 앵커 이동을 보존하면 JavaScript가 꺼져도 링크가 작동합니다.
4. 단계별 실습
HTML · 헤더 내비게이션 교체
game-dev-portfolio/index.html
<button id="menuButton" class="menu-button" type="button" aria-expanded="false" aria-controls="siteNav">메뉴 열기</button>
<nav id="siteNav" aria-label="주요 메뉴" hidden>
<a href="#about">소개</a><a href="#projects">프로젝트</a><a href="#contact">연락처</a>
</nav>
JavaScript · 파일 경로: js/app.js에 추가
game-dev-portfolio/js/app.js
const menuButton = document.querySelector('#menuButton');
const siteNav = document.querySelector('#siteNav');
function setMenuOpen(open) {
menuButton.setAttribute('aria-expanded', String(open));
menuButton.textContent = open ? '메뉴 닫기' : '메뉴 열기';
siteNav.hidden = !open;
}
menuButton.addEventListener('click', () => {
setMenuOpen(menuButton.getAttribute('aria-expanded') !== 'true');
});
siteNav.addEventListener('click', (event) => {
if (event.target.matches('a[href^="#"]')) setMenuOpen(false);
});
CSS · 파일 경로: css/style.css
game-dev-portfolio/css/style.css
[hidden] { display: none !important; }
.menu-button { min-height: 44px; }
@media (min-width: 48rem) {
.menu-button { display: none; }
#siteNav { display: flex !important; }
}
개발자 도구 확인: 320px에서 Elements의 hidden, aria-expanded가 함께 변하는지 봅니다. JavaScript를 비활성화하면 메뉴 링크가 HTML에 남도록 개선할 방법도 기록합니다.
5. 코드가 동작하는 이유
버튼의 기본 키보드 처리가 Enter와 Space를 지원합니다. hidden은 렌더링과 접근성 트리에서 메뉴를 함께 제거하고, 앵커 링크는 브라우저 기본 섹션 이동을 사용합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
MINI QUIZ
0 / 2메뉴와 스크롤: 접근 가능한 내비게이션과 섹션 이동 만들기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
11강. 메뉴와 스크롤: 접근 가능한 내비게이션과 섹션 이동 만들기 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.