안녕하세요. 멀더끙입니다.
(주)콘텐츠연합플랫폼 퍼블리셔
훗.. 그 정도는 압니다
그건 또 뭔가요!!???
"권고"라굽쇼?
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
Role | Description |
---|---|
application | 웹 응용 프로그램 영역 |
banner | site-oriented 컨텐츠가 포함 된 영역 (site-oriented contents: 로고 또는 사이트 스폰서의 정체성 및 사이트 특정 검색 도구 같은 것) |
complementary | 문서의 독립적이고 부가적인 컨텐츠 영역 HTML5의 aside 요소에 대응 |
contentinfo | 문서의 정보를 포함하는 큰 인지 영역 (예 : 저작권 및 개인 정보 보호 정책에 대한 링크 등을 포함하는 영역) |
form | 폼 전송 영역 |
main | 문서의 메인 컨텐츠 (페이지 내 단 한 번만 선언) |
navigation | 내비게이션 영역 |
search | 검색 영역 |
지금 바로 적용이 가능하다
사용자가 랜드마크 탐색을 통해 컨텐츠에 접근이 용이하다.
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
상태는 요소의 상태를 나타내므로 자주 바뀌는 반면, 속성은 상대적으로 바뀌는 경우가 드물다
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
객체를 설명하는 요소의 ID를 설정
<input type="text" name="usrID" id="usrID" />
<span class="guide">* 아이디는 6 ~ 15자 이내의 영문,숫자로 작성해주세요</span>
<input type="text" name="usrId" id="usrId" aria-describedby="usrIdGuide" />
<span id="usrIdGuide" class="guide">* 아이디는 6 ~ 15자 이내의 영문,숫자로 작성해주세요</span>
Example Page
중요한 메시지나 일시적으로 보여지는 정보를 제공
<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
펼치거나 닫을 수 있는 상태 표현
<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는 아직 완전히 지원되지는 않는다.
그러나 잘 지원되는 것들도 있다.
써먹을 수 있는 건 써먹어보자.
어렵다고 모른다고 버리지 말고
간단한 것부터 차근차근