접근성 좋은 IT 서비스는 현실 세계를 보다 더 자유롭게 누릴 수 있도록 한다.
<element role="tablist"> ✨
<element role="tab"> ✨
<element role="tabpanel"> ✨
<element role="tooltip"> ✨
<element role="status"> ✨
<element role="alert"> ✨
<element role="alertdialog"> == <dialog>
<element role="dialog"> == <dialog>
<element role="navigation"> == <nav>
<element role="complementary"> == <aside>
<element role="none"> == <div>
nav > h2 + ul
또는 aside > h2 + ul
구조로 마크업<div class="weekly">
<div role="tablist">
<button id="mon-anchor" aria-controls="mon" role="tab" aria-selected="true">월</button>
<button id="tue-anchor" aria-controls="tue" role="tab" >화</button>
</div>
<div id="mon" tabindex="0" role="tabpanel" aria-labelledby="mon-anchor">
월요일 컨텐츠
</div>
<div id="tue" tabindex="0" role="tabpanel" aria-labelledby="tue-anchor">
화요일 컨텐츠
</div>
</div>
"ID reference list"
여러개의 아이디 값 목록을 공백으로 분리해서 연결
<!-- O: 인풋 툴팁 -->
<label for="tel">전화번호</label>
<input id="tel" type="tel" aria-describedby="TIP-TEL">
<p id="TIP-TEL" role="tooltip" hidden>하이픈(-) 없이 숫자만 입력.</p>
<!-- O: 버튼 퉅립 -->
<button aria-describedby="TIP-DEL">게시물 삭제</button>
<p id="TIP-DEL" role="tooltip" hidden>게시물 삭제 후 복원할 수 없음</p>
aria-live="polite"
, aria-atomic="true"
속성이 할당됨aria-live="polite"
보조기기는 현재 전달하는 음성이나 내용을 중단하지않고 기다렸다가 그 음성 낭독이 끝나면 현재 설명하려고하는 내용을 음성으로 전달
aria-atomic="true"
내용이 갱신되었을 때 부분적으로 갱신되었다하더라도 atomic="true" 영역 전체를 다시 읽어줌
<output>
요소 사용 가능<!-- O: 결과 메시지 -->
<p role="status">회원가입 양식 전송완료.</p>
<p role="status">10개의 검색 결과.</p>
<p role="status">장바구니에 5개의 항목</p>
<output>회원가입 양식 전송완료.</output>
<output>10개의 검색 결과.</output>
<output>장바구니에 5개의 항목.</output>
aira-live="assertive"
속성과 aria-atomic="true"
속성 자동 할당aria-live="asertive""
굉장히 긴급한 메시지기에 현재 진행중이던 과업, 음성 낭독을 중단하고 그 즉시 오류 내용을 사용자에게 알림
<!-- O: 오류 메시지 -->
<p role="alert">우편번호 입력 오류.</p>
<!-- O: 제안 메시지 -->
<p role="alert">로그인 후, 이용 가능.</p>
<element aria-current="">
<!-- value: page|step|location|date|time|true|false(default) -->
<element aria-selected="">
<!-- value: true|false|undefined(default) -->
<element aria-haspopup="">
<!-- value: true|menu|dialog|listbox|tree|grid|false(default)-->
<element aria-expanded="">
<!-- value: true|false|undefined(default) -->
<element aria-hidden="">
<!-- value: true|false|undefined(default) -->
<element aria-invalid="">
<!-- value: true|false(default)|grammar|spelling -->
value
page | step | location | date | time | true | false(default)
현재 맥락과 일치하는 항목을 의미 (보통 a, button에 사용)
<!-- O: 현재 페이지 링크 -->
<nav>
<h2>글로벌 네비게이션</h2>
<ul>
<li><a href="/home" aria-current="page">홈</a></li>
<li><a href="/">연재</a></li>
<li><a href="/">랭킹</a></li>
</ul>
</nav>
<!-- O: 현재 단계 링크 -->
<nav>
<h2>회원 가입</h2>
<ol>
<li><a href="/accept-terms" aria-current="step">약관 동의</a></li>
<li><a href="/id-password">아이디/비밀번호 생성</a></li>
<li><a href="/email-authentication">이메일 인증</a></li>
</ol>
</nav>
value
true | false | undefined(default)
단일 또는 다중 선택이 가능한 요소(role="gridcell|option|row|tab")
에 선택 상태를 명시하는 의미
role="tab"
요소에 가장 흔히 사용
키보드 포커스를 받을 수 있는 요소(a, button)에 적용
<!-- O: role="tab" 요소에 선택 상태를 명시 -->
<div role="tablist">
<a id="mon-anchor" href="#mon" role="tab" aria-selected="true">월</a>
<a id="tue-anchor" href="#tue" role="tab" aria-selected="false">화</a>
</div>
[aria-selected="true"] {
...
}
value
true | menu | dialog | listbox | tree | grid | false(default)
보통 a, button 요소에 사용
요소에 연결되어 있는 팝업(메뉴, 대화상자 등) 정보를 제공
팝업 유형은 menu, list, tree, grid, dialog 으로 제한
일반적으로 menu와 dialog 유형이 빈번
<!-- O: aria-haspopup="menu|true" -->
<button type="button" id="menu-button" aria-haspopup="menu" aria-control="menu-list" aria-expanded="false">메뉴</button>
<ul id="menu-list" role="menu" aria-labelledby="menu-button" hidden>
<li><a href="/compoleted">완결</a></li>
</ul>
<!-- O: aria-haspopup="dialog" -->
<a href="#login-dialog" aria-haspopup="dialog">로그인</a>
<section id="login-dialog" role="dialog" aria-labelledby="login-heading" aria-modal="true" hidden>
<h2 id="login-heading">로그인</h2>
...
</section>
value
true | false | undefined(default)
제어 대상의 확장 또는 축소 상태
보통 a, button 요소에 사용
aria-controls 속성을 이용하여 제어 대상을 명시
툴팁(role="tooltip"), 알럿(role="alert"), 알럿 대화상자(role="alertdialog"), 대화상자(role="dialog")와 같이 동적으로 표시 상태를 결정(토글)하는 요소에 사용
<!-- O: 아코디언 -->
<dt>
<button type="button" aria-controls="anwer-99" aria-expanded="false">보너스 코인은 언제 소진되나</button>
</dt>
<dd id="answer-99" hidden>
<p>만료기한이 짧은 보너스 코인이 일반 코인보다 먼저 소진된다.</p>
</dd>
<!-- O: 팝업 -->
<a id="popular-btn" href="#popular" aria-haspopup="menu" aria-expanded="false">인기</a>
<ul id="popular" role="menu" aria-labelledby="popular-btn" hidden>
<li><a href="#romance">로맨스</a></li>
</ul>
value
true | false | undefined(default)
접근성 API(보조기기 접근 가능성) 차단 상태를 결정
예를 들면 모달 대화상자를 화면에 표시할 때 모달 대화상자 뒤 본문 콘텐츠에 aria-hidden="true" 속성을 선언하면 보조기기가 무시.
<!-- O: 모달 윈도우를 표시할 때 다른 요소를 차단 -->
<body>
<div class="container" aria-hidden="true">
// 보조기기가 무시하는 영역
</div>
<div role="alertdialog" aria-modal="true" aria-labelledby="TITLE" aria-describedby="DESCRIPTION">
<h2 id="TITLE">레진패스 안내</h2>
<p id="DESCRIPTION">이 작품의 유료 에피소드 열람 시 자동으로 구매합니다. 레진패스를 적용하시겠습니까?</p>
<button type="button">레진패스 적용</button>
<button type="button">취소</button>
</div>
</body>
value
true | false(default) | grammar | spelling
주로 <input>
요소에 선언
사용자가 입력한 값이 요구하는 형식과 일치하는지 여부를 나타낸다.
aria-errormessage
속성과 함꼐 사용하여 오류 설명을 제공
<!-- O: 입력 값이 유효하면 aria-invalid 속성을 생략 -->
<!-- O: 입력 값이 오류이면 aria-invalid="true" 속성을 선언 -->
<label for="email">이메일</label>
<input id="email" type="email" required value="..." aria-invalid="true" aria-errormessage="email-error-msg">
<p id="email-error-msg" aria-role="alert">이메일 형식이 유효하지 않음. 앳(@)과 마침표(.)를 포함해 주세요.</p>
<element aria-controls="ID refernce list"> ✨
<element aria-live="polite|assertive|off(default)"> ✨
<element aria-labelledby="ID refernce list"> ✨
<element aria-label="string">
<element aria-describedby="ID refernce list">
<element aria-errormessage="ID refernce list"> ✨
<element aria-modal="true|false(default)"> ✨
role="tab"
, aria-haspopup
, aria-expanded
속성과 함꼐 a, button 요소가 무엇을 제어하는지 명시<!-- O: role="tab" 요소에 aria-controls 속성 사용 -->
<button type="button" id="mon-anchor" aria-controls="mon" role="tab" aria-selected="true">월</button>
<!-- O: aria-haspopup 속성과 함께 aria-controls 속성 사용 -->
<button type="button" aria-haspopup="dailog" aria-controls="login-dialog">로그인</button>
<!-- O: aria-expanded 속성과 함께 aria-controls 속성 사용 -->
<button type="button" aria-controls="answer-99" aria-expanded="false">보너스 코인은 언제 소진되나요?</button>
value
polite | assertive | off(default)
실시간으로 내용을 갱신하는 영역
갱신 영역에 polite, assertive값을 사용하면 갱신 순간 보조 기기가 사용자에게 내용을 전달
aria-label
속성과 함계 선언하는 경우, aria-labelledby
속성이 우선순위가 높음aria-label
보다는 aria-labelledby
쓰는것을 권장aria-label
은 화면에 설명 텍스트를 노출하는 방식이 아니기 때문<label>
를 이용해 <input>
에 설명을 제공하는것과 같은 역할이라 보면됨<!-- O: 헤딩 설명 참조 모범사례 👏 -->
<section aria-labelledby="LZ-PATH" hidden>
<h2 id="LZ-PATH">레진패스란?</h2>
<p>이 작품의 유료 에피소드 열람시 자동으로 구매함</p>
</section>
<!-- O: 링크 설명 참조 -->
<a id="LZ-PATH" href="#LZ-PATH-TEXT">레진패스란?</a>
<div id="LZ-PATH-TEXT" aria-labelledby="LZ-PATH" hidden>
<p>이 작품의 유료 에피소드 열람시 자동으로 구매함</p>
</div>
<!-- O: 참조할 설명이 없는 경우 -->
<form>
<input type="search" aria-label="웹툰 검색">
<button> 검색 </button>
</form>
<!-- O: 버튼 요소에 상세한 설명 제공 -->
<button aria-describedby="TIP-DEL">게시물 삭제</button>
<p id="TIP-DEL" role="tooltip" hidden>게시물 삭제 후 복원할 수 없음</p>
<!-- O: 알럿 대화상자 요소에 상세한 설명 제공 -->
<div role="alertdialog" aria-modal="true" aria-labelledby="TITLE" aria-describedby="DESCRIPTION">
<h2 id="TITLE">레진패스 안내</h2>
<p id="DESCRIPTION">이 작품의 유료 에피소드 열람시 자동으로 구매합니다 레진패스를 적용하시겠습니까?</p>
<button type="button">레진패스 적용</button>
<button type="button">취소</button>
</div>
<input>
요소에 선언aria-invalid="true"
속성을 활성하면 보조기기는 aria-errormessage
속성이 참조하는 내용을 오류 메시지로 전달value
true | false(default) |
요소가 모달인지 여부를 보조기기에 전달
보통 role="alertdialog"
또는 role="dialog"
와 함께 사용
사용할 수 없는 요소에 aria-hidden="true"
속성을 선언해서 보조기기가 무시하도록 설정. 포인팅 기능도 차단하도록 처리