2. HTML에서 ARIA 사용에 대한 참고

2.1 ARIA 사용의 첫 번째 규칙

필요한 의미와 동작이 이미 내장된 기본 HTML 요소 [HTML51] 또는 속성을 사용할 수 있다면, 요소의 목적을 바꿔 ARIA 역할, 상태, 속성을 추가하여 접근 가능하게 만드는 대신 그렇게 하십시오.

언제 이것이 불가능할 수 있는가?

2.2 ARIA 사용의 두 번째 규칙

정말 필요하지 않다면 기본 의미를 변경하지 마십시오.

예: 개발자가 탭인 헤딩을 만들고 싶을 때.

이렇게 하면 안 됩니다:

<h2 role=tab>heading tab</h2>     

이렇게 하십시오:

<div role=tab><h2>heading tab</h2></div>
참고

비인터랙티브 요소를 인터랙티브 요소로 사용하는 경우, 개발자는 ARIA와 적절한 스크립트로 의미와 상호작용 동작을 모두 추가해야 합니다. 버튼의 경우, 그냥 (기본 HTML) 버튼을 사용하는 것이 훨씬 더 좋고 쉽습니다.

참고

비슷한 의미의 ARIA 역할을 사용하는 경우, 폴백으로 기본 HTML 요소를 사용하는 것은 괜찮습니다. 예를 들어, list 요소ARIA 기반 스크립트 트리 위젯의 뼈대로 사용하는 것 등이 있습니다.

2.3 ARIA 사용의 세 번째 규칙

모든 인터랙티브 ARIA 컨트롤은 키보드로 사용할 수 있어야 합니다.

사용자가 클릭, 탭, 드래그, 드롭, 슬라이드, 스크롤할 수 있는 위젯을 만든 경우, 사용자는 키보드로도 해당 위젯에 이동하고 동일한 동작을 수행할 수 있어야 합니다.

모든 인터랙티브 위젯은 상황에 따라 표준 키 입력 또는 키 조합에 반응하도록 스크립트 처리되어야 합니다.

예를 들어 role=button을 사용하는 경우 해당 요소는 포커스를 받을 수 있어야 하며, 사용자는 WIN OS의 enter 또는 MAC OS의 return, 그리고 space로 해당 동작을 수행할 수 있어야 합니다.

자세한 내용은 [wai-aria-practices-1.1]의 디자인 패턴과 위젯, 키보드 인터페이스 개발 섹션을 참고하세요.

2.4 ARIA 사용의 네 번째 규칙

포커스를 받을 수 있는 요소에는 role="presentation" 또는 aria-hidden="true"를 사용하지 마십시오.

이렇게 하면 일부 사용자가 '아무것도 아닌' 것에 포커스하게 됩니다.

이렇게 하면 안 됩니다:

<button role=presentation>press me</button>   

이렇게 하면 안 됩니다:

<button aria-hidden="true">press me</button>   
참고

보이는 인터랙티브 요소의 부모/조상에 aria-hidden을 적용해도 해당 인터랙티브 요소가 숨겨지므로 이렇게 하는 것도 안 됩니다:


<div aria-hidden="true"> 
<button>press me</button>
</div>
참고

인터랙티브 요소가 보이지 않거나 상호작용이 불가한 경우에만 포커스를 받을 수 없는지 확인한 뒤 aria-hidden을 사용할 수 있습니다. 예시:

 button {opacity:0}

<button tabindex="-1" aria-hidden="true">press me</button>
참고

인터랙티브 요소 또는 그 조상에 display:none 또는 visibility:hidden을 사용하면 포커스를 받을 수 없을 뿐 아니라 접근성 트리에서도 제거됩니다. 따라서 aria-hidden="true"를 추가하거나 tabindex="-1"을 명시적으로 설정할 필요가 없습니다.

2.5 ARIA 사용의 다섯 번째 규칙

모든 인터랙티브 요소는 접근 가능한 이름을 가져야 합니다.

인터랙티브 요소는 접근성 APIaccessible name(또는 동등한) 속성에 값이 있는 경우에만 접근 가능한 이름을 갖습니다.

예를 들면, 아래 코드 예제의 input type=text는 'user name'라는 표시 라벨은 있지만 접근 가능한 이름은 없습니다:


    user name <input type="text">

    또는

    <span>user name</span> <input type="text">
    

