JavascriptJavaScript와 접근성트리거 이벤트 (Trigger Events)페이지 제목 (Page Titles)동적 콘텐츠 (Dynamic Content)포커스 관리 (Focus Management)컴포넌트 레벨페이지 레벨상태 관리 (State Management)컴포넌트 레벨페이지 레벨라이브 패키지 (Live Packages)결론

Javascript
JavaScript는 웹 콘텐츠의 동적 요소부터 React나 Angular와 같은 프레임워크를 사용하는 전체 제품에 이르기까지 다양한 방식으로 중요한 역할을 한다.
JavaScript와 접근성
JavaScript는 웹 사이트 접근성에 큰 영향을 미칠 수 있다.
자바스크립트의 사용(혹은 과도한 사용)이로 인해 페이지 로딩 시간이 길어지거나, 비시멘틱 HTML 요소의를 사용한다거나, JavaScript를 통해 HTML과 CSS를 삽입하는 등 여러 가지 접근성 문제가 발생할 수 있다.
JavaScript가 향상시킬 수 있는 접근성 패턴과 JavaScript 프레임워크 사용에서 발생할 수 있는 접근성 문제 해결 방법을 알아보자.
트리거 이벤트 (Trigger Events)
JavaScript 이벤트는 사용자가 웹 콘텐츠와 상호작용하여 특정 작업을 수행하도록 한다.
많은 장애인들이 키보드를 사용하여 웹과 상호작용하기 때문에, 키보드 지원을 추가하는 것이 중요하다.
button
,a
등 시멘틱 태그를 사용하는 경우에는 기본적으로 키보드 기능도 내장되어 있다.
// bad (키보드 지원이 내장되어 있지 않은 비시멘틱 태그 사용) <div role="button" tabindex="0" onclick="doAction()">Click me!</div> // good (시멘틱 태그 사용) <button onclick="doAction()">Click me!</button>
페이지 제목 (Page Titles)
page
title
은 스크린 리더 사용자에게 필수다. 현재 어떤 페이지를 보고 있고, 어디로 이동했는 지 알게 해준다.스크린 리더 사용자들을 위해서 타이틀 변화를 꼭 알려줘야 한다.
- 라이브 리전을 활용해 타이틀이나 주요 변화를 화면 판독기에 알림.
<div aria-live="polite"> <!-- Live Region: 화면 판독기가 이 내용을 읽음 --> <span id="pageTitle">New Page Title</span> </div>
- 새로 업데이트된 콘텐츠로 포커스를 이동시켜 주요 콘텐츠를 읽도록 설정.
document.getElementById('newContent').focus();
동적 콘텐츠 (Dynamic Content)
JavaScript를 사용하면 HTML과 CSS를 동적으로 삽입할 수 있습니다. 하지만 이 기능을 잘못 사용하면 접근성 문제를 일으킬 수 있습니다.
// 동적콘텐츠 삽입 예시 document.querySelector("#banner").innerHTML = '<p>You are now signed in</p>'; document.querySelector("#banner").setAttribute("style", "border-color:#0000ff;");
- 잘못된 사용: 큰 덩어리의 비시멘틱 HTML을 렌더링하기
올바른 사용: 작은 시멘틱 HTML 조각을 렌더링하기
- 잘못된 사용: 동적 콘텐츠가 보조 기술에 의해 인식될 시간이 부족함
올바른 사용:
setTimeout()
을 사용하여 사용자가 전체 메시지를 들을 수 있도록 시간을 주기- 잘못된 사용:
onFocus()
에 동적으로 스타일 속성을 적용하기
올바른 사용: 관련 요소에 대해 CSS 스타일 시트에서
:focus
를 사용하기- 잘못된 사용: 인라인 스타일을 적용하여 사용자 스타일 시트가 제대로 읽히지 않음
올바른 사용: 스타일은 CSS 파일에 정의하여 테마의 일관성을 유지하기
- 잘못된 사용: 너무 큰 JavaScript 파일이 사이트 성능을 저하시킴
올바른 사용: JavaScript 사용을 최소화하고, CSS에서 비슷한 기능(예: 애니메이션 또는 고정된 내비게이션)을 사용하여 더 빠르게 파싱하고 성능을 향상시킬 수 있음
CSS에서는 인라인 스타일을 사용하는 대신 CSS 클래스를 미리 정의해놓고 토글하여 적용하는 것이 좋다. 이렇게 하면 재사용성이 높고 코드가 간결해진다.
JavaScript로 페이지에 동적으로 콘텐츠를 추가해야만 한다면, 그 내용은 간단하고 명확하며, 접근성에도 문제가 없도록 해야한다.
포커스 관리 (Focus Management)
포커스 관리는 포커스를 언제, 어디서 고정할지와 고정하지 말아야 할 때를 아는 것이다.
포커스 관리(또는 포커스 제어)는 키보드만 사용하는 사용자에게 매우 중요하다.
키보드 사용자가 웹 페이지에서 포커스를 잃지 않도록 보장해야 한다.
컴포넌트 레벨
컴포넌트의 포커스가 제대로 관리되지 않으면 키보드 트랩을 만들 수 있습니다.
키보드 트랩은 키보드만 사용하는 사용자가 컴포넌트 안에서 벗어날 수 없거나, 포커스가 유지되어야 할 때 제대로 유지되지 않는 상황에서 발생합니다.
Keyboard Trap : 키보드 사용자가 컴포넌트 안에서 벗어날 수 없게 되는 상황

