접근가능한 리치 인터넷 어플리케이션 (Accessible Rich Internet Application, ARIA)
장애를 가진 사용자가 웹 콘텐츠와 웹 어플리케이션에 더 쉽게 접근할 수 있는 방법을 정의하는 여러 특성
특히 JavaScript를 사용하여 개발한 웹 어플리케이션에 해당함
HTML을 보충함
일반적으로 보조 기술이 알 수 없는 상호작용을 제공
흔히 쓰이는 어플리케이션 위젯에 필요한 정보를 제공
예시
주의 사항
ARIA 지원 수준은 다음마다 제각기 다르다.
ARIA 기술에 의존하는 사용자 일부가, 컴퓨터 브라우저 상호작용 기능을 잃을까 두려워 소프트웨어 업그레이드를 주저할 수 있음...
HTML4는, JavaScript와 CSS, HTML을 이용하여 만든 여러가지 동적 콘텐츠가 어떤 기능을 하는지 설명을 제공하지 않았다...
<div>
, <span>
같은 것으로 개발하게 되었고...그로 인해 동적 콘텐츠를 보조공학기술(AT)로 인식하지 못하는 경우가 많았다.
따라서 스크린을 보지 못하는, 스크린 리더기를 사용하는 사람들에게 해당 콘텐츠를 파악하기 어려웠다.
<ol>
<li id="ch1Tab">
<a href="#ch1Panel">Chapter 1</a>
</li>
<li id="ch2Tab">
<a href="#ch2Panel">Chapter 2</a>
</li>
<li id="quizTab">
<a href="#quizPanel">Quiz</a>
</li>
</ol>
<div>
<div id="ch1Panel">Chapter 1 content goes here</div>
<div id="ch2Panel">Chapter 2 content goes here</div>
<div id="quizPanel">Quiz content goes here</div>
</div>
따라서...
(2-2)의 예제와는 다르게 ARIA를 사용한 경우엔, 스크린리더 같은 보조기기에 필요한 정보들을 제공할 수 있다!
동작상태 state
, 역할 role
에 대한 설명을 제공함
<!-- Now *these* are Tabs! -->
<!-- We've added role attributes to describe the tab list and each tab. -->
<ol role="tablist">
<li id="ch1Tab" role="tab">
<a href="#ch1Panel">Chapter 1</a>
</li>
<li id="ch2Tab" role="tab">
<a href="#ch2Panel">Chapter 2</a>
</li>
<li id="quizTab" role="tab">
<a href="#quizPanel">Quiz</a>
</li>
</ol>
<div>
<!-- Notice the role and aria-labelledby attributes we've added to describe these panels. -->
<div id="ch1Panel" role="”tabpanel”" aria-labelledby="ch1Tab">
Chapter 1 content goes here
</div>
<div id="ch2Panel" role="”tabpanel”" aria-labelledby="ch2Tab">
Chapter 2 content goes here
</div>
<div id="quizPanel" role="”tabpanel”" aria-labelledby="quizTab">
Quiz content goes here
</div>
</div>
role="button"
<button>
을 사용해야 하는 요소에...<a>
, <i>
, <span>
를 사용해야 하는 경우?!<!-- 아래 같이 해야하지만... -->
<button></button>
<input type="button" />
<!-- 안된다면 이거 처럼이라도!! -->
<a role="button"></a>
위와 같이 role="button"
를 사용하자!
하지만 <button>
태그는 enter, space 키에 대해 click
이벤트가 적용되지만...
role="button"
은 따로 설정해 주어야만함...aria-pressed
<button>
에는 ara-pressed
를 적용해라!aria-pressed="true"
: 버튼 눌림aria-pressed="false"
: 버튼 안눌림<!-- 선택됨 -->
<a role="button" aria-pressed="true"></a>
<!-- 선택안됨 -->
<a role="button" aria-pressed="false"></a>
role="switch"
와 aria-checked="true"
on/off 스위치 형태의 상호 작용을 식별함
브라우저 및 스크린리더 지원에 차이가 있을 수 있어서, 테스트가 필요함!
<button
type="button"
role="switch"
aria-checked="true"
id="speakerPower"
class="switch"
>
<span>off</span>
<span>on</span>
</button>
<label for="speakerPower" class="switch">Speaker power</label>
role="alert"
form
요소의 입력값에 대한 에러 메시지처럼, 경고 역할을 하는 요소에게 role="alert"
사용
사용자가 즉각적으로 알아야 하는 정보가 있으면 aria-live="assertive"
를 같이 사용
텍스트가 동적으로 들어가면 aria-atomic
속성을 함께 사용해야함
<!-- 아이디 또는 비밀번호가 틀린 경우...-->
<p role="alert" style="display:none">
아이디 또는 비밀번호가 일치하지 않습니다...
</p>
aria-expanded
버튼을 클릭하여 특정 영역을 확장하고 축소하는 UI에 aria-expanded
사용
스크린 리더 사용자에게 버튼을 클릭하여 내용이 아래로 확장되거나 축소될 수 있음을 알릴 수 있다!
aria-expanded = "false"
: 내용이 축소된 상태
aria-expanded = "ture"
: 내용이 확장된 상태
aria-haspopup
다른 요소 위에 겹쳐나오는 하위 메뉴를 제어하는 버튼에 aria-haspopup
사용
사용자에게 해당 요소가 하위메뉴를 포함하고 있다(팝업될 수 있다)는 정보를 제공함.
aria-haspopup = "false"
: 요소에 팝업이 없음aria-haspopup = "true"
: 팝업이 있는 메뉴버튼임<button
type="button"
aria-haspopup="true"
aria-controls="menu"
aria-expanded="true"
>
메뉴
</button>
<nav id="menu">
<ul aria-label="점심메뉴">
<li><a href="#">item1</a></li>
<li><a href="#">item2</a></li>
...
<li><a href="#">item3</a></li>
</ul>
</nav>