⛳ 이 글을 통해 알게되는 것
1. 웹 접근성의 개념과 필요성
2. 웹접근성 4원칙
3. 웹 접근성 준수 방법
🌎 세계 접근성 인식의 날(Global Accessibility Awareness Day, GAAD)
매년 5월 셋째주 목요일은 세계 접근성 인식의 날입니다.
모든 사람이 디지털 접근성과 포용성에 대해 이야기하고, 생각하고, 배우고, 이를 실천하도록 알리는 것이 목적입니다.
https://www.newsiesports.com/news/articleView.html?idxno=14932
신체적, 환경적 조건에 관계없이 누구나 인터넷을 통해 정보에 접근하고 이용할 수 있는지에 대한 정도
즉, 모든 사용자가 어떠한 기술환경에서도 전문적인 능력 없이 웹 사이트에서 제공하는 모든 정보에 접근할 수 있도록 보장하는 것입니다.
신체적, 환경적 제약 조건에 대해 좀 더 자세히 알아볼까요?
웹의 힘은 보편성에 있다. 장애에 구애 없이 모든 사람이 접근할 수 있도록 하는 것이 웹의 필수 요소다.
- Tim Berners Lee
장애인들도 비장애인들과 동등하게 전자정보를 사용할 수 있도록 해야한다는 내용이 포함되어 있음
https://www.law.go.kr/lsInfoP.do?lsId=010420&ancYnChk=0#0000
대형 서비스의 경우에는 장애인 단체에서 실제로 장애인차별금지법 위반의 이유로 소송을 제기한 적도 있다.
**WCAG (Web Content Accessibility Guidelines) -** W3C가 발행한 콘텐츠 접근성 지침
**KWCAG (Korean Web Content Accessibility Guidelines) -** 한국형 웹콘텐츠 접근성 지침. 웹표준 기술동향 토대로 국내 설정에 맞게 반영됨
참고: A11YKR(Accessibility Korea) 커뮤니티 https://a11ykr.github.io/docs/
검색엔진 크롤러가 읽기 쉬운 구조 → 검색 엔진 최적화(SEO)
사용자가 콘텐츠에 접근할 때 문제가 될 수 있는 모든 장애 요인을 제거하는 것.
사용자는 장애 유무와 관계없이 웹사이트에서 제공하는 모든 콘텐츠를 인식할 수 있어야 한다.
<!-- 의미 있는 이미지 -->
<img src="profile.png" alt="프로필 사진" />
<!-- 장식용 -->
<img src="line.png" alt="" />
<!-- 링크 내 이미지 -->
<a href="/home">
<img src="home.png" alt="홈으로 이동" />
</a>사용자는 장애 유무와 관계없이 웹사이트에서 제공하는 모든 콘텐츠를 운용할 수 있어야 한다.
→ 마우스, 키보드나 터치스크린을 사용할 수 없는 사람들도 UI 컴포넌트를 사용하여 콘텐츠를 탐색할 수 있는가?
hideFocus
outline:none
onfocus=this.blur()
→ 초점이 보이지 않게되어 주의해야 함
<dialog> 활용 → 포커스 자동 이동, 포커스 트랩 기능으로 모달 안에서만 탐색 가능사용자가 웹사이트의 콘텐츠와 동작 방식을 쉽게 이해하고, 예측 가능해야 한다.
유저가 콘텐츠를 이해하는 데 문제가 없는가?
사용자는 기술에 영향을 받지 않고 원하는 콘텐츠를 이용할 수 있어야 한다.
<header>, <nav>, <main>, <footer>aria-label, aria-expanded, aria-describedby 등으로 의미 전달웹 표준이란, 어떠한 운영체제나 브라우저에서도 동일한 콘텐츠를 볼 수 있도록 웹페이지를 만들 때 지켜야 하는 규칙
→ 이를 해결하기 위해 W3C라는 웹 표준 기구가 설립되었다. https://www.w3.org/
*시맨틱 - 의미론적인, 의미를 가진
시맨틱 태그 종류
https://developer.mozilla.org/ko/docs/Web/HTML/Reference/Elements#inline_text_semantics
시맨틱 태그 사용 이점
Web Accessibility Initiative – Accessible Rich Internet Applications
→ HTML 태그에 필요한 정보를 제공해주는 보조 기술
분류
role="button” → role="dialog”role="tablist”aria-expanded → 현재 항목 펼침 여부 표현button, listbox, tab
<button aria-expanded="false" aria-controls="menu1">메뉴 열기</button>
<ul id="menu1" hidden> ... </ul>
aria-selected → 현재 항목 선택 여부 표현option, tab
<li role="tab" aria-selected="true">탭 1</li>
<li role="tab" aria-selected="false">탭 2</li>
aria-controls → 어떤 요소가 다른 요소를 제어하고 있음을 연결aria-labelledby → 다른 요소의 텍스트를 가져와 이 요소의 이름(Accessible Name)으로 사용<h2 id="title">로그인 폼</h2>
<form aria-labelledby="title">...</form>aria-describedby다른 요소의 설명(Description)을 연결
라벨만으로 부족할 때 부가설명 전달
<input type="password" aria-describedby="pw-hint" />
<small id="pw-hint">8자 이상 입력하세요</small>
aria-activedescendant현재 활성화된 자식 요소를 가리킴
주로 커스텀 콤보박스, 리스트박스에서 키보드 탐색 시 사용
<div role="listbox" aria-activedescendant="opt2">
<div id="opt1" role="option">옵션 1</div>
<div id="opt2" role="option">옵션 2</div>
<div id="opt3" role="option">옵션 3</div>
</div>
https://codesandbox.io/p/sandbox/wpgmf9?file=%2Fsrc%2FApp.js%3A49%2C2
🌟 Accessible Name 규칙
예시.
<div aria-label='감사안해요'>감사합니다</div>
| 상황 | 코드 예시 | Accessible Name | 비고 |
|---|---|---|---|
| 1. aria-labelledby만 있음 | <div aria-labelledby="label">텍스트</div><span id="label">라벨</span> | "라벨" | aria-labelledby가 최우선 |
| 2. aria-label만 있음 | <div aria-label="안녕하세요">텍스트</div> | "안녕하세요" | 직접 지정된 aria-label이 적용됨 |
| 3. 텍스트 콘텐츠만 있음 | <div>텍스트</div> | "텍스트" | 요소 안의 실제 텍스트가 읽힘 |
| 4. aria-labelledby + aria-label 둘 다 있음 | <div aria-label="안녕하세요" aria-labelledby="label">텍스트</div><span id="label">로그인 폼</span> | "로그인 폼" | aria-labelledby가 aria-label보다 우선 |
| 5. aria-labelledby 잘못된 참조 (없는 id) | <div aria-label="안녕하세요" aria-labelledby="nope">텍스트</div> | "안녕하세요" | 참조가 무효면 aria-label로 fallback |
| *6. aria- 속성 전혀 없음** | <div>텍스트</div> | "텍스트" | 기본적으로 안의 텍스트가 읽힘 |
예시 1: 로그인 form
예시 2: 레이어 팝업(모달)
사용자 등록 버튼 클릭 후, 사용자 등록 모달이 노출되면, 모달 내부로 초점이 이동해야 하고, 탐색을 하다가 x(닫기) 버튼을 클릭하면, 다시 사용자 등록 버튼으로 초점이 이동해야 한다.
여러 포커스 요소를 포함한 UI 컴포넌트 - Composite Widget(복합 위젯)
Roving tabindex
→ 운영체제에서 보이는 일반적인 GUI 운용 방식을 따른 것
접근성 표준에 맞춘 UI를 매번 직접 구현하는 것은 많은 시간이 소요됩니다.
Ark UI, React Aria, Melt UI, …
https://developer.microsoft.com/en-us/fluentui#/
Fluent UI 또한 단순히 디자인 시스템을 제공하는 걸 넘어, 접근성 표준(WCAG, ARIA)을 고려한 컴포넌트 구현을 내장하고 있다.
e.g. Dialog, Menu, Button 같은 컴포넌트는 이미 키보드 내비게이션, 포커스 트랩, ARIA 속성이 잘 적용되어 있음.
→ 접근성 기본기를 보장받을 수 있다.
✅ 웹 접근성을 잘 준수한 웹사이트는 누구나 쉽게 이용할 수 있는 보편성을 갖추게 된다.
✅ 동시에 기계가 이해하기에도 용이한 문서가 되어 비즈니스 가치까지 높일 수 있다.
빠듯한 개발 일정 속에서 웹접근성은 쉽게 뒷전으로 밀려나지만, 웹개발자로서 접근성을 포기하지 않고, 작은 부분이라도 늘 마음 한켠에 두고 실천하려는 노력과 책임이 필요해 보인다!
https://slides.com/muhun/web-accessibility-for-everyone-what-and-how#/5/7/0
https://yozm.wishket.com/magazine/detail/1942/
https://seo.tbwakorea.com/blog/web-accessibility/
https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#kbd_roving_tabindex
https://www.mcst.go.kr/site/s_etc/webAccess/accessibility.jsp
http://youtube.com/watch?v=6p0lZaSAW3A
https://www.w3.org/WAI/ARIA/apg/practices/read-me-first/
https://inpa.tistory.com/entry/WEB-📚-웹-표준의-이해