아티클

WAI-ARIA 바르게 사용하기 8부 – 자동완성 편집창의 올바른 구현방법

2019-12-26 10:25:50

안녕하세요. 엔비전스입니다.

지난 WAI-ARIA 바르게 사용하기 7부 – role=”slider”에서는 사용자가 수치를 조절할 수 있는 HTML의 기본 input의 range 유형과 slider role을 제공하여 커스텀 슬라이더를 만드는 방법을 알아보았습니다.

이번 아티클에서는 편집 가능한 텍스트 편집창에 사용자가 내용을 입력할 때, 추천 목록을 제공하여 키보드 또는 마우스로 원하는 추천 항목을 선택하여 완성하는 자동완성 편집창 기능을 WAI-ARIA를 중심으로 다뤄보고자 합니다.

 

이번 아티클은 크게 두 개의 부문으로 나뉩니다.

  1. 자동완성 편집창의 유형
  2. 접근 가능한 자동완성 편집 창 구현하기

자동완성 편집 창의 유형

자동완성 편집창은 사용자의 상호작용 방법에 따라 크게 다음과 같은 세 가지 유형으로 나눌 수 있습니다.

  1. 직렬완성(inline) 형
  2. 목록선택(list) 형
  3. 복합(both) 형

직렬(Inline) 형 자동완성

인라인 자동완성의 예 : 주소 표시줄
직렬 완성형 자동완성 기능은 편집 중인 사용자에게 목록을 별도로 제공하지 않고, 캐럿 뒤에 사용자가 입력한 글자로 시작하는 단어가 입력되며, 블록으로 선택됩니다.

사용자가 추가로 글자를 입력할 때, 추천단어의 다음 글자와 일치할 경우, 해당 추천단어가 캐럿 뒤에 계속 표시되며, 추천단어와 글자가 일치하지 않으면 사라지는 구조입니다.

 

목록(List)형 자동완성

사용자가 편집창에 초점을 보냈을 때 자동완성 리스트가 제공됩니다. 대표적인 사례로는 파일 탐색기의 주소 표시줄이나 시작 메뉴의 검색을 예로 들 수 있을 것입니다. 펼쳐진 목록을 방향키로 탐색할 시 편집창에 해당 내용이 들어오며, Enter를 눌러 해당 내용을 선택하는 방식입니다.

 

리스트형 자동완성 목록이 표시된 모습

 

 

복합(Both) 형 자동완성

위에서 언급한 직렬형과 목록형을 모두 적용한 자동완성 유형으로 사용자가 입력한 글자와 가장 인접한 단어가 캐럿 뒤에 입력되며, 편집창 아래에 목록형과 같은 목록이 표시됩니다. 인라인으로 이미 표시 중인 단어는 첫 번째 항목으로 선택된 상태로 표시됩니다. 대표적인 both 유형의 사례는 웹 브라우저의 주소 표시줄이 되겠습니다.

 

inline과 list가 동시에 제공된 모습 : 구글 크롬 주소 표시줄

 

 

접근 가능한 자동완성 편집창 구현하기

자동완성의 접근성을 이해하기 위해서는 자동완성 편집창을 구성하는 HTML 요소를 먼저 파악해야 합니다. 자동완성 편집창은 다음과 같은 태그의 마크업이 필요합니다.

HTML 기본 마크업

  • list형 목록을 기준으로 작성됨

<form>

<input type=”text” id=”search” aria-label=”검색어 입력” placeholder=”검색어를 입력하세요.” />

<button id=”btn_search” aria-label=”검색”></button>

<ul id=”ac-listbox”>

       <li>..</li>

       …

</ul>

</form>

 

