역할 · 위젯
role="tab"
탭 목록(tablist) 안의 탭입니다. 선택하면 연결된 탭 패널(tabpanel)을 표시합니다.
한눈에 보기
- 분류
- 위젯
- 대응 HTML
- 없음
- 이름 정하는 방법
- 콘텐츠, 작성자
- 이름 필수
- 아니요
- 필수 상위 요소
tablist- 필수 하위 요소
- 없음
설명
tab은 tablist에 들어가는 탭 하나입니다. 탭과 패널은 다음처럼 서로 연결합니다.
- 탭 → 패널: 탭에
aria-controls="패널 id". - 패널 → 탭: 패널에
aria-labelledby="탭 id"(패널 이름이 탭 이름이 됩니다). - 현재 탭:
aria-selected="true", 나머지는"false"(기본값이false이지만 명시하는 것이 좋습니다).
탭 목록은 탭 순서에서 한 번만 멈추고(선택된 탭만 tabindex="0"), 탭 사이는 방향키로 이동합니다. 포커스를 옮기자마자 패널을 바꾸는 자동 활성화와, Enter/Space를 눌러야 바뀌는 수동 활성화 중 하나를 고릅니다. 패널 내용을 불러오는 데 시간이 걸리면 수동 활성화가 낫습니다.
탭 안의 콘텐츠는 이름으로만 쓰입니다
tab은 Children Presentational이 True입니다. 탭 안에 넣은 아이콘·배지 텍스트도 이름에 합쳐지므로, “새 글 3”처럼 읽히길 원하는지 확인하고 필요 없으면 aria-hidden으로 뺍니다. WAI-ARIA 1.2 표에서 탭의 이름은 필수가 아니지만, 화면낭독기 사용자에게는 이름 없는 탭이 쓸모없으므로 항상 이름을 갖게 합니다.
테스터 관점
- 탭에 포커스했을 때 “탭, 선택됨, 1/3”처럼 역할·상태·위치가 읽히는지 확인합니다.
- Tab이 탭 사이가 아니라 탭 목록 → 패널로 이동하는지 확인합니다.
- 숨겨진 패널이
hidden등으로 접근성 트리에서도 빠져 있는지 확인합니다.
함께 쓰는 속성
지원 속성
전역 속성(이름·설명 등)은 모든 역할에 쓸 수 있어 생략했습니다.
키보드 동작
| 키 | 동작 |
|---|---|
| Tab | 탭 목록으로 들어오면 선택된 탭으로 포커스가 갑니다. 탭 목록 안에서 누르면 선택된 탭 패널(또는 그 안의 첫 포커스 요소)로 이동합니다. |
| → | 다음 탭으로 이동합니다. 마지막 탭이면 첫 탭으로 순환합니다. 자동 활성화면 패널도 바뀝니다. |
| ← | 이전 탭으로 이동합니다. 첫 탭이면 마지막 탭으로 순환합니다. |
| Home | (선택 사항) 첫 탭으로 이동합니다. |
| End | (선택 사항) 마지막 탭으로 이동합니다. |
| Space | (수동 활성화) 포커스된 탭을 선택하고 패널을 표시합니다. |
| Enter | (수동 활성화) Space와 같습니다. |
| Shift + F10 | (선택 사항) 탭에 연결된 팝업 메뉴가 있으면 엽니다. |
| Delete | (선택 사항) 삭제할 수 있는 탭이면 탭을 지우고 포커스를 다음 탭으로 옮깁니다. |
사용 예
기본 구조
<div role="tablist" aria-label="상품 정보">
<button type="button" role="tab" id="t1" aria-selected="true" aria-controls="p1">상세 설명</button>
<button type="button" role="tab" id="t2" aria-selected="false" aria-controls="p2" tabindex="-1">리뷰</button>
</div>
<div role="tabpanel" id="p1" aria-labelledby="t1" tabindex="0">...</div>
<div role="tabpanel" id="p2" aria-labelledby="t2" tabindex="0" hidden>...</div>탭 바꾸기
function select(tab) {
tabs.forEach(function (t) {
var on = t === tab;
t.setAttribute('aria-selected', String(on));
t.tabIndex = on ? 0 : -1;
document.getElementById(t.getAttribute('aria-controls')).hidden = !on;
});
tab.focus();
}탭을 링크 목록으로 만드는 실수
<ul role="tablist">
<li role="tab"><a href="/notice">공지</a></li> <!-- 페이지 이동은 탭이 아니라 내비게이션 -->
</ul>탭을 누를 때 다른 페이지로 이동한다면 탭 패턴이 아니라 <nav> 안의 링크 목록과 aria-current="page"를 씁니다.
직접 해 보기
탭 목록에 포커스를 두고 ← → Home End로 이동해 보세요. 포커스가 옮겨지면 바로 해당 패널이 표시되는 자동 활성화 방식입니다. Tab을 누르면 탭 목록을 벗어나 패널로 이동합니다.
면 100% 소재의 기본 티셔츠입니다.
주문 후 2~3일 안에 도착합니다.
받은 날부터 7일 안에 신청할 수 있습니다.
실시간 코드 — 조작하면 속성 값이 바뀌는 모습을 볼 수 있습니다
화면낭독기에서는
| 상황 | 들리는 안내 (예) |
|---|---|
| 탭 목록으로 이동 | 상품 정보, 탭 목록, 상세 설명, 탭, 선택됨, 1/3 |
| →로 다음 탭 | 배송 안내, 탭, 선택됨, 2/3 |
| Tab으로 패널 이동 | 배송 안내, 탭 패널, 주문 후 2~3일 안에 도착합니다. |
사용 지침
이렇게 쓰세요
tablist바로 안에 탭을 넣습니다(사이에 래퍼가 있으면role="none").- 선택된 탭만
tabindex="0", 나머지는-1로 둡니다. - 탭과 패널을
aria-controls/aria-labelledby로 서로 연결합니다.
이렇게 쓰지 마세요
- 페이지 이동 메뉴에 탭 역할을 쓰지 않습니다.
- 선택 상태를 클래스(
.active)로만 표시하지 않습니다. - 모든 탭을 탭 순서에 넣어 Tab으로 탭 사이를 이동하게 만들지 않습니다.
관련 역할·패턴
이 역할을 쓰는 패턴