a11y

- WAI-ARIA

발표자 소개

안녕하세요. 멀더끙입니다.

(주)콘텐츠연합플랫폼 퍼블리셔

웹 접근성 아시죠?

훗.. 그 정도는 압니다

ARIA 적용해주세요~

그건 또 뭔가요!!???

WAI-ARIA
Web Accessibility Initiative
- Accessible Rich Internet Applications
RIA를 위한 접근성 권고안

"권고"라굽쇼?

WAI-ARIA 란?

defines a way to make Web content and Web applications more accessible to people with disabilities.
It especially helps with dynamic content and advanced user interface controls developed with Ajax, HTML, JavaScript, and related technologies
W3C - WAI-ARIA Overview

WAI-ARIA의 3 요소

역할 (Role)
요소에 "역할(role)" 을 부여
속성 (properties)
해당 요소가 가지고 있는 속성(Properties)을 정의
상태 (state)
해당 요소가 현재 어떤 상태인지를 정의

역할 (Role)

Categorization of Roles

Abstract Roles
Roles의 분류체계를 만들고 역할들을 정의하기 위한 Role
Widget Roles
독립형 UI를 동작시키기 위한 목적의 Roles
Document Structure Roles
문서구조를 설명하는 목적의 Roles
Landmark Roles
각 영역을 명확하게 구분할 수 있도록 책갈피를 달아놓는 목적의 Roles.
Landmark Roles
Role Description
application 웹 응용 프로그램 영역
banner site-oriented 컨텐츠가 포함 된 영역
(site-oriented contents: 로고 또는 사이트 스폰서의 정체성 및 사이트 특정 검색 도구 같은 것)
complementary 문서의 독립적이고 부가적인 컨텐츠 영역
HTML5의 aside 요소에 대응
contentinfo 문서의 정보를 포함하는 큰 인지 영역
(예 : 저작권 및 개인 정보 보호 정책에 대한 링크 등을 포함하는 영역)
form 폼 전송 영역
main 문서의 메인 컨텐츠 (페이지 내 단 한 번만 선언)
navigation 내비게이션 영역
search 검색 영역

지금 바로 적용이 가능하다

웹페이지 예제 목업
웹페이지 예제 목업- landmark 추가

적용하면 좋은게 있나?

사용자가 랜드마크 탐색을 통해 컨텐츠에 접근이 용이하다.

Screen Reader User Survey - WebAIMIn October 2009
How often do you navigate by landmarks/regions in your screen reader?
Response % of Respondents
Whenever they are present 25.5%
Often 18.3%
Sometimes 28.0%
Seldom 15.1%
Never 13.1%
<div id="header" role="banner">
	<h1>pooq</h1>
	<div id="mainNav" role="navigation">
		<span>메인 메뉴</span>
		<ul>
			<li><a href="#">실시간TV</a></li>
			<li><a href="#">방송 VOD</a></li>
			.....
	</div>
	<form action="" role="search">
		<input type="text" name="keyword" id="keyword" />
		<button type="submit">검색</button>
	</form>
</div>
<div id="contents" role="main">
	<h2>방송 VOD 컨텐츠</h2>
	.....
</div>
<div id="recNotice" role="complementary">
	<h2>공지사항</h2>
	<a href="#">1월 27일 서비스 정기점검 공지</a>
</div>
<div id="footer" role="contentinfo">
	<h2>회사소개 및 이용 정보</h2>
	<ul>
		<li><a href="#">회사소개</a></li>
		<li><a href="#">이용약관</a></li>
		....
</div>
Example Page
정말 쉽죠?

속성 (Properties) & 상태 (State)

상태는 요소의 상태를 나타내므로 자주 바뀌는 반면, 속성은 상대적으로 바뀌는 경우가 드물다

Taxonomy of States & Properties

Widget Attributes
widget role 속성 값을 가진 요소의 특성을 기술하는 데 사용되는 속성
Live Region Attributes
포커스의 이동없이 위젯이나 애플리케이션의 내용 변화나 진행 상태를 나타내기 위해 사용되는 속성
Drag-and-Drop Attributes
드래그앤드롭 기능을 가지는 엘리먼트에 대한 속성
Relationship Attributes
엘리먼트들의 관계가 문서 구조상 직접적으로 나타나 있지 않는 경우 이에 대한 정보를 설정하는 데 사용되는 속성