이 컨트롤의 MSAA accName 속성은 비어 있습니다:

example control with MSAA name and role information displayed. The accName property has no value, the accRole property is 'editable text'.

아래 코드 예제의 input type=text는 표시 라벨 'user name' 및 접근 가능한 이름을 모두 가집니다. input 요소가 labelable element이고 label 요소를 사용하여 라벨 텍스트와 입력을 연결했기 때문입니다.


<!-- 참고: for/id 사용 또는 라벨 래핑으로 텍스트와 컨트롤을 연결하면 접근 가능한 이름이 생성됩니다 -->

<input type="text" aria-label="User Name">

또는

<span id="p1">user name</span> <input type="text" aria-labelledby="p1">

이 컨트롤의 MSAA accName 속성의 값은 "user name"입니다:

example control with MSAA name and role information displayed. The accName property has a value of 'user name', the accRole property is 'editable text'.

참고

참고: 위의 예는 ARIA 위젯에 해당합니다. 일반 HTML 입력에서는 ARIA의 첫 번째 규칙을 준수하여 label 요소의 for 속성을 사용해 input과 라벨을 연결하세요.

HTML label 요소와 labelable 요소

아래는 HTML에서 label을 사용하는 방법입니다. ARIA 위젯을 개발하는 경우 ARIA Authoring Practices Document를 참고하세요.

label 요소는 label이 기본 HTML labelable element를 참조하지 않는 이상, 커스텀 컨트롤의 접근 가능한 이름을 제공할 수 없습니다.


     <!-- HTML input 요소와 combox 역할 -->

      <label>
      user name <input type="text" role="combobox">
      </label>
    

이 컨트롤의 MSAA accName 속성의 값은 "user name"입니다:

example input element with MSAA name and role information displayed. The accName property has a value of 'user name', the accRole property is 'combo box'.

div 요소는 어떤 역할이 할당되어 있어도 HTML labelable element가 아닙니다.


     <!-- HTML div 요소와 combox 역할 -->

      <label>
      user name <div  role="combobox"></div>
      </label>
    

이 컨트롤의 MSAA accName 속성은 비어 있습니다:

example div element with MSAA name and role information displayed. The accName property is empty, the accRole property is 'combo box'.

참고

다섯 번째 규칙은 작성 중입니다

 

2.6 역할(role)을 추가하면 기본 의미에 어떤 영향이 있나?

ARIA 역할을 추가하면 기본 역할 의미를 접근성 트리에서 덮어써서, 접근성 API를 통해 보고됩니다. 그러므로 ARIA는 스크린 리더나 기타 보조기술에 보고되는 내용을 간접적으로 바꿉니다.

예를 들어, HTML 트리에서 다음 코드는:

<h1 role=button>text</h1>

접근성 트리에서는 이렇게 바뀝니다:

button  with a label of 'heading text'

역할(role) 추가로 달라지지 않는 점

ARIA 역할을 추가해도 보조기술 이외의 사람들에게 해당 요소의 보이거나 동작이 달라지지 않습니다. 요소의 동작, 상태, 속성은 바뀌지 않고 기본 역할 의미만 영향을 받습니다.

예를 들어, HTML 트리에서 다음 코드는:

<button role=heading aria-level=1>text</button>

접근성 트리에서는 이렇게 바뀝니다:

a heading

하지만 이 요소는 여전히 누를 수 있고, 기본 탭 순서에 있으며, 버튼처럼 보이고, 눌렀을 때 연결된 동작도 실행됩니다. 그래서 버튼을 heading으로 바꾸는 것은 HTML5 적합성 오류입니다.

참고: 요소의 role을 바꿔도 role 자체에 동작, 속성, 상태가 더해지지는 않습니다. ARIA는 브라우저에서 보이거나 동작하는 방식을 바꾸지 않습니다. 예를 들어, 링크를 버튼처럼 동작하게 하려면 role=button만 추가하는 것으로는 부족하며, space 키 처리를 위한 키 이벤트 핸들러를 추가해야 합니다. 왜냐하면 기본 버튼은 enter키나 spacebar로도 활성화됩니다.

2.7 ARIA를 인라인에 추가할까, 스크립트로 추가할까?