포커스 관리 문제를 경험하는 가장 일반적인 패턴 중 하나는 모달 컴포넌트다.
- 사용자는 모달의 행동 가능한 요소들 사이를
Tab
키로 이동할 수 있어야 한다.
- 사용자가 모달을 명시적으로 닫지 않으면 모달 밖으로 나갈 수 없어야 한다.
페이지 레벨
사용자가 페이지에서 페이지로 이동할 때 포커스를 유지하는 것도 중요하다.
이는 특히
SPA
는 브라우저 새로 고침 없이 모든 콘텐츠가 동적으로 변경되므로 더 중요하다.페이지 전환 시 포커스를 어디로 둘 것인지 정해야 한다.
<h1 id="page-title" tabindex="-1">새로운 페이지 제목</h1> <p>여기에 새로운 콘텐츠가 들어갑니다.</p>
document.getElementById("page-title").focus();
예시로
h1
태그로 포커스를 이동시켰는데, 상황에 따라 main
으로 이동 등의 방식이 있다.페이지 구성과 의도에 맞게 포커스를 두자.
상태 관리 (State Management)
JavaScript가 접근성에서 중요한 또 다른 영역은 상태 관리다.
구성요소의 현재 시각적 상태(토글됨, 토글안됨 등)가 AT 사용자에게 잘 전달되어야 한다.
보통 컴포넌트나 페이지의 시각적 상태는 ARIA 속성으로 관리된다.
컴포넌트 레벨
어떤 정보를 유저에게 알려줄 지와 관련된 ARIA 상태들이 많이 있다.
aria-expanded
: 아코디언, 드롭다운, 상세 보기
aria-pressed
: 토글 버튼, 좋아요 버튼
aria-checked
: 체크박스, 토글 스위치
aria-disabled
: 버튼, 입력 필드 비활성화
aria-invalid
: 입력값 검증
aria-selected
: 탭, 리스트 아이템
예시)
<input type="checkbox" id="toggle" aria-checked="false">
const checkbox = document.getElementById("toggle"); checkbox.addEventListener("click", () => { const isChecked = checkbox.getAttribute("aria-checked") === "true"; checkbox.setAttribute("aria-checked", !isChecked); });
페이지 레벨
ARIA 라이브 영역(ARIA live region)을 통해 화면의 변화나 경고 메시지를 보조 기술(AT) 사용자에게 알리는 경우가 많다. 이 영역은 JavaScript와 함께 사용하여 페이지 전체를 새로고침하지 않고도 동적인 변경 사항을 사용자에게 알릴 수 있다.
과거에는 JavaScript가
aria-live
및 alert
영역에서 콘텐츠를 알리는 데 어려움을 겪었는데, 비동기적으로 DOM에 추가된 콘텐츠를 보조 기술(AT)이 제대로 감지하고 읽어내기 어렵기 때문이다.이런 문제가 발생하지 않으려면:
aria-live
또는alert
영역이 페이지가 로드될 때부터 DOM에 존재해야 한다.
- 이후, 텍스트만 동적으로 변경하면 AT가 정상적으로 내용을 읽어줄 수 있다.
<button id="hiddenLive">Click for Status Change</button> <p class="hidden liveRegion" aria-live></p>
// Shows live region, then adds in the text, and sets the state of aria-live hiddenLive.addEventListener("click", function () { let liveRegion = document.querySelector(".liveRegion"); liveRegion.classList.remove("hidden"); liveRegion.innerHTML = "I am alert text!"; liveRegion.setAttribute("aria-live", "assertive"); });
라이브 패키지 (Live Packages)
JavaScript 프레임워크에서는 동적 콘텐츠를 보조 기술에 올바르게 전달할 수 있도록 돕는 패키지를 제공합니다. 예를 들어:
- React:
react-aria-live
,react-a11y-announcer
- Angular:
LiveAnnouncer
- Vue:
vue-a11y-utils
결론
현대 JavaScript는 웹 개발에 강력한 도구를 제공하지만, 과도하게 사용하면 접근성 문제를 일으킬 수 있습니다. 이 모듈에서 다룬 JavaScript 패턴과 팁을 따르면 웹 애플리케이션을 더 접근성 있게 만들 수 있습니다.