CSS 탭 생성기

다음

탭은 어디에나 있습니다, 설정 창, 문서 사이트, 제품 갤러리. 네이티브 HTML에는 전용 탭 요소가 없어 개발자들이 직접 만듭니다. 이 생성기는 활성 탭의 강조 색상, 버튼의 모서리 반지름, 호버 상태를 갖춘 간단한 탭 바를 HTML + CSS로 만들어 줍니다. 마크업을 프로젝트에 붙여 넣고 탭 전환은 직접 작성한 JavaScript로 연결하세요.

탭 만드는 방법

  1. 1

    강조 색상 선택

    활성 탭의 배경색과 글자색입니다. 브랜드에 어울리는 색을 고르세요.

  2. 2

    모서리 반지름 설정

    탭 버튼의 위쪽 모서리를 둥글게 만듭니다. 값이 클수록 부드러운 느낌이 납니다.

  3. 3

    레이블 편집

    결과에는 "Overview", "Details", "Settings" 버튼 세 개가 포함됩니다. 콘텐츠에 맞게 이름을 바꾸세요.

  4. 4

    코드 복사

    탭 마크업에는 자체 <style> 블록이 포함됩니다. 둘을 모두 페이지에 붙여 넣으세요.

  5. 5

    탭 전환 추가

    생성기는 시각적 부분만 만듭니다. 패널을 표시하고 숨기려면 버튼을 직접 작성한 JavaScript나 UI 라이브러리에 연결하세요.

올바른 접근성 마크업

<div class="tabs">
  <div role="tablist" aria-label="Product info">
    <button role="tab" id="tab-1" aria-selected="true"  aria-controls="panel-1" tabindex="0">Overview</button>
    <button role="tab" id="tab-2" aria-selected="false" aria-controls="panel-2" tabindex="-1">Specs</button>
    <button role="tab" id="tab-3" aria-selected="false" aria-controls="panel-3" tabindex="-1">Reviews</button>
  </div>
  <section role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</section>
  <section role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</section>
  <section role="tabpanel" id="panel-3" aria-labelledby="tab-3" hidden>...</section>
</div>

핵심 속성:

  • role="tablist"가 버튼들을 감쌉니다.
  • 각 버튼에 role="tab", 그리고 aria-selectedaria-controls.
  • tabindexroving tabindex 패턴을 씁니다: 활성 탭만 0이고 나머지는 -1입니다. 방향키가 그 사이로 포커스를 옮깁니다.
  • 각 패널에 role="tabpanel", 그 탭을 가리키는 aria-labelledby.
  • 비활성 패널에 hidden(단독 display: none이 아님, 이 속성을 AT가 사용합니다).

키보드 계약

동작
Tab tablist로 들어가기 / 나가기
ArrowLeft 이전 탭(마지막으로 순환)
ArrowRight 다음 탭(처음으로 순환)
Home 첫 탭
End 마지막 탭
Enter / Space 포커스된 탭 활성화(수동 활성화일 때)

자동 활성화(포커스가 이동하면 탭이 전환) vs 수동(포커스가 이동하고 Enter로 탭 활성화), WAI-ARIA는 둘 다 허용합니다. 자동은 시각 사용자에게 더 쉽고, 수동은 탭 콘텐츠 렌더링이 무거울 때 더 낫습니다.

밑줄 스타일

[role="tablist"] {
  display: flex;
  border-bottom: 1px solid #e5e7eb;
}
[role="tab"] {
  padding: 0.75rem 1rem;
  background: transparent;
  border: 0;
  color: #6b7280;
  position: relative;
  cursor: pointer;
}
[role="tab"][aria-selected="true"] {
  color: #111827;
}
[role="tab"][aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 1rem; right: 1rem; bottom: -1px;
  height: 2px;
  background: #2563eb;
}

알약 스타일

[role="tab"] {
  padding: 0.5rem 0.9rem;
  border-radius: 9999px;
  border: 0;
  background: transparent;
}
[role="tab"][aria-selected="true"] {
  background: #2563eb;
  color: #fff;
}

포커스 표시

키보드로 포커스가 올 때는 항상 포커스 링을 그리세요:

[role="tab"]:focus-visible {
  outline: 2px solid #60a5fa;
  outline-offset: 2px;
}

JavaScript

대략:

const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
  tab.addEventListener('click', () => activate(tab));
  tab.addEventListener('keydown', e => {
    const i = [...tabs].indexOf(tab);
    if (e.key === 'ArrowRight') tabs[(i + 1) % tabs.length].focus();
    if (e.key === 'ArrowLeft')  tabs[(i - 1 + tabs.length) % tabs.length].focus();
    if (e.key === 'Home') tabs[0].focus();
    if (e.key === 'End')  tabs[tabs.length - 1].focus();
  });
});

function activate(tab) {
  tabs.forEach(t => {
    const panel = document.getElementById(t.getAttribute('aria-controls'));
    const active = t === tab;
    t.setAttribute('aria-selected', active);
    t.setAttribute('tabindex', active ? '0' : '-1');
    panel.hidden = !active;
  });
  tab.focus();
}

총 30줄, 의존성 제로.

탭 vs 아코디언

좁은 화면에서는 탭 행이 비좁아집니다. 흔한 패턴: 데스크톱은 탭, 모바일은 아코디언. ARIA 역할을 바꾸지 않고 시각 처리를 전환하려면 컨테이너 쿼리나 미디어 쿼리를 사용하세요.

자주 묻는 질문

접근성 있는 탭이라면 네. role="tablist"role="tab"이 없으면 스크린 리더가 버튼을 일반 버튼으로 취급하고 사용자는 내비게이션 관례를 잃습니다. 대안은 내장 시맨틱이 있는 평범한 <details> / <summary> 아코디언입니다.

각 탭 콘텐츠 렌더링이 가벼우면 자동(포커스 이동 시 탭 활성화)이 괜찮습니다. 탭 전환이 페치나 큰 폼 렌더링 같은 무거운 작업을 유발하면 수동(포커스 이동, Enter로 활성화)이 더 낫습니다.

콘텐츠를 담은 탭(문서, 제품 탭)이라면 네, 해시(#specs)나 쿼리 파라미터를 써서 링크가 특정 탭으로 딥링크되고 새로고침에도 활성 탭이 유지되게 하세요. UI 탭(설정 창)은 URL이 선택 사항입니다.

방향키 내비게이션과 ARIA 상태가 없는 체크박스/라디오 핵으로만 가능합니다. 진정으로 접근성 있는 구현에는 작은 JS 스니펫이 그만한 값을 합니다. 서버 렌더 폴백이 필요하면 각 탭을 고유 URL로 연결하고 해당 패널을 서버 측에서 렌더링하세요.

관련 도구

이 도구는 다른 언어로도 제공됩니다