ARIA 역할이나 aria-* 속성이 상호작용 동작을 위해 스크립트에 의존하지 않는다면, 인라인으로 추가해도 안전합니다. 예를 들면, ARIA 랜드마크 역할이나 ARIA 라벨링 및 설명 속성은 인라인으로 추가해도 문제 없습니다.

콘텐츠 및 상호작용이 스크립트 사용 환경에서만 지원된다면(예. Google 문서 등은 JavaScript가 켜져야 동작), ARIA 마크업을 인라인으로 써도 안전합니다. (JavaScript 미사용 시 누구에게도 동작하지 않으므로)

그 외의 경우에는, ARIA를 스크립트로 삽입·변경·제거하세요. 예를 들어, 트리 위젯의 닫힌 섹션은 이렇고:

<li role=treeitem aria-expanded=false ...

이 섹션을 사용자가 열면 자바스크립트로 아래처럼 바꿀 수 있습니다:

<li role=treeitem aria-expanded=true ...

2.8 ARIA 유효성 검사

가장 쉬운 방법은 HTML5 DOCTYPEARIA 마크업을 함께 사용하고, W3C Nu Markup Checker로 검사하는 것입니다. ARIA는 다른 DOCTYPE과도 잘 동작하지만, 유효성 검사 도구가 ARIA 마크업을 만나면 오류를 출력할 수 있습니다. 관련 DTD가 ARIA 마크업을 인식하지 않으며 앞으로도 업데이트될 가능성은 낮기 때문입니다.

HTML5 이전 버전의 유효성 검사 오류는 ARIA가 실질적인 접근성 문제를 만든다는 의미가 아니며, 사용자 경험이 나빠진다는 뜻도 아닙니다. 단지 구식 자동 검사기가 ARIA 접근성 주석을 인식하지 못해서 발생합니다.

참고: W3C Nu Markup CheckerARIA 체크는 개발 중이므로 100% 신뢰할 수는 없습니다(그래도 매우 좋은 편!). 만약 ARIA 명세나 HTML 명세의 적합성 규정과 상충되는 검사 결과를 보이면, 이슈를 제출하는 것이 권장됩니다.

2.9 role=presentation 또는 role=none 사용하기

role=presentation 또는 동의어 role=none은 해당 요소의 의미를 제거합니다.

예를 들어, HTML 트리에서 이 코드는:

<h1 role="presentation">text</h1>

접근성 트리에서 이렇게 됩니다:

text, no heading

즉, 의미 없는 텍스트로만 접근성 트리에 나타납니다.

필수 자식요소가 없는 요소의 경우, role=presentation/none이 붙은 요소 안의 다른 요소들은 고유 의미를 그대로 가집니다.

예를 들어, HTML 트리에서 이런 코드는:

<h1 role="presentation"><abbr>API</abbr></h1>

접근성 트리에서 이렇게 됩니다:

abbr with text of API

필수 자식 요소(예: ul 또는 table)가 있는 요소에 role=presentation/none을 적용하면 내부의 필수 자식 요소 역시 의미가 제거됩니다.

예를 들어, HTML 트리에서 이런 코드는:

<table role="presentation">
  <tr>
    <td>
      <abbr>API</abbr>
    </td>
  </tr>
</table>

접근성 트리에서 이렇게 됩니다:

abbr with text of API

참고: role=presentation/none이 적용된 요소의 필수 자식 요소가 아닌 기타 자식 요소는 고유 의미가 유지됩니다. 필수 자식이 있는 요소(중첩 리스트, 중첩 테이블 등)도 포함됩니다.

다음과 같이 테이블 안에 또 다른 테이블을 중첩한 경우, HTML 트리에서는:

<table>
 <tr>
  <td>
    <table>
     <tr>
      <td>
       <abbr>API</abbr>
      </td>
     </tr>
    </table>
  </td>
 </tr>
</table>

접근성 트리에서는 이렇게 됩니다:

outer ttable with 1 row and 1 cell containg another table with 1 row and 1 cell containing an abbr element.

외부 table 요소에 role=presentation/none을 추가하면, HTML 트리에서 다음 코드는:

<table role="presentation">
 <tr>
  <td>
    <table>
     <tr>
      <td>
       <abbr>API</abbr>
      </td>
     </tr>
    </table>
  </td>
 </tr>