위 코드를 분석해 보자면 input에서 입력된 텍스트에 대한 값을 listbox의 li로 시각적으로 표시하여 사용자가 마우스나 방향 키로 해당 목록을 편집창에 채워 넣을 수 있다는 것을 알 수 있습니다. 위 마크업은 키보드 상호작용과 함께 제공한 경우, 시각적으로는 아무 문제가 없습니다. 하지만 위 마크업의 경우, 스크린 리더 사용자가 텍스트 편집창에 초점을 이동했을 때, 하단 또는 상단에 목록이 확장되어 자동완성 목록이 표시됨을 전혀 인지할 수 없으며, 목록 정보를 제공받을 수 없습니다. 또한 스크린 리더 사용자의 경우, 가상 커서를 활성화할 경우, 가상 커서가 listbox 요소에 접근되어 반복된 내용을 들어야 하는 불필요한 탐색이 발생하게 됩니다.

 

스크린 리더 사용자를 위한 WAI-ARIA 사용

우리는 위 기본 마크업만으로 스크린 리더 사용자가 자동완성 편집창을 사용할 수 없다는 문제점을 알았습니다. 이제 이를 해결하기 위해서는 어떤 방법을 써야 할까 알아볼 차례입니다.

Input 요소의 접근성 속성

  1. Role=”combobox” 사용

직렬형 자동완성 요소가 아닌 확장하거나 축소할 수 있는 항목형이나 복합형의 경우, role=”combobox”를 사용하여 스크린 리더 사용자가 확장 축소 가능한 요소임을 인지할 수 있도록 해야 하며, aria-expanded로 목록의 펼침/접힘 상태를, aria-haspopup=”true”로 자동완성 항목이 있음을 명시할 수 있습니다.

  1. aria-autocomplete

우선, 스크린 리더 사용자가 자동완성이 가능한 편집 요소임을 알 수 있도록 하려면 사용자가 편집할 input 요소에 aria-autocomplete를 사용하고, 브라우저에서 제공하는 autocomplete 속성을 비활성 상태로 변경해주어야 합니다.

<form>

<input type=”text” id=”search” aria-label=”검색어 입력” placeholder=”검색어를 입력하세요.” autocomplete=”off” aria-autocomplete=”list” />

</form>

aria-autocomplete는 총 네 가지 속성을 가지고 있습니다.

  1. none(기본값): 속성을 제공하지 않은 상태이거나, 값이 없을 경우, 기본값은 none으로, 사용자가 편집 요소에 초점을 보내도 자동완성 요소임을 알리지 않습니다.
  2. Inline: 직렬형 자동완성 편집 요소임을 명시합니다.
  3. list: 목록형 자동완성 편집 요소임을 명시합니다.
  4. both: 목록형과 직렬형을 포괄한 복합형 요소임을 명시합니다.

위 속성 값에 따른 스크린 리더 사용자에게 제공되는 음성 출력 내용은 다르지 않으며, 속성값은 개발자를 위한 명시에 가깝습니다.

따라서 none을 제외한 나머지 속성값을 제공하여 스크린 리더 사용자가 편집창에 초점을 보냈을 시, 음성을 통해 자동완성 기능을 사용할 수 있다는 음성이 출력할 수 있도록 할 수 있습니다.

  1. aria-owns

aria-owns 속성은 서로 구조상 관계가 없는 요소를 연결하는 역할을 수행합니다. Input 요소는 닫는 태그가 별도로 없는 셀프 클로징 요소로 자손 요소를 둘 수 없습니다. 따라서 이 aria-owns를 사용하여 input의 자손처럼 스크린 리더가 인식할 수 있도록 listbox 요소를 연결하는 것입니다.

<form>

<input type=”text” id=”search” aria-label=”검색어 입력” placeholder=”검색어를 입력하세요.” autocomplete=”off” aria-autocomplete=”list” aria-owns=”ac-listbox” />

</form>

aria-owns의 속성값은 HTML ID이며, aria-owns에 입력된 ID와 일치하는 요소를 자손 요소로 스크린 리더 사용자에게 전달합니다.

  1. aria-activedescendant

aria-activedescendant는 aria-owns와 마찬가지로 HTML id 값을 받는 속성으로 스크린 리더 사용자의 실제 초점과 가상 커서는 편집창에 위치하고 있으나, 마치 초점이 어떠한 요소로 탐색하는 것과 같이 속성값에 제공한 id와 일치하는 요소를 읽게끔 전달합니다.

