[HTML] tabindex 속성 알아보기

profile image

많은 개발자들이 모르거나 간과하기 쉬운 HTML 속성이 있다면, 그것은 바로 tabindex다.

tabindex 란?

tabindex는 HTML 요소가 키보드 포커스를 받을 수 있는지, 그리고 받는다면 어떤 순서로 받을지를 제어하는 전역 속성(Global Attribute)이다. 사용자가 키보드의 Tab 키 혹은 Shift + Tab 키를 눌러 웹 페이지 내의 요소들(링크, 버튼, 입력 필드 등) 사이를 이동할 때, 이 tabindex 속성이 그 순서와 동작 방식을 결정한다.

tabindex 값과 의미

tabIndex 속성은 정수 값을 받으며, 그 값에 따라 완전히 다른 동작을 하게 된다.

1. tabindex="0"

요소를 키보드로 탐색할 수 있게 한다. 대화형 콘텐츠 (a, button,input ,textarea 등...) 에서는 따로 지정하지 않아도 기본 값으로 0을 가진다. 그러나 비 대화형 콘텐츠는 기본 값으로 -1을 가지기 때문에 키보드를 통해 탐색하 고 싶을 경우 tabindex=0과 같이 0 이상의 값을 줘야 한다.

주로 기본적으로 포커스를 받지 않는 컨테이너 요소를 키보드로 접근 가능하게 만들 때 사용한다.

html
<div tabindex="0" role="button">div로 만들어진 버튼!</div>

2. tabindex="-1"

요소를 키보드로 탐색에서 제외 시킨다. 비 대화형 콘텐츠 에서는 따로 지정하지 않아도 기본 값으로 -1을 가진다. Tab 키를 통해서는 focus 되지 않지만. 프로그래밍 방식으로는 가능하다.

html
<div id="myModalContent" tabindex="-1">모달 내용...</div>
<script>
  document.getElementById('myModalContent').focus();
</script>

3. tabindex="양수"

요소에 명시적인 탭 순서를 부여한다. 1부터 시작하여 숫자가 작은 요소부터 순서대로 포커스를 받게 된다. 같은 숫자를 가진 요소들은 HTML 소스 코드 순서대로 포커스를 받는다.

Warning

안티패턴 으로 간주됨
양수 tabindex는 논리적인 문서 구조와 다르게 포커스 순서를 강제하여 사용자(특히 키보드 및 스크린 리더 사용자)에게 혼란을 주고 웹 접근성을 해칠 수 있다. 또한 유지보수도 어려워질 수 있다.

언제 사용하면 좋을까 ?

tabindex는 얼핏 보면 그냥 쓰는게 좋아 보이는 것 같지만, 신중하게 사용해야 하는 속성이다.

  • tabindex="0"
    • 커스텀 인터랙티브 요소 제작: <div>, <span> 등으로 직접 만든 버튼, 탭, 슬라이더, 메뉴 항목 등 시맨틱 HTML 요소로 구현하기 어려운 커스텀 위젯에 키보드 접근성을 부여하고 싶을 때 사용한다. 이 경우, 해당 요소가 실제 인터랙티브 요소처럼 동작하도록 JavaScript로 키보드 이벤트(Enter, Space 등) 처리 로직을 추가 하고, 적절한 aria-role을 명시하여 스크린 리더 사용자에게 요소의 역할을 알려주는 것이 좋다.
    • 탭 순서에 요소 포함: 기본적으로 포커스를 받지 못하는 비 대화형 콘텐츠(예: 특별히 강조하고 싶은 텍스트 블록)를 탭 순서에 포함시키고 싶을 때 사용할 수 있다.
  • tabindex="-1"
    • 모달 또는 대화 상자: 모달 창이 열렸을 때, 배경 콘텐츠에 tabindex="-1" 를 적용해 키보드 탐색을 비활성화 시킨다.

마무리

tabindex는 웹사이트의 접근성을 높이고 사용자 경험을 개선하는 데 큰 역할을 한다. 하지만 적절히 사용하지 않으면 오히려 혼란을 줄 수 있으니, 기본 동작을 잘 이해하고 신중하게 사용하도록 하자.

요약 하자면

  1. 가능한 한 자연스러운 HTML 흐름을 따르자
  2. 양수 tabindex 값은 피하자
  3. tabindex="0"는 상호작용 요소에만 사용하자
  4. tabindex="-1"는 프로그래밍 방식 포커스가 필요한 요소에만 사용하자
  5. ARIA 속성과 함께 사용하여 최대한의 접근성을 확보하자
❤️ 0
🔥 0
😎 0
⭐️ 0
🆒 0