</table>

접근성 트리에서는 이렇게 되고, 외부 table과 그 필수 자식(trtd)의 의미가 role=presentation/none 때문에 사라집니다:

table with 1 row and 1 cell containing an abbr element

role=presentation/none 사용 예시

잘못된 테이블 구조 고칠 때 사용 예시

<div aria-readonly="true" role="grid">
    <table role="presentation">
    <tbody><tr role="row">
    <th role="columnheader">Dog Names</th>
    <th role="columnheader">Cat Names</th>
    <th role="columnheader">Cow names</th>
    </tr>
    </tbody></table>
    <table role="none">
    <tbody><tr role="row">
    <td role="gridcell">Fido</td>
    <td role="gridcell">Whiskers</td>
    <td role="gridcell">Clarabella</td>
    </tr>
    <tr role="row">
    <td role="gridcell">Woofie</td>
    <td role="gridcell">Claws</td>
    <td role="gridcell">Glenn</td>
    </tr>
    </tbody></table>
    </div>

2.10 실무 지원: aria-label, aria-labelledby 및 aria-describedby

현재 시점에서 요약은 다음과 같습니다:

위 내용은 모두 iframe 요소에서도 동일하게 동작합니다. aria-labelaria-labelledby는 스크린 리더, 접근성 API에서 같은 방식으로 처리되지만, aria-label은 참조할 수 있는 가시적 텍스트가 없거나 id를 관리하기 너무 어려울 때에만 사용하는 것이 좋습니다.

Internet Explorer에서의 aria-labelledby, aria-label, aria-describedby 사용 참고사항

Internet Explorer에서 aria-labelledby에 여러 id를 지정하거나 aria-describedby에 하나 또는 여러 id를 지정할 때, 참조된 요소는 반드시 Microsoft가 정의한 접근 가능한 HTML 요소여야 합니다.

aria-labelledby를 여러 번 참조하는 경우, tabindex=-1이 추가된 span 사용 예시. 자세한 내용은 Making Non accessible Elements Accessible 참조.

<label id="l1" for="f3">label text</label>

<input type="text" id="f3" aria-labelledby="l1 l2" >

<p>other content</p>

<span tabindex="-1" id="l2" >more label text</span>

또한, ARIA 역할이 부여된 요소는 Internet Explorer에서도 접근 가능한 HTML 요소로 처리됩니다. 예:

<div aria-describedby="test">text</div>

<div id="test" role="tooltip" >tooltip text</div>

숨김 컨텐츠는 접근 가능한 이름/설명 계산에 영향을 주지 않음

의도적으로 aria-labelledby 또는 aria-describedby가 참조하는 요소에 CSS display:none이나 visibility:hidden, 또는 HTML hidden 속성을 써도 이름/설명 제공에는 영향이 없습니다.

기본적으로 보조기술은 숨겨진 정보를 전달하지 않지만, 작성자는 aria-labelledbyaria-describedby를 사용해 숨겨진 텍스트를 접근 가능한 이름이나 접근 가능한 설명의 일부로 명시적으로 포함시킬 수 있습니다.

아래 예시에서 설명은 두 상태 모두에서 보조기술 사용자에게 제공됩니다:

오류 없음 상태: 메시지 시각적으로 숨김


<label>Name <input type="text"  aria-describedby="error-message"></label>
<span id="error-message" style="display:none">
You have provided an incorrect name</span>

참고: 참조된 요소에 aria-hidden=true을 추가해도 차이 없음:

<span id="error-message" style="display:none" aria-hidden="true">
 You have provided an incorrect name</span>

오류 상태: 메시지 가시화

<span id="error-message" style="display:inline">
You have provided an incorrect name</span>

상황별 텍스트(오류 등) 제공 방법

오류 메시지 등 상황에 맞는 텍스트를 연결하려면 다음 방법을 쓸 수 있습니다:

2.10.1 접근 가능한 이름이 배경 이미지에 미치는 영향

CSS 배경으로 정보성 이미지를 표현하는 것은 피하세요. 중요한 정보가 있다면 HTML <img> 태그의 alt 속성에 제공하세요. CSS 명세에서는 다음과 같이 안내합니다:

