tabindex=1
, tabindex=0
, tabindex=-1
요 며칠 사이 tabindex 속성이 저를 좀 당황스럽게 했습니다. 일반적으로 tabindex 속성은 키보드 접근성을 훼손할 우려가 있기 때문에 평소에 거들떠 보지도 않던 속성인데요. 해외 오픈소스 위지윅 에디터를 벤치마킹 하다가 tabindex="-1"
이라는 코드를 발견한 겁니다. 제가 알기로 소시적에 이런 코드는 표준이 아니었거든요.
HTML4 명세는 tabindex를 다음과 같이 설명합니다. 이 설명은 XHTML 문서에도 동일하게 적용됩니다.
- 이 속성은 문서의 탭 순서 안에서 현재 요소의 순번을 결정한다. 값은
0
부터32767
사이의 숫자여야 한다. 브라우저는 값 앞에0
이 붙어있으면 무시해야 한다.- 탭 순서는 사용자가 키보드를 통해 탐색할 때 어떤 요소가 초점을 받는 순서가 되는지를 결정한다.
- 초점을 받을 요소는 브라우저에서 다음과 같은 규칙에 따라 탐색되어야 한다.
- 요소가
tabindex
속성을 지원하고 양의 값이 할당되어 있으면 먼저 탐색되어야 한다. 탐색은tabindex
값의 가장 작은 수에서 시작하여 가장 큰 값으로 향한다. 값은 연속되는 일련의 숫자가 아니어도 상관이 없고 어떤 수로 시작해도 무방하다. 요소에 동일한tabindex
값이 지정되어 있다면 코드 안에서 먼저 등장하는 순서대로 탐색되어야 한다.tabindex
속성 지원 여부에 관계 없이0
값이 할당된 요소는 그 다음으로 탐색된다. 이 요소들은 코드 안에서 등장하는 순서대로 탐색된다.disabled
속성이 사용된 요소는 탭 순서에 관여하지 않는다.a
,area
,button
,input
,object
,select
,textarea
요소가tabindex
속성을 지원하는 요소이다.
어쨌거나 표준에 따르면 tabindex
속성에는 음수 값을 사용할 수 없습니다. 그러나 현존하는 브라우저들은 tabindex="-1"
속성이 부여된 요소에 대해 키보드가 접근하지 않는 방식으로 구현을 해놨더라구요. 결국 이 방식이 사실상 표준이거나 또는 공식 표준이 아닐까 하는 생각이 들어 HTML5 명세를 찾아 봤습니다.
HTML5 명세는 tabindex 속성의 음수 값을 다음과 같이 설명합니다.
tabindex
값이 음의 정수라면 요소에 초점이 도달하지 않도록 해야 한다.
결국 tabindex
속성에서 음수 값을 사용하여 초점을 받을 수 없도록 하는 스펙을 추가한 것입니다. 그리고 현존하는 웹 브라우저들은 문서의 DTD에 관계 없이 이런 새로운 스펙을 낡은 문서에서도 사용할 수 있도록 구현해 둔 것입니다.
지구인들이 가장 많이 사용하고 있는 위지윅 에디터 TinyMCE와 CKEditor는 이런 코드를 도구모음 버튼에 적용하여 키보드 사용자들이 도구모음 블럭을 아예 건너 뛰도록 해 놨더라구요. 이런 구현방식에 대해 어떤 분들은 키보드 사용자를 고려하지 않았다고 주장할 수 있는데요. 제가 보기에는 이 친구들 센스있게 잘 처리한 것으로 봅니다. 키보드만으로 위지윅 에디터를 사용해 본 분들은 이런 처리를 이해할 수 있습니다.
국내 포털에서 제공하는 에디터는 도구모음 블럭에 키보드가 접근할 수 있도록 처리해 놨지만 실제로는 키보드만으로는 절대로 사용할 수가 없습니다. 일단 본문 영역에 초점이 들어가면 빠져나올 방법이 없기 때문에 문제가 시작됩니다. 편집 영역에 초점이 들어가면 Tab
키를 눌러서 빠져 나와야 하는데 Tab
키에 들여쓰기 기능을 맵핑해 놓았기 때문에 편집 영역에서 빠져나올 수 없습니다. 결국 키보드만 사용하는 시각 장애인 또는 상지 장애인(팔이 없거나 불편한)은 글쓰기 과업을 수행할 수 없었습니다.
tabindex="1"
문서 안에서 가장 먼저 초점을 받을 수 있습니다. 그러나 자연스러운 마크업 순서를 거스르기 때문에 주의해서 사용해야 합니다. 검색엔진 사이트에서 검색창에 사용하면 적합하지만(이 대신 autofocus
속성이 더 적절할 듯 해요) 그 외 적합한 경우는 잘 떠오르지 않는군요.
tabindex="0"
키보드 초점을 받을 수 없는 div
, span
과 같은 요소도 초점을 받을 수 있도록 만들어 줍니다. 초점을 받되 초점을 받는 순서는 자연스러운 마크업 순서를 따릅니다.
tabindex="-1"
키보드 초점을 받을 수 있는 요소도 초점을 받을 수 없도록 만들어 줍니다. 초점을 받을 수 없기 때문에 "-1"
이외의 다른 음의 정수 값은 사실상 의미가 없습니다.