이 속성을 통해 스크린 리더 사용자는 별도로 자동완성 항목의 개수를 제공하지 않아도 목록 항목 개수를 제공받을 수 있습니다.

목록 및 항목 요소에 대한 접근성 속성

목록 ul에는 role=”listbox”를 사용하여 콤보 상자의 목록상자임을 명시해야 하며

목록 요소 하위에 위치한 항목, li 태그에는 role=”option”을 제공하여 콤보 박스의 option 항목으로 인식될 수 있도록 해야 합니다.

접근성이 제공된 HTML 마크업 형태

다음은 사용자가 편집창에 “사”라고 입력하였을 때 자동완성 상태를 마크업 형태로 표현한 것입니다.

<form>

<input type=”text” role=”combobox” id=”search” aria-label=”검색어 입력” placeholder=”검색어를 입력하세요.” aria-owns=”ac-listbox” aria-activedescendant=”ac_list_selected” />

<button id=”btn_search” aria-label=”검색”></button>

<ul id=”ac-listbox”>

          <li id=”ac_list_selected” role=”option”>사과</li>

          <li role=”option”>포도</li>

          <li role=”option”>…</li>

          …

</ul>

</form>

사용자가 “사”를 입력했기 때문에 데이터베이스에서 “사” 자로 시작하는 “사과”를 표시할 것이며, 사용자가 아래 화살표 키를 눌렀을 때, “사과”가 activedescendant로 선택되어 스크린 리더 사용자에게 음성으로 전달될 것입니다.

자동완성 UI 상효작용 제공

자동완성은 다음과 같은 UI 상호 작용 이벤트를 제공해야 합니다.

목록 항목에 대한 click 이벤트

마우스 사용자는 원하는 단어를 입력하여 나타난 자동완성 목록을 마우스 왼쪽 버튼 클릭으로 선택할 수 있어야 합니다.

록 항목에 대한 키보드 이벤트 제공

자동완성 요소는 다음과 같은 키보드 상호작용을 필수로 제공해야 합니다.

  1. 위 화살표 키(keyCode 38), 아래 화살표 키(keyCode 40): 이전/다음 자동완성 목록 항목 탐색
  • 스크린 리더 사용자와 키보드 사용자가 자동완성 항목을 선택할 수 있도록 항목 탐색 단축키를 제공해야 합니다. 마지막 항목에서 다음 항목 탐색 진행 시, 첫 번째 항목으로 순환되어야 하며, 마찬가지로 첫 번째 항목에서 이전 항목 탐색 진행 시 마지막 항목으로 순환되어야 합니다.
  1. Enter 키(keyCode 13): 자동완성 편집을 종료하고, 목록 상자가 축소되어야 합니다. (검색의 경우, 검색이 진행되어야 합니다)
  2. Escape 키(keyCode 27): ESC 키를 눌러 자동완성 목록 상자를 축소할 수 있어야 합니다.
  3. Option 요소에 button이나 a 태그와 같은 초점이 있는 요소가 함께 제공되었을 경우, 별도의 초점 처리가 필요합니다.

a나 button 요소와 같은 기본 초점이 있는 요소가 목록 상자의 옵션 요소 하위에 제공된 경우, 해당 a 요소나 button 요소는 Tab키로 탐색되지 않도록 tabindex=”-1”로 제공해야 하며, role=”none”으로 해당 요소명을 읽지 않도록 제공해 주어야 합니다.

지금까지 자동완성 요소의 유형 개념과 어떻게 제공해야 하는가에 대해 다뤄보았습니다.

국내 웹사이트 자동완성 요소의 경우, 대부분이 커스텀 요소이기 때문에 이번 아티클에서 다룬 내용을 적용한다면 스크린 리더 사용자의 정보접근성 향상을 기대됩니다. 다음에도 유익한 내용으로 뵙도록 노력하겠습니다. 감사합니다.

 

[참고자료]:

W3C WAI-ARIA 자동완성 콤보상자 예제

댓글 0
댓글을 작성하려면 해주세요.