접근성 측면에서, 중요한 정보를 전달하는 수단으로 배경 이미지만 사용하는 것은 권장하지 않습니다. 관련 자료: WCAG failure #F3 [WCAG20] . 이미지는 비그래픽 환경에서 인식되지 않고, 배경 이미지는 고대비 모드 등에서 꺼질 수 있습니다. 출처 .

CSS 이미지 사용을 피할 수 없거나 '중요하지 않은' 분위기용 이미지 등에 대체 텍스트를 주고 싶으면?

CSS 명세에서 이런 배경 이미지를 피하라는 지침이 "권장"이지 "필수"가 아닌 이유는, 시각적 디자인이나 기존 코드 구조상 HTML 이미지로 변경이 어렵기 때문입니다. 또는 단순 장식/배경 이미지지만 화면 읽기 사용자가 어떤 이미지인지 알고 싶어할 수 있습니다. 관련 정리: 분위기 이미지, 장식, 정보성 이미지 구분

CSS 이미지에 대체 텍스트를 제공할 때 고려사항

<div>에 내용이 있으면 role="img"aria-label로 내부 내용이 가려지거나,접근 가능한 이름 계산에 따라 스크린리더가 aria-label을 무시할 수도 있습니다.

따라서 컨텐츠가 있는 <div>에 배경 이미지를 쓰지 마세요. 가장 좋은 방법은 빈 <span>role="img"aria-label을 사용하는 것입니다.

이렇게 하세요:

<div>
<span class="background-image" role="img" aria-label="[여기에 alt 텍스트 입력]"> </span>
[이외의 모든 콘텐츠]
</div>

이렇게 하지 마세요:

<div class="background-image" role="img" aria-label="blah blah blah">
[이외의 모든 콘텐츠]
</div>

<div>에 내용이 있는데 CSS 배경 이미지를 꼭 넣어야 할 때는?

CSS 구조의 의존성 등으로 디자인/레이아웃에 문제가 생기거나 모든 이해관계자 승인을 받아야 한다면, 어쩔 수 없이 배경 이미지를 내용 있는 <div>에 둘 상황이 생길 수 있습니다. 이때는 다음과 같은 우회책이 있습니다.

<div class="background-image" >
<span role="img" aria-label="[여기에 alt 텍스트 입력]"> </span>
[이외의 모든 콘텐츠]
</div>

이 방법은 형태상 실제 이미지를 가진 요소에 대체 텍스트가 있진 않으나, 스크린리더는 <div>는 무시하고 바로 뒤의 <span>을 읽어들이므로 마치 대체 텍스트가 같은 위치에 있는 것처럼 정보를 제공합니다.

2.11 ARIA role=application 사용하기

role="application"이 스크린 리더에 미치는 영향

오늘날 많은 인기 있는 스크린 리더에서는 사용자가 탐색 모드에 있을 때 대부분의 키 입력이 웹 페이지가 아니라 스크린 리더에 의해 포착됩니다. 이는 효율적인 페이지 탐색에 필수적입니다. 현재, application 모드가 설정되면 많은 스크린 리더가 키 입력의 가로채기를 멈추고 모든 키 입력을 브라우저에 직접 전달합니다. 이 경우 사용자는 페이지를 쉽게 탐색할 수 없게 됩니다. 예를 들어, 헤딩 단위로 점프하거나 정적 텍스트 단락을 한 줄씩 읽는 것이 어렵습니다. 하지만 application 역할을 설정해도 다르게 동작하지 않는 스크린 리더들도 있습니다.

언제 사용해야 하고, 언제 사용하지 않아야 하는가?

role=application을 사용할지 결정할 때는, 스크린 리더 단축키의 장점과 해당 기능 상실을 함께 고려해야 합니다. 일반적으로 사용하지 않는 것이 좋으며, 사용한다면 스크린 리더 사용자로 실제 사용성 테스트를 거쳐야 합니다.

표준 HTML 위젯만 포함된 컨트롤 집합에는 role="application"사용하지 않아야 합니다. 이는 마크업을 WAI-ARIA 역할로 구현해도 마찬가지입니다.

참고: 커스텀 텍스트 입력 위젯 개발은 권장하지 않습니다. 네이티브 입력을 사용하는 것이 거의 항상 더 좋습니다.