Live Region Attributes

Live Region Attributes
attribute descript values
aria-atomic aria-live 속성이 사용된 엘리먼트의 하위 DOM이 갱신됐을 때 갱신된 부분만 알려줄 것인지, 전체를 알려줄 것인지 설정 true : 전체 알림
false (default) : 갱신된 부분만 알림
aria-busy (state) 업데이트가 진행 중인지 여부를 표현 true : 진행 중
false (default) : 진행 종료
aria-live 업데이트된 엘리먼트를 사용자에게 알려주는 방법을 설정 off (default) : 알리지 않음
polite : 사용자의 인터랙션이 끊기거나 종료되었을 때 알림
assertive : 업데이트 즉시 알림
aria-relevant 요소의 추가, 삭제 및 문자열의 추가가 발생하는 경우 각각에 대한 통보여부를 설정 additions : 노드 추가 알림
removals : 노드 삭제 알림
text : 텍스트 추가 알림
all : 노드 추가/삭제 텍스트 추가 알림
default : additions text
<ul aria-live="polite" aria-relevant="all" aria-atomic="false">
	<li>...</li>
	<li>...</li>
	<li>...</li>
</ul>
Example Page

제법 유용한 ARIA Examples

aria-describedby

객체를 설명하는 요소의 ID를 설정

AS - IS

<input type="text" name="usrID" id="usrID" />
<span class="guide">* 아이디는 6 ~ 15자 이내의 영문,숫자로 작성해주세요</span>

TO - BE

<input type="text" name="usrId" id="usrId" aria-describedby="usrIdGuide" />
<span id="usrIdGuide" class="guide">* 아이디는 6 ~ 15자 이내의 영문,숫자로 작성해주세요</span>
Example Page

role="alert"

중요한 메시지나 일시적으로 보여지는 정보를 제공

<input type="password" name="usrPwd" id="usrPwd" aria-describedby="tooltip" />
<span id="tooltip" class="guide">6~12자 이내로 영문, 숫자를 혼합하여 사용</span>
<span id="pwdFeedback" class="feedback" role="alert">유효하지 않은 비밀번호 입니다.</span>
$('#usrPwd').on('change', function(){
		var val = this.value.trim(),
			regExp = new RegExp(/(?=.{0,9}[0-9])(?=.{0,9}[a-z])([0-9a-zA-Z]{6,12})/);
		$('#pwdFeedback').remove();
		if(val !== '' && !regExp.test(val)){
			$('<span id="pwdFeedback" class="feedback" role="alert">유효하지 않은 비밀번호 입니다.</span>')
				.insertAfter('#tooltip');
			this.focus()
		}
});
Example Page

aria-expanded

펼치거나 닫을 수 있는 상태 표현

<div class="terms">
	<h2 id="privTermLbl">개인정보 취급 방침</h2>
	<button type="button" aria-expanded="false" aria-controls="privTerm" class="btn-toggle">펼쳐보기</button>
	<blockquote id="privTerm"  aria-labelledby="privTermLbl" tabindex="0">
		...
	</blockquote>
</div>
<div class="terms">
	<h2 id="serviceTermLbl">서비스 이용약관</h2>
	<button type="button" aria-expanded="false" aria-controls="serviceTerm" class="btn-toggle">펼쳐보기</button>
	<blockquote id="serviceTerm"  aria-labelledby="serviceTermLbl" tabindex="0">
		...
	</blockquote>
</div>
if($targetElem.is(':visible')){
	$targetElem.slideUp(200);
	$(this).text('펼쳐보기').attr('aria-expanded', 'false')
}else{
	$targetElem.slideDown(200);
	$(this).text('접어두기').attr('aria-expanded', 'true')
}
Example Page

마치며...

WAI-ARIA는 아직 완전히 지원되지는 않는다.

그러나 잘 지원되는 것들도 있다.

써먹을 수 있는 건 써먹어보자.

어렵다고 모른다고 버리지 말고

간단한 것부터 차근차근


끝~~~