혹시나 잘못된 개념 전달이 있다면 댓글 부탁드립니다. 저의 성장의 도움이 됩니다
Web Accessibility
사용자의 연령, 장애, 비장애 등의 여부와 상관없이, 상황적인의 제약에 상관없이 동등한 정보 제공을 보장하는 것
-> 정보 소외계층 뿐만 아니라 비장애인에게도 필요한 요소
우리나라 웹 접근성의 실태
: 웹 접근성이 나쁜 예시로 이미지에 담긴 정보는 스크린리더가 읽기 힘든 상황인 경우이다. 특히, 쇼핑몰 상세페이지에서 텍스트보다 이미지로 상품에 대한 정보를 표시하는데, 시력이 좋지 않은 고연령자, 시각 장애를 가진 사용자에게도 정보 제공이 잘 되어있지 않다.
다행히, 2008년 4월 11일부터 장애인 차별 금지 및 권리 구제 등에 관한 법률이 제정되어, 의무적으로 공공기관, 법인 웹사이트 등에 웹 접근성을 갖추도록 되어있다
한국형 웹 콘텐츠 접근성 지침 2.1으로 총 24가지 내용을 설명한다.
<img>
태그의 alt
속성을 추가하여 이미지를 설명alt=""
처럼 빈 문자열로 작성하여 스크린리더가 인식하지 않도록 적용한다. 하지만 예외도 있다. 앞의 콘텐츠 내용으로 이미지 속의 정보를 파악할 수 있거나, 오히려 추가하므로써 중복되는 정보를 반복하는 경우에는 작성하지 않는게 좋을 수 있다.)<video>
태그 속에 <track src="자막.vtt" kind="captions" />
를 추가하여 자막 제공ESC
키로 멈출 수 있게 구현한다.)<html>
태그의 lang
속성을 사용하고, 부분적으로 다른 언어가 지원될 때는 해당 요소에 lang
속성을 적용한다.<html lang="ko">
, <p lang="en-GB">
<a href="...">설명<span class="blind">새 창</span></a>
<a href="..." title="새 창">설명</a>
target=”_blank”
속성 추가콘텐츠는 논리적인 순서로 제공
: 마크업 순서대로 스크린 리더가 읽기 때문에 제목다음에 그에 대한 내용이 오도록 작성한다.
<div>탭1</div>
<div>탭1 관련 내용</div>
<div>탭2</div>
<div>탭2 관련 내용</div>
<!-- 잘못된 사용 예시 -->
<!-- 탭1 , 탭2 , 탭1 관련 내용 , 탭2 관련 내용 순서로 읽힘 -->
<div>탭1</div>
<div>탭2</div>
<div>탭1 관련 내용</div>
<div>탭2 관련 내용</div>
이해기 쉽도록 표를 구성
: 시각 장애를 가진 사용자에게는 표를 읽기 힘들기 때문에 듣기만 해도 구조를 파악할 수 있도록 표현한다.
표의 제목
: 테이블 요소 속에 caption
속성 추가하고 제목과 간단한 요약을 첨부한다.
셀의 용도 구분
: 제목은 <th>
태그, 데이터는 <td>
를 적용한다.
표의 구조가 복잡한 경우, scope
, id
와headers
속성을 추가한다.
<!-- scope 속성 사용 -->
<table>
<caption>바밤바 시리즈 정리</caption>
<thead>
<tr>
<th scope="col">이름<br/>(col)</th>
<th scope="col">당류<br/>(col)</th>
<th scope="col">내용량<br/>(col)</th>
<th scope="col">칼로리<br/>(col)</th>
</tr>
</thead>
<tbody>
<tr>
<td scope="row">바밤바<br/>(row)</td>
<td>13g</td>
<td>70ml</td>
<td>100kcal</td>
</tr>
<tr>
<td scope="row">배뱀배<br/>(row)</td>
<td>14g</td>
<td>70ml</td>
<td>75kcal</td>
</tr>
</tbody>
</table>
<!-- id, headers 속성 사용 -->
<table>
<caption>바밤바 시리즈 정리</caption>
<thead>
<tr>
<th id="A">이름<br/>(A)</th>
<th id="B">당류<br/>(B)</th>
<th id="C">내용량<br/>(C)</th>
<th id="D">칼로리<br/>(D)</th>
</tr>
</thead>
<tbody>
<tr>
<td id="a">바밤바<br/>(a)</td>
<td headers="B a">13g<br/>(B a)</td>
<td headers="C a">70ml<br/>(C a)</td>
<td headers="D a">100kcal<br/>(D a)</td>
</tr>
<tr>
<td id="b">배뱀배<br/>(b)</td>
<td headers="B b">14g<br/>(B b)</td>
<td headers="C b">70ml<br/>(C b)</td>
<td headers="D b">75kcal<br/>(D b)</td>
</tr>
</tbody>
</table>
사용자 입력에 레이블 제공
: 어떤 정보를 입력해야하는 지에 대한 내용을 표시한다. <input>
태그에 value
, placeholder
와 더불어 몇가지 속성을 더 추가한다.
(placeholder
속성 만으로는 레이블로 사용하기 적합하지 않다.)
<!-- case 1 : id 속성과 lable 태그 추가 -->
<lable for="user_id">아이디</lable>
<input id="user_id" type="text" placeholder="아이디" />
<!-- case 2 : title 속성 추가 -->
<input type="text" placeholder="아이디" title="아이디"/>
<!-- case 3 : WAI-ARIA의 aria-label 속성 추가 -->
<!-- WAI-ARIA는 꼭 필요한 경우가 아니라면 사용하지 않는 것이 좋다. -->
<input type="text" placeholder="아이디" aria-label="아이디"/>
<!-- 적절하지 않은 사용 예시 -->
<input type="text" placeholder="아이디" />
<!-- 태그의 열고 / 닫음 오류 X -->
(X) <div><span></div></span>
(O) <div><span></span></div>
<!-- 태그 속성의 중복 X -->
(X) <div class="group1" ... class="group1"></div>
(O) <div class="group1"></div>
<!-- 잘못된 사용 예시 : id 속성의 중복 X -->
<div id="아이디">
<span id="아이디">사용자</span>
</div>
WAI에서 발표한 RIA환경의 웹 접근성 기술 규격
-> 웹 접근성을 향상시키는 방법
WAI (Web Accessibility Initiative)
: 웹 표준을 정하는 W3C에서 웹 접근성을 담당하는 기관
ARIA (Accessible Rich Internet Applications)
: 장애를 가진 사용자에게 웹 접근성을 높여주기 위한 기술
HTML 요소에 추가적으로 의미를 부여하는 보조 기능
ex. SPA 처럼 새로고침 없이 페이지가 콘텐츠가 변경되는 경우, 변경된 부분의 정보를 전달하여 동적인 콘텐츠에서도 웹 접근성을 향상시킬 수 있다.
MDN - Using ARIA: Roles, states, and properties, W3C - ARIA in HTML
시멘틱 HTML로도 웹 접근성을 높일 수 있다. WAI-ARIA는 보조 기능이므로, 시멘틱 요소만으로 의미 부여가 충분히 되는 경우에 WAI-ARIA를 남용하는 것을 지양해야한다.
태그에 속성으로 추가하여 의미를 부여
role
: 시멘틱 태그로도 역할이 잘 표현되지 않을 때, 적용하는 속성이다.
( 단, <h1>
처럼 요소의 의미가 있는 상황에서 변경하기 위해 적용하지는 말아야한다.)
<div role="button">div이지만 button으로 사용되는 요소</div>
<!-- 잘못된 사용 예시 -->
<button role="button">button인 요소</button>
<h1 role="button">h1인 요소</h1>
<!-- 적용 전 -->
<div>
<li>Tab1</li>
<li>Tab2</li>
<li>Tab3</li>
</div>
<div>Tab menu ONE</div>
<div>Tab menu TWO</div>
<div>Tab menu THREE</div>
<!-- 적용 후 -->
<div role="tabList">
<li role="tab">Tab1</li>
<li role="tab">Tab2</li>
<li role="tab">Tab3</li>
</div>
<div role="tabpanel">Tab menu ONE</div>
<div role="tabpanel">Tab menu TWO</div>
<div role="tabpanel">Tab menu THREE</div>
요소의 상태를 추가로 제공하여 의미 파악을 용이하게 하는 속성
aria-selected
: react의 state처럼 선택된 상태를 표현
<!-- Tab1이 활성화 된 상태 -->
<div role="tabList">
<li role="tab" aria-selected="true">Tab1</li>
<li role="tab" aria-selected="false">Tab2</li>
<li role="tab" aria-selected="false">Tab3</li>
</div>
<div role="tabpanel">Tab menu ONE</div>
<div role="tabpanel">Tab menu TWO</div>
<div role="tabpanel">Tab menu THREE</div>
aria-expanded
: 아코디언 UI에서 펼쳐진 상태를 표현
aria-hidden
: 요소가 숨겨진 상태인지를 표현
aria-label
: 텍스트 콘텐츠가 없는 경우 추가적으로 정보를 전달하기 위해 사용
ex. 이미지로 만든 버튼에 적용
<!-- 적용 전 -->
<button> <img src="X.png" /> </button>
<button> <img src="돋보기.png" /> </button>
<!-- 적용 후 -->
<button aria-label="닫기"/> <img src="X.png" /> </button>
<button aria-label="검색"/> <img src="돋보기.png" /> </button>
aria-live
: 해당 요소가 실시간으로 변화하는 영역인지를 표현
ex. alert
, modal
, dialog
같은 기능
aria-live="polite"
aria-live="assertive"
aria-live="off(default)"
Chapter1. 웹 표준
Chapter2. SEO
Chapter3. 웹 접근성
과제 - 웹 표준 & 웹 접근성 개선
<div>
요소, <span>
요소를 적절한 시맨틱 태그로 바꿀 수 있다.이해도 자가 점검 리스트의 결과를 토대로 자기주도적 학습 계획을 수립하고 실천해 보세요.
오늘 학습이 어려웠다면(0~9개)
오늘 학습이 수월했다면(10~18개)
추가적인 학습을 하고 싶다면(19개~ )
느낀점
내용이 너무 많다. 금요일 내용도 많았는데.. 이게 단순히 읽로 넘어가면 금방 끝났겠지만 이해하고, 정리를 하려고 하니까 시간이 오래 걸린다. 기억은 반복에서 나오는 거니까 실제 코드를 짤때 수시로 보면서 교정하고, 기억해나가야겠다.