아래와 같은 동적이면서 비표준 위젯이더라도 application 역할을 사용하지 않습니다. 대부분의 스크린 리더와 보조 기술은 WAI-ARIA를 지원하며 이런 위젯에 대해 탐색 모드와 포커스 모드를 기본적으로 전환 지원합니다:

role=application은 오직 포커스 가능한 상호작용 컨트롤로만 이루어진 고급 위젯, 실제 데스크톱 앱을 에뮬레이션하는 경우에만 사용해야 합니다. 오늘날 웹앱이라지만 실상 대부분의 웹 콘텐츠는 여전히 문서 기반입니다.(예, 페이스북 글, 블로그, 트위터 피드, 동적 접힘 콘텐츠 등) 표면적으로만 데스크톱 앱처럼 보여도, 본질은 문서 콘텐츠임을 명심할 것.

포커스(폼) 모드에서도 위젯별 단축키 사용이 가능하기 때문에 role=application은 필요 없습니다. 예를 들어 ARIA role=listbox를 가진 커스텀 컨트롤은 사용자가 상호작용하는 동안 모든 입력(화살표키 등)을 직접 받을 수 있습니다.

요약: 실제로 role=application을 쓸 일은 매우 드뭅니다!

드물게 필요할 때 role=application은 어디에 넣어야 하나?

위젯의 가장 가까운 컨테이너에 지정합니다. 예시: 위젯 외부를 감싸는 div. 이 div 내부에 application 인터랙션 모델이 필요한 위젯만 있다면, 사용자가 이 부분에서 벗어나면 자동으로 포커스 모드가 해제됩니다.

페이지 전체가 위젯만 있는 경우에 한해서 body에 지정, 설명성(문서성) 콘텐츠가 있다면 해당 부분의 outermost 요소에 role=document 지정, tabindex=0으로 탭 진입도 가능하게 할 것. role=documentrole=application과 반대 역할.

경험적으로: 페이지의 90% 이상이 위젯일 경우에는 role=application이 적합할 가능성도 있으나, 반드시 실제 사용자 테스트로 두 가지 버전(사용/미사용)을 검증할 것!

절대로 body 등 넓은 범위에 role=application을 남용하지 마십시오. 페이지의 대부분이 링크 등 문서 구조이거나, 포커스 모드가 불필요한 경우 보조기술 사용자는 사이트를 이용하기 힘들어집니다.

role=application에 대한 추가 정보는 If you use the WAI-ARIA role "application", please do so wisely! 참고

2.12 커스텀 컨트롤 접근성 개발 체크리스트:

아래 설계 항목 및 체크리스트로 커스텀 컨트롤을 점검하세요. 하나라도 ‘No’가 있으면 출시 전 수정하거나, 접근성 지원이 제한되어 일부 사용자가 이용할 수 없다는 점을 문서화해야 합니다.

커스텀 컨트롤 설계 체크포인트
설계 항목 설명 예/아니오
focusable 키보드로 컨트롤에 접근 가능한가? 키보드 포커스 제공 참고
keyboard operable 키보드로 컨트롤을 사용할 수 있는가? 키보드 탐색 참고
touch operable 터치 제스처로(보조기술 활성화 상태에서도) 컨트롤을 사용할 수 있는가?
expected operation 컨트롤 유형에 맞는 표준 키( ARIA 위젯 디자인 패턴 참고 ) 또는 터치 동작으로 조작이 가능한가?
clear indication of focus 포커스가 갔을 때 명확히 표시되는가? 포커스 시각적 표시(Visible Focus) 참고 (WCAG2)
label 컨트롤에 텍스트 라벨이 있고 접근 가능한 이름으로 accessibility API에 노출되는가?
role 컨트롤에 적절한 역할이 접근성 API에 노출되는가?
states and properties UI 상태와 속성이 접근성 API에 노출되는가?
color contrast 라벨/설명/아이콘이 저시력자에게도 인식·사용 가능한가? (명암비 검사기 활용)
high contrast mode 고대비 모드(예, Windows HC mode)에서도 인식·사용 가능한가?

2.13 ARIA는 대부분의 HTML 요소의 기본 의미에 아무것도 추가하지 않음

참고

일부 경우에 HTML 요소의 의미는 ARIA 역할, 상태 또는 속성으로 표현될 수 있습니다. 이것을 그 요소의 '기본 암시적 ARIA 의미'라고 합니다.

HTML4에서 정의된 어떤 요소도 기본 의미를 노출하기 위해 ARIA 역할이 추가될 필요가 없습니다. ARIA 역할을 추가하는 것은 불필요한 작업일 뿐만 아니라, 오히려 문제를 일으킬 수 있습니다. HTML5에서 새로 정의된 기능들은 이제 대부분의 브라우저에서 기본 의미가 노출됩니다. HTML 명세에는 다음과 같은 내용이 있습니다:
대부분의 경우 ARIA role 및/또는 aria-* 속성이 기본 암시적 ARIA 의미와 일치하도록 설정하는 것은 불필요하며, 브라우저가 이미 해당 속성을 설정하므로 추천되지 않습니다.

2.13.1 중복된 ARIA의 예시

HTML5 권고안에 나오는 상호작용 요소에 기본 암시적 role을 추가하는 것은 시간 낭비입니다:

<button role="button">press me</button>   

네이티브 HTML 속성과 더불어 ARIA 상태나 속성 속성을 추가하는 것도 시간 낭비입니다:

<input type="text" required aria-required="true">

<div hidden aria-hidden="true">
오랫동안 구현되어 온 구조적 요소에 ARIA 역할, 속성, 상태를 추가하는 것도 시간 낭비입니다:
<h1 role="heading" aria-level="1">heading text</h1>

2.14 HTML에서 사용 불가능한 Aria 역할과 속성

아래는 ARIA의 역할과 속성 중 HTML에서 기본적으로 제공되지 않는 목록입니다. ARIA가 제공하는 많은 역할과 속성(사용자에게 정보를 전달할 수 있음)이 HTML에서는 제공되지 않음이 분명합니다.

2.14.1 ARIA 역할

  1. alert
  2. alertdialog
  3. application
  4. directory
  5. document
  6. feed
  7. grid
  8. gridcell
  9. group
  10. log
  11. marquee
  12. menu
  13. menubar
  14. menuitemcheckbox
  15. menuitemradio
  16. none
  17. note
  18. presentation
  19. scrollbar
  20. search
  21. status
  22. switch
  23. tab
  24. tablist
  25. tabpanel
  26. timer
  27. toolbar
  28. tooltip
  29. tree
  30. treegrid
  31. treeitem

2.14.2 ARIA 상태 및 속성(aria-* 속성)

  1. aria-activedescendant
  2. aria-atomic
  3. aria-busy (state)
  4. aria-controls
  5. aria-describedby
  6. aria-dropeffect
  7. aria-expanded (state)
  8. aria-flowto
  9. aria-grabbed (state)
  10. aria-haspopup
  11. aria-hidden (state)
  12. aria-label
  13. aria-labelledby
  14. aria-level
  15. aria-live
  16. aria-orientation
  17. aria-owns
  18. aria-posinset
  19. aria-pressed (state)
  20. aria-relevant
  21. aria-setsize
  22. aria-sort

2.15 ARIA 디자인 패턴 및 터치 기기 지원

경고

ARIA 디자인 패턴WAI-ARIA Authoring Practices 1.1에 있으며, 키보드만 사용하는 사용자와 보조기술 사용자 모두에게 이해 가능하도록 커스텀 UI 요소를 구현하는 방법을 설명합니다. 일부 ARIA 디자인 패턴은 현재 키보드 전용 이벤트 처리에 의존하며, 이는 터치 스크린만 있는 디바이스에서는 지원되지 않거나 운영체제에 따라 지원이 제한될 수 있습니다. 작성 중이며, ARIA 디자인 패턴 - 터치 UA/AT 격차 분석(Google sheet) 참고(또한 ODS 정적 파일로 제공됨). 관련 WAI-ARIA Authoring Practices 1.1 이슈

2.16 권장 사항 표

HTML에서 ARIA 속성 사용을 위한 문서 적합성 요구사항 테이블을 ARIA in HTML 명세에서 참고하세요.

2.17 ARIA 역할, 상태, 속성 빠른 참조

허용된 ARIA 역할, 상태, 속성 테이블을 ARIA in HTML 명세에서 참고하세요.