Copyright © 2018-2024 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 번역본은 ARIA 1.2 버전에 대한 개인 번역본으로 공식 번역본이 아닙니다.
잘못된 번역으로 원문의 의도를 해치지 않기 위해 의도적으로 직역을 선택하였으며, 일부는
이해를 돕기 위해 원문의 의도를 해치지 않는 선에서 의역되거나 각색되었습니다.
원문은 아래 링크에서 확인이 가능하며, 오역이 있을 경우 Github issue에
남겨시면 확인 후 수정하도록 하겠습니다.
원문: WAI-ARIA Authoring Practices 1.2
이 문서는 독자에게 접근 가능한 리치 인터넷 어플리케이션을 만드는데 WAI-ARIA 1.2 [WAI-ARIA]를 어떻게 사용하는지에 대한 이해를 제공합니다. WAI-ARIA 명세만으로는 대다수의 작성자에게 명확하지 않을 수 있는 고려 사항들을 설명하고 WAI-ARIA 역할(role), 상태(state), 속성(property)을 사용하여 위젯, 내비게이션, 동작을 접근 가능하게 할 수 있는 처리 방법을 추천합니다. 이 문서는 주로 웹 어플리케이션 개발자들을 대상으로 하지만, 지침은 유저 에이전트와 보조 기술 개발자에게도 유용합니다.
이 문서는 WAI-ARIA 개요에 기술된 WAI-ARIA 제품군의 일부입니다.
이 부분은 현재 문서의 발행 당시 상태에 대해 기술합니다. W3C 발행 문서의 최신 목록 및 테크니컬 리포트 최신판을 https://www.w3.org/TR/ 의 W3C technical reports index 에서 열람할 수 있습니다.
이 문서는 웹 접근성 이니셔티브의 접근 가능한 리치 인터넷 어플리케이션 워킹 그룹의 편집자 초안입니다. 이 문서는 Accessible Rich Internet Applications (WAI-ARIA) 1.2 [WAI-ARIA-1.2] 명세를 지원하며, 기술 명세에 상응하는 것을 넘어 명세를 이해하는데 중요한 상세한 조언과 예제들을 제공합니다.
이 초안은 WAI-ARIA 작성 방법 1.2에 대해 계획된 일부 내용만을 포함합니다. 전체 지침에 대한 계획을 보려면 작성 방법 마일스톤 계획을 확인하세요.
여기 제공된 정보 상의 피드백은 정보와 운영에 대해 완전한 접근을 제공하는 리치 인터넷 어플리케이션의 궁극적인 성공에 필수적입니다. 접근 가능한 리치 인터넷 어플리케이션 워킹 그룹은 특히 다음과 같은 질문을 합니다:
의견을 남기려면, W3C ARIA Practices GitHub repository에 이슈를 남기거나, 그것이 불가능하다면, public-aria-practices@w3.org (comment archive)로 이메일을 보내주세요.
This document was published by the Accessible Rich Internet Applications Working Group as an Editor's Draft.
Publication as an Editor's Draft does not imply endorsement by W3C and its Members.
This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This document was produced by a group operating under the W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This document is governed by the 03 November 2023 W3C Process Document.
ARIA 작성 방법 지침(APG)은 접근성 의미론를 적절히 전달하고 일반적인 키보드 규칙을 구현하는 웹 사이트를 개발하여 보조 기술 및 키보드 인터페이스 사용자를 위한 접근 가능한 웹 경험을 만드는 방법을 설명합니다. 또한 고대비 및 감소된 동작을 위한 운영 체제 설정 지원과 같은, 밀접하게 관련된 몇 가지 주제에 대한 지침을 제공합니다.
접근 가능한 의미론은 보조 기술 사용자가 요소를 이해하고 사용하는 것을 위해 전달되어야 하는 유저 인터페이스 요소의 의미를 가리킵니다. 예를 들어, 검색 아이콘 버튼을 시각적으로 인식할 수 있는 사람들은 검색을 수행하도록 활성화 될 수 있는 요소를 스타일 및 위치에 따라 이해합니다. 이 아이콘을 스크린리더 사용자가 접근할 수 있도록하기 위해, 전달되어야 할 의미 중 하나는 요소가 인터랙티브 버튼임을 나타내는 것입니다. 또한, 키보드 접근성은 버튼이 초점을 얻을 수 있는 것을 요구하며, 키보드 규칙은 버튼이 초점을 얻은 경우 활성화를 위해 Enter나 Space를 누르는 것을 요구합니다. APG는 일반적인 버튼 및 팝업 메뉴에서부터 복잡한 트리 그리드에 이르기까지 많은 공통 설계 패턴에 대한 접근성 의미론을 전달하는 방법과 키보드 접근성 구현 방법을 설명합니다. 또한 ARIA 랜드마크 영역으로 웹 페이지 구조를 전달하는 방법과 접근 가능한 이름을 인코딩하는 많은 방법을 효과적으로 활용하는 방법과 같은, 이 패턴들과 관련된 필수 사례를 설명합니다.
APG는 패턴과 사례 두 가지 주요 섹션을 구성 됩니다. 각 패턴은 버튼, 메뉴, 대화상자와 같은 공통 유저 인터페이스 요소를 접근 가능하게 만드는 방법을 설명하고 패턴의 기능적 예제 구현을 제공합니다. 사례 섹션은 리치 인터넷 어플리케이션 경험을 접근 가능하게 만들 때 나타나는 다양한 접근성 요구 사항을 충족하는 방법에 대해서 자세히 설명합니다. 예를 들어, 접근 가능한 이름과 설명 제공에 대한 사례 섹션에서는 7가지 다른 이름 지정 기법에 대한 자세한 설명과 80가지 이상의 요소 유형에 대한 이름 지정 지침을 제공하는 표를 제공합니다.
APG는 웹 개발 특히 HTML과 CSS에 대한 기본적인 이해를 전제로 합니다. 사이트 디자인 시스템과 컴포넌트 라이브러리에서 작업하는 디자이너와 엔지니어에게 특히 유용할 수 있습니다. 하지만, APG는 접근 가능한 경험을 만드는데 필요한 일부만 다룬다는 점을 이해하는 것이 중요합니다. 접근성을 더 광범위하게 이해하려면, WAI 접근성 기본과 WAI 설계 및 개발 개요부터 시작하는 것이 좋습니다.
APG 패턴에 사용되고 APG 사례에 기술 된 접근성 의미론은
WAI-ARIA 1.2 명세에 기술되어 있습니다.
즉, ARIA 명세는 요소와 role="button"
의 의미와 같은 보조 기술에 대한 상태를 설명하는 어트리뷰트의 의미를 표준화합니다.
이러한 어트리뷰트와 보조 기술이나 키보드 탐색에 의존하는 사람들이 사용하는 사이트를 만드는데 요구되는 기타 기능은 HTML, JavaScript, CSS, SVG와 같은 웹 사이트를 만드는데 사용되는 언어에 기본적으로 포함되어 있지 않습니다.
W3C 웹 접근성 이니셔티브(WAI)의 접근 가능한 리치 인터넷 어플리케이션 워킹 그룹(ARIA WG)은 여러 W3C 표준 활동을 통해 이러한 결함들을 해결하고 있습니다.
WAI-ARIA 개요는
WAI-ARIA의 추가 배경을 제공하고, 이러한 활동을 요약하고, WAI-ARIA 제품군에 포함된 다른 문서를 나열합니다.
기능적으로, ARIA (role), 상태(state), 속성(property)들은 보조 기술에 대해 CSS와 유사합니다. 스크린리더 사용자들의 경우, ARIA는 비시각적 경험의 렌더링을 제어합니다. 잘못된 ARIA는 잠재적으로 비시각적 경험에 대해 심각한 손상을 주며 시각적 경험을 잘못 전달합니다.
ARIA나 이 문서의 어떤 지침을 사용하기 이전에, 다음의 두 가지 기본 원칙을 이해하는데 시간을 들이세요.
이 코드는:
<div role="button">Place Order</div>
해당 <div>
의 작성자가 버튼에 기대되는 키보드 인터랙션을 제공하는 JavaScript도 구현했다는 약속입니다.
HTML 입력 엘리먼트와 달리, ARIA 역할(role)은 브라우저가 키보드 동작이나 스타일링을 제공하지 않습니다.
그 역할(role)의 약속을 이행하지 않고 사용하는 것은 주문을 빼먹고 쇼핑 카트를 비우는 "주문하기" 버튼을 만드는 것과 유사합니다.
이 지침의 목표 중 하나는 각 ARIA 역할(role)에 대해 기대되는 동작을 정의하는 것입니다.
유저 인터페이스 엘리먼트들의 의미와 목적에 대해 필요한 정보 보조 기술을 접근성 의미론이라고 합니다. 보조 기술의 관점에서, ARIA는 작성자에게 보조 기술이 달리 확실하게 추론 할 수 없을 중요한 접근성 의미론으로 HTML과 SVG 엘리먼트를 꾸밀 수 있는 능력을 제공합니다.
일부 ARIA는 가면과 같습니다; 원래의 의미나 콘텐트를 완전히 감추거나 덮어 씌웁니다.
<a role="menuitem">보조 기술 사용자는 이 엘리먼트를 링크가 아니라 메뉴의 항목으로 인지합니다.</a>
<a aria-label="보조 기술 사용자는 링크 텍스트가 아니라 이 aria-label의 콘텐트만을 인식할 수 있습니다">링크 텍스트</a>
반면에, 일부 ARIA의 사용은 멜빵이나 벨트에 가깝습니다; 원본 콘텐트에 필수적인 지원을 제공하는 의미를 추가합니다.
<button aria-pressed="false">Mute</button>
이것이 ARIA의 힘입니다. 작성자가 보조 기술들이 확실하게 해석할 수 있는 방법으로 거의 모든 유저 인터페이스를 기술할 수 있게 하므로, 보조 기술 사용자에게 컴포넌트를 접근 가능하게 할 수 있습니다.
이것은 동시에 ARIA의 위험이기도 합니다. 작성자는 부주의하게 접근성 의미를 덮어쓸 수도 있습니다.
<table role="log">
<!--
보조 기술 사용자가 표로 인식하지 못하는 표.
log 역할(role)은 브라우저에게 이것이 표가 아니라 기록이라고 알립니다.
-->
</table>
<ul role="navigation">
<!-- 이것은 목록이 아니라 navigation 영역 입니다. -->
<li><a href="uri1">nav link 1</li>
<li><a href="uri2">nav link 2</li>
<!-- 오류! 위 목록 항목들은 목록에 없습니다! -->
</ul>
제품에 이 가이드의 코드를 사용하기 이전에 보조 기술 상호 운용성 테스트가 필수적입니다. 이 지침의 목적은 ARIA 명세에 정의 된 대로 ARIA 1.2의 적절한 사용을 실제로 보여주는 것이기 때문에, 설계 패턴, 참고 예제, 샘플 코드는 일부러 브라우저와 보조 기술들의 ARIA 1.2에 대한 지원의 격차에 따른 문제를 해결하기 위한 코딩 기법을 기술하고 구현하지 않습니다. 따라서, 대상 고객과 관련된 각 브라우저와 보조 기술 조합으로 구현을 철저하게 테스트 하는 것이 바람직합니다.
비슷하게, 이 지침의 JavaScript와 CSS는 작성 시점에서의 가장 최신 버전의 크롬, 파이어폭스, 인터넷 익스플로러, 사파리와 호환되도록 작성되었습니다. 인터넷 익스플로러에서는 일부 JavaScript와 CSS가 제대로 동작하지 않을 수 있습니다.
ARIA 워킹 그룹과 다른 컨트리뷰터들이 오류를 못 보고 지나친 경우를 제외하고, 이 지침의 특정 브라우저나 특정 보조 기술에서 제대로 동작하지 않는 예제는 브라우저나 보조 기술 버그를 시연하는 것입니다. 따라서 브라우저와 보조 기술 개발자는 이 지침의 코드를 활용하여 ARIA 1.2에 대한 지원 품질을 평가할 수 있습니다.
현재, 이 지침은 모바일 브라우저나 터치 인터페이스와 호환되는 예제는 나와 있지 않습니다. 일부 예제는 모바일과 터치 지원을 향상시키는 특정 기능이 포함되어 있지만, 일부 ARIA 기능은 모바일 브라우저에서 지원되지 않습니다. 또한, 모바일 브라우저에서 동작하는 터치 인터랙션을 제공하기 위한 표준화 된 접근 방식은 아직 없습니다.
터치와 모바일 지원에 대한 추가 지침은 향후 지침 릴리즈에 계획되어 있습니다.
이 섹션은 WAI-ARIA 역할(role), 상태(state), 속성(property)을 적용하고 키보드 지원을 구현하여 일반적인 리치 인터넷 어플리케이션 패턴과 위젯을 접근 가능하게 만드는 방법을 보여줍니다.
접근 가능한 이름과 적절한 경우 접근 가능한 설명을 가진 엘리먼트를 제공하는 것은 접근 가능한 웹 경험을 개발할 때 작성자가 가져야 할 가장 중요한 책임 중 하나입니다. 대부분의 엘리먼트에서는 그렇게 하는 것이 간단한 반면, 보조 기술 사용자들을 완전히 차단할 수 있는 기술적 실수 역시 쉽게 만들 수 있고 불행하게도 흔하게 일어납니다. 작성자가 접근 가능한 이름과 설명을 효과적으로 제공할 수 있도록 돕기 위해, 이 섹션에서는 그 목적과, 작성자가 그것들을 제공해야 하는 경우, 브라우저가 그것들을 모으는 방법, 그것들을 코드화하고 구성하기 위한 규칙을 설명합니다. 또한 작성자에게 다음의 이름 지정와 설명 지정 기법 및 WAI-ARIA 속성 사용에 대해서도 안내합니다:
aria-label
을 통해 문자열 속성으로 이름 지정.aria-labelledby
로 콘텐트를 참조하여 이름 지정.aria-describedby
로 콘텐츠를 참조하여 설명 지정.접근 가능한 이름은 일반적으로 1 ~ 3개 단어의 짧은 문자열로, 작성자가 보조 기술 사용자에게 엘리먼트에 대한 레이블을 제공하기 위해 엘리먼트와 연관시킨 문자열입니다. 예를 들어, 입력 필드는 접근 가능한 "User ID"이라는 이름을 가지거나, 버튼은 "Submit"으로 이름 지을 수 있습니다.
접근 가능한 이름은 스크린리더와 같은 보조 기술 사용자에게 두 가지 주요 목적을 제공합니다:
WAI-ARIA 명세와 WCAG 둘 모두 모든 포커서블(focusable), 인터랙티브 엘리먼트들은 접근 가능한 이름을 가지도록 요구합니다. 게다가 대화 상자와 tables과 regions 같은 일부 구조 컨테이너들도 이름을 가지도록 요구됩니다. 많은 다른 엘리먼트들도 이름을 지정할 수 있지만, 이름이 접근성을 향상시키는가의 여부는 주변 컨텍스트의 다양한 특성에 따라서 결정됩니다. 마지막으로, 접근 가능한 이름을 제공하는 것이 기술적으로는 가능하지만 권장할만 하지는 않은 일부 엘리먼트들이 있습니다. 역할에 따른 접근 가능한 이름 지침 섹션은 모든 ARIA 역할에 대한 이름 지정 요구 사항과 지침들을 나열합니다.
접근 가능한 설명 역시 보조 기술에 의해 렌더링 되는 작성자가 제공한 문자열입니다. 작성자는 입력 필드에 대한 지시 사항이나 형식 요구 사항과 같은, 엘리먼트와 연관 시킬 필요가 있는 추가적인 정보가 있을 경우 설명을 제공합니다.
보조 기술은 이름과 설명을 다르게 표현합니다.
예를 들어, 스크린리더는 일반적으로 엘리먼트의 이름과 역할을 먼저 낭독합니다. 예를 들어, 대화 음소거
라고 명명된 버튼은 대화 음소거 버튼
이라고 낭독되어 질 수 있습니다.
엘리먼트가 상태(state)를 가지는 경우, 이름과 역할 앞이나 뒤로 낭독될 수 있습니다; 일반적으로 기본은 이름과 역할 이후입니다.
예를 들어, 꺼짐
상태인 대화 음소거
라고 명명된 스위치 버튼은 대화 음소거 스위치 버튼 꺼짐
으로 낭독 될 수 있습니다.
설명은 일반적으로 이름보다 상당히 긴 선택적인 문자열이기 때문에, 마지막에 표현되고, 때로는 약간 지연 된 후에 표현됩니다.
예를 들어, 대화 음소거 스위치 버튼 꺼짐, 이 대화의 활동에 대한 알림(alert)과 알림 소리를 없앱니다.
자세한 내용을 줄이기 위해, 일부 스크린리더는 기본적으로 설명을 낭독하지 않고, 대신 사용자에게 그 존재를 알려 사용자가 설명을 낭독시키도록 키를 누르게 할 수 있습니다.
접근 가능한 이름이나 설명 문자열에 포함 시킬 텍스트를 지정할 엘리먼트와 어트리뷰트들이 여럿 있기 때문에, 그리고 작성자가 거의 끝 없는 방식으로 그 텍스트들을 결합 할 수 있기 때문에, 브라우저는 문자열을 조립하기 위해 상당히 복잡한 알고리즘을 구현합니다. 접근 가능한 이름 계산과 접근 가능한 설명 계산의 섹션들이 알고리즘과 브라우저들이 우선 순위를 구현하는 방법을 설명합니다. 하지만, 이름이나 설명이 유용한 경우의 거의 모든 상황은 이름 지정 기법과 설명 지정 기법 섹션에 기술된 코딩 패턴에 따라 지원되기 때문에 대부분의 작성자는 알고리즘에 대한 상세한 이해 같은 것은 필요하지 않습니다.
아래 몇 가지 이름 지정 기법은 ARIA 명세에 의해 금지되거나 아직 완전히 정의되지 않은 회색 지대에 속하는 특정 코딩 패턴에 대해 경고하는 메모를 포함하고 있습니다. 이러한 금지된 것이나 모호한 패턴 중 일부는 논리적으로 나타나고 일부 브라우저에서 희망했던 이름을 내 줄 수도 있습니다. 하지만, 특히 브라우저 간의 이름 계산의 일관성을 개선하기 위한 작업이 진행됨에 따라 브라우저 전체를 통틀어 일관된 결과를 제공할 가능성이 낮습니다.
이름 지정 기법에 제공되는 경고에 주의를 기울이는 것 외에도, 브라우저가 계산한 이름과 예상 한 것이 일치하도록 보장하기 위해 테스트의 중요성을 지나치게 강조하기란 쉽지 않습니다.
유저 인터페이스가 적절한 접근 가능한 이름을 제공하는데 사용될 수 있는 보이는 텍스트를 포함하는 경우, 접근 가능한 이름에 대한 보이는 텍스트를 사용하는 것이 유지보수를 간소화하고, 오류를 방지하며 언어 번역 요구 사항을 줄입니다. 이름이 시각적으로 표시되지 않고 마크업 안에만 존재하는 텍스트로부터 생성되는 경우, 유저 인터페이스 설계나 콘텐츠가 변경될 경우 접근 가능한 이름은 업데이트 되지 않을 소지가 높습니다.
입력 상자나 버튼과 같은 대화형 엘리먼트(interactive element)가 시각적으로 사라지지 않는 텍스트 레이블이 없는 경우, 이를 포함하도록 디자인을 조정하세요. 접근 가능한 이름에 대해 더 견고한 소스를 제공하는 것 외에, 보이는 텍스트 레이블은 보이지 않는 이름을 나타내는 보조 기술을 사용하지 않는 많은 장애인들에 대한 접근성을 향상시킵니다. 대부분의 상황에서, 보이는 텍스트 레이블은 또한 유저 인터페이스를 모든 사용자들이 이해하기 더 쉽게 만듭니다.
HTML 문서에서, 가능할때마다, 폼 엘리먼트에 대한 HTML label
엘리먼트와 표에 대한 caption
엘리먼트와 같은 HTML 이름 지정 기법을 사용하세요.
유연성은 떨어지지만, 보이는 텍스트에 대한 단순성과 의존성은 견고한 접근 가능한 환경을 보장하는데 도움이 됩니다.
몇 몇 이름 지정 기법은 ARIA 속성 대신 HTML 기능을 사용하는 것의 특정 접근성 장점을 강조합니다.
작성자가 이름 지정을 위해 의도된 엘리먼트나 어트리뷰트를 사용하여 접근 가능한 이름을 지정하지 않는 경우, 브라우저는 이름을 생성하기 위한 폴백 메서드에 기대어 보조 기술 사용자를 도우려 시도합니다.
예를 들어, HTML title
과 placeholder
어트리뷰트는 접근 가능한 이름에 대한 콘텐츠의 최후의 수단으로 사용됩니다.
이 어트리뷰트의 목적은 이름 지정이 아니기 때문에, 일반적으로 그 내용은 유효하지 않은 저품질의 접근 가능한 이름을 산출합니다.
시각적으로 화면을 가득 메우고 모호한 아이콘이 사용성을 떨어뜨리는 방법과 유사하게, 지나치게 길거나 충분히 분명하지 않거나 불확실한 접근 가능한 이름은 유저 인터페이스를 매우 어렵게 만들거나 심지어 유저 인터페이스의 비시각적 형태에 의존하는 사람들의 사용을 불가능하게 만들 수 있습니다. 다시 말해, 접근 가능한 웹 경험을 위해 접근 가능한 이름이 유효해야 합니다. 유효하고 사용자 친화적인 접근 가능한 이름 작성 섹션은 간결성과 명확성의 균형을 위한 지침을 제공합니다.
특정 엘리먼트는 포함하는 콘텐트로부터 이름을 가져옵니다. 예를 들어, 다음 링크는 "Home"으로 이름 지어집니다.
<a href="/">Home</a>
보조 기술이 링크나 버튼과 같이 콘텐트로부터 접근 가능한 이름을 가져오는 엘리먼트를 제공 할 경우, 접근 가능한 이름은 사용자가 그 엘리먼트에 대해 인식 할 수 있는 유일한 콘텐트입니다. 이는 접근 가능한 이름이 엘리먼트의 콘텐트나 값에 추가하여 표시되는 레이블인 텍스트 필드나 표와 같은 다른 엘리먼트들과 대조적입니다. 예를 들어, 표의 접근 가능한 이름은 caption 엘리먼트로부터 파생될 수 있고, 보조 기술은 caption과 테이블 내에 포함된 모든 다른 콘텐트를 모두 제공 합니다.
기본적으로 다음 역할(role) 중 하나를 가지는 엘리먼트는 후손 콘텐츠로부터 계산된 문자열로 이름이 지정됩니다:
menu
엘리먼트에 포함된 콘텐트는 제외 됨.)group
엘리먼트에 포함된 콘텐트는 제외 됨.)
엘리먼트에 대한 콘텐트로부터 이름을 계산할 경우, 유저 에이전트는 각 후손 엘리먼트를 재귀적으로 확인하고 각 후손에 대한 이름 문자열을 계산하고, 결과 문자열을 연결합니다.
두 가지 특정한 경우, 특정 후손들은 무시됩니다: treeitem
엘리먼트의 후손인 group
과 menuitem
엘리먼트의 후손인 menu
는 계산에서 생략됩니다.
예를 들어, 다음 tree
에서 첫 번째 트리 항목의 이름은 과일
입니다; 사과
, 바나나
, and 오렌지
는 생략됩니다.
<ul role="tree">
<li role="treeitem">과일
<ul role="group">
<li role="treeitem">사과</li>
<li role="treeitem">바나나</li>
<li role="treeitem">오렌지</li>
</ul>
</li>
</ul>
자식 콘텐츠로부터 이름 지정을 지원하는 위 역할(role) 중 하나를 가지는 엘리먼트가 aria-label
이나 aria-labelledby
로 이름이 지정되는 경우, 엘리먼트에 포함된 콘텐트와 후손은 후손 콘텐츠가 aria-labelledby
에 의해 참조되지 않는 한 보조 기술 사용자에게 숨겨집니다.
보조 기술 사용자로부터 콘텐트를 숨기는 것이 이로운 드문 경우를 제외하고 위 엘리먼트들 중 하나의 콘텐트를 재정의하기 위해 이 속성들 중 하나를 사용하지 않는 것이 강력히 권장됩니다.
또한, 볼 수 있는 콘텐트가 이 속성 중 하나의 사용으로 인해 보조 기술 사용자에게 숨겨지는 경우에서는 보조 기술을 사용한 철저한 테스트가 특히 중요합니다.
aria-label 속성은 작성자가 시각적으로 전달하지 않는 문자열로 엘리먼트에 이름을 지정할 수 있게 합니다. 예를 들어, 다음 버튼의 이름은 "Close"입니다.
<button type="button" aria-label="Close">X</button>
aria-label
속성은 적절한 접근 가능한 이름으로 제공할 보이는 텍스트 콘텐트가 없는 경우에 유용합니다.
aria-label
속성은 적용되는 엘리먼트의 역할(role)에 의존하여 두 가지 다른 방법 중 하나로 보조 기술 사용자에게 영향을 줍니다.
자식 콘텐트로부터 이름 지정을 지원하는 역할(role) 중 하나를 엘리먼트에 적용하는 경우, aria-label
은 보조 기술 사용자에게 후손 콘텐트를 숨기고 aria-label
의 값으로 교체합니다.
하지만, 거의 모든 다른 유형의 엘리먼트들에 적용되는 경우, 보조 기술은 aria-label
의 값과 엘리먼트의 콘텐트를 모두 전달할 것입니다.
예를 들어, 다음 내비게이션 영역의 이름은 "Product" 입니다.
<nav aria-label="Product">
<!-- 프로덕트 페이지로의 내비게이션 링크 목록 -->
</nav>
이 내비게이션 영역을 만나면, 스크린리더 사용자는 엘리먼트의 이름과 역할을 듣게 될 것이고, 예를 들어, "프로덕트 내비게이션 영역", 영역에 포함된 링크를 통해 읽을 수 있습니다.
aria-label
이 자식 콘텐트로부터 이름 지정을 지원하는 역할(role) 중 하나로 엘리먼트에 적용된다면, 엘리먼트에 포함되고 엘리먼트의 후손인 콘텐트는 보조 기술 사용자에게 숨깁니다.
보조 기술 사용자로부터 콘텐트를 숨기는 것이 이로운 드문 경우를 제외하고 위 엘리먼트들 중 하나의 콘텐트를 재정의하기 위해 aria-label
을 사용하지 않는 것이 강력히 권장됩니다.
aria-label
로 이름을 지정하지 않아야 하는, 문단과 목록 항목 같은 특정한 유형의 엘리먼트가 있습니다. 그것들은 역할(role)에 의한 접근 가능한 이름 지정 지침 섹션의 표에 나와 있습니다.aria-label
의 값은 시각적으로 전달되지 않기 때문에, 예상되는 이름이 사용자에게 제공하는 것을 확인하기 위해 보조 기술을 사용하여 테스트하는 것이 특히 중요합니다.aria-label
값이 번역 되는지 확인하세요.aria-labelledby 속성은 작성자가 접근 가능한 이름을 정의하기 위해 페이지의 다른 엘리먼트들을 참조할 수 있게 합니다. 예를 들어, 다음 스위치는 이전 형제 엘리먼트의 텍스트 콘텐트로 이름이 지정됩니다.
<span id="night-mode-label">야간 모드</span>
<span role="switch" aria-checked="false" tabindex="0" aria-labelledby="night-mode-label"></span>
이 상황에서 aria-labelledby
를 사용하는 것이 for
어트리뷰트를 가진 HTML label
을 사용하는 것과 유사한 반면, 한 가지 중요한 차이점은 브라우저가 레이블을 지정하는 엘리먼트를 클릭하는 것이 레이블이 지정된 엘리먼트를 자동으로 활성화 하지 않는 다는 것에 주목하세요. 그것은 작성자의 책임입니다.
하지만, HTML label
은 span
엘리먼트에 레이블을 지정하는데 사용될 수 없습니다.
다행히 HTML type="checkbox"
을 가진 input
은 ARIA switch
역할(role)을 허용하므로 가능한 경우 다음 접근법을 사용하는 것이 더 견고한 해결책을 만듭니다.
<label for="night-mode">야간 모드</label>
<input type="checkbox" role="switch" id="night-mode">
aria-labelledby
속성(property)은 다음의 이유로 여러 상황에서 유용합니다:
브라우저가 접근 가능한 이름을 계산할 때 가장 높은 우선 순위를 가집니다. 즉, 자식 콘텐트로부터의 이름과 aria-label
을 포함하여 모든 다른 이름 속성들 보다 우선됩니다.
여러 엘리먼트의 콘텐츠를 단일 이름 문자열로 연결할 수 있습니다.
가시성과 관계 없이 엘리먼트의 콘텐트를 포함합니다. 즉, 계산된 이름 문자열에 hidden
어트리뷰트, CSS display: none
이나 CSS visibility: hidden
을 가진 엘리먼트의 콘텐트도 포함합니다.
input 엘리먼트의 값을 통합합니다. 즉, 텍스트 상자를 참조하는 경우, 텍스트 상자의 값이 계산 된 이름 문자열에 포함됩니다.
aria-labelledby
를 가진 숨겨진 엘리먼트를 참조하는 예는 야간 스위치 제어에 대한 레이블 일 수 있습니다:
<span id="night-mode-label" hidden>야간 모드</span>
<input type="checkbox" role="switch" aria-labelledby="night-mode-label">
경우에 따라, 엘리먼트에 대한 가장 효과적인 이름은 다른 엘리먼트의 콘텐트와 자체 콘텐츠가 결합된 것입니다.
aria-labelledby
는 이름 계산에서 가장 높은 우선 순위를 가지기 때문에, 그 경우 자체 엘리먼트와 다른 엘리먼트를 모두 참조하도록 aria-labelledby
를 사용할 수 있습니다.
다음 예에서, "더 보기..." 링크는 엘리먼트 자신과 게시글의 제목에 의해 이름이 지정되어 결과적으로 "더 보기... 벌을 구할 수 있는 7가지 방법"의 링크 이름이 됩니다.
<h2 id="bees-heading">벌을 구할 수 있는 7가지 방법</h2>
<p>벌이 빠르게 사라지고 있습니다. 여기 당신이 도울 수 있는 7가지가 있습니다.</p>
<p><a id="bees-read-more" aria-labelledby="bees-read-more bees-heading">더 보기...</a></p>
여러 엘리먼트들이 aria-labelledby
로 참조되는 경우, 각 참조 된 엘리먼트들의 텍스트 콘텐트는 aria-labelledby
값에 정의된 순서로 연결됩니다.
엘리먼트가 두 번 이상 참조되는 경우, 첫 번째 참조만 처리됩니다.
여러 엘리먼트들의 콘텐트를 연결하는 경우, 브라우저는 선행, 후행 공백을 제거하고 각 엘리먼트의 콘텐트를 단일 공백으로 분리합니다.
<button id="download-button" aria-labelledby="download-button download-details">Download</button>
<span id="download-details">PDF, 2.4 MB</span>
위 예에서, 버튼의 접근 가능한 이름은 "DownloadPDF, 2.4 MB"가 아니라 "Download"와 "PDF" 사이에 공백이 있는 "Download PDF, 2.4 MB"가 될 것입니다.
aria-labelledby
속성(property)은 체이닝 될 수 없습니다. 즉, aria-labelledby
를 가진 엘리먼트가 aria-labelledby
를 가진 다른 엘리먼트를 참조하는 경우, 참조된 엘리먼트의 aria-labelledby
어트리뷰트는 무시될 것입니다.aria-labelledby
에 의해 참조되는 경우, 두 번째 및 이후의 참조는 무시될 것입니다.aria-labelledby
로 이름을 지정하지 않아야 하는 문단이나 목록 항목과 같은 특정 유형의 엘리먼트가 있습니다. 그것들은 역할에 따른 접근 가능한 이름 지정 지침 섹션의 표에 나와있습니다.aria-labelledby
가 자식 콘텐츠로부터 이름 지정을 지원하는 역할(role)의 하나를 가진 엘리먼트에 적용되는 경우, 엘리먼트와 그 엘리먼트의 후손에 포함된 콘텐트는 aria-labelledby
에 의해 참조되지 않는 한, 보조 기술 사용자에게 숨겨집니다.
보조 기술 사용자에게 콘텐트를 숨기는 것이 이로운 드문 경우를 제외하고 이 어트리뷰트를 사용하여 이 엘리먼트들 중 하나의 콘텐트를 무시하게 하는 것을 방지하는 것이 강력하게 권장됩니다.
aria-labelledby
를 가진 엘리먼트의 이름을 계산하는 것은 복잡하고 숨겨진 콘텐트를 참조할 수 있기 때문에, 기대하는 이름이 사용자에게 노출되는지를 보장하도록 보조 기술을 가지고 테스트 하는 것이 특히 중요합니다.
HTML label
엘리먼트는 작성자가 레이블로 제공하는 콘텐트를 식별하고 폼 컨트롤과 연결할 수 있게 합니다.
label
엘리먼트가 폼 컨트롤과 연결 될 경우, 브라우저는 label
콘텐트로부터 폼 컨트롤에 대한 접근 가능한 이름을 계산합니다.
예를 들어, 체크상자와 나란히 표시되는 텍스트는 체크상자와 시각적으로 연결 될 수 있으므로, 시각적 연관성을 인식할 수 있는 사용자에 의해 체크상자 레이블로 이해됩니다.
하지만, 텍스트가 프로그래밍 방식으로 체크상자와 연결되어 있지 않으면, 보조 기술 사용자는 레이블이 없는 체크상자를 경험하게 될 것입니다.
다음과 같이 체크상자와 label
엘리먼트에 체크상자와 레이블 텍스트를 감싸는 것은 체크상자에 접근 가능한 이름을 제공합니다.
<label>
<input type="checkbox" name="subscribe">
뉴스레터 구독
</label>
폼 컨트롤은 label
엘리먼트의 for
어트리뷰트를 사용하여 레이블과 연결될 수도 있습니다.
이는 레이블과 폼 컨트롤이 형제가 되게하거나 DOM에서 부모가 다르지만 폼 컨트롤에 id
어트리뷰트를 추가하는 것을 요구하므로 오류가 발생하게 할 수 있습니다.
가능하다면, 연결을 위해 다음의 for
어트리뷰트 기법 대신 위의 캡슐화 기법을 사용하세요.
<input type="checkbox" name="subscribe" id="subscribe_checkbox">
<label for="subscribe_checkbox">뉴스레터 구독</label>
label
엘리먼트를 사용하는 것은 규칙 2: 보이는 텍스트 선택을 만족시키는 효과적인 기법입니다.
또한 규칙 3: 기본 기술 선택을 만족시킵니다.
네이티브 HTML 레이블은 ARIA 레이블링 기법보다 중요한 사용성과 접근성의 이점을 제공합니다: 브라우저는 자동으로 레이블을 클릭하는 것이 폼 컨트롤을 클릭한 것과 동일하게 합니다.
이는 폼 컨트롤의 누르는 영역을 증가시킵니다.
HTML fieldset
엘리먼트는 폼 컨트롤을 그룹핑하는데 사용될 수 있고, legend
엘리먼트는 그룹에 이름을 제공하는데 사용될 수 있습니다.
예를 들어, 라디오 버튼 그룹은 legend
엘리먼트가 라디오 버튼들에 대한 그룹에 레이블을 지정하는 fieldset
안에 함께 그룹핑 될 수 있습니다.
<fieldset>
<legend>시작 클래스 선택</legend>
<label><input type="radio" name="starter-class" value="green"> Green</label>
<label><input type="radio" name="starter-class" value="red"> Red</label>
<label><input type="radio" name="starter-class" value="blue"> Blue</label>
</fieldset>
이 그룹핑 기법은 다중 선택 문제를 표현하는데 특히 유용합니다. 작성자들이 질문과 답변 그룹을 연결 시킬 수 있게 합니다. 질문이 프로그램적으로 답변 그룹과 연결되지 않는 경우, 보조 기술 사용자는 질문을 알지 못한 채 답변에 접근할 것입니다.
fieldset
과 legend
를 사용하여 다른 유형의 폼 필드를 그룹핑 하고 이름을 지정하는 경우에도 유사한 이점을 얻을 수 있습니다.
<fieldset>
<legend>배송 주소</legend>
<p><label>이름 <input name="name" required></label></p>
<p><label>주소 1 <input name="address-1" required></label></p>
<p><label>주소 2 <input name="address-2"></label></p>
...
</fieldset>
<fieldset>
<legend>청구서 받을 주소</legend>
...
</fieldset>
fieldset
엘리먼트에 이름을 지정하기 위해 legend
엘리먼트를 사용하는 것이 규칙 2: 보이는 텍스트 선택과 규칙 3: 기본 기술 선택을 만족시킵니다.
접근 가능한 이름이 주요 기법들 중 하나 (예를 들어, aria-label
나 aria-labelledby
어트리뷰트) 또는, 네이티브 마크업 기법을 (예를 들어, HTML label
엘리먼트나, HTML img
엘리먼트의 alt
어트리뷰트) 사용하여 제공되지 않은 경우, 브라우저는 대체 매커니즘으로 다른 어트리뷰트로부터 접근 가능한 이름을 계산합니다.
대체 이름 계산으로 사용되는 어트리뷰트는 이름 지정을 위해 의도되지 않았기 때문에, 일반적으로 유효하지 않은 낮은 품질의 접근 가능한 이름을 생성합니다.
따라서, 규칙 4: 브라우저 폴백 방지에 설명된 대로 이 섹션에 설명된 대체 기술 보다 위에서 설명된 명시적 레이블링 기법을 우선하세요.
HTML 엘리먼트는 지정된 title
어트리뷰트를 가질 수 있습니다.
title
어트리뷰트는 엘리먼트의 대체 접근 가능한 이름으로 사용될 수 있습니다.
title
어트리뷰트는 일반적으로 사용자가 포인팅 기기로 엘리먼트 위를 맴돌 때 툴팁으로 시작적으로 표시되어 특별히 쉽게 찾을 수 없고, 포인팅 기기가 없은 시각 사용자에게도 접근 가능하지 않습니다.
예를 들어, 자식 legend
엘리먼트가 없지만 title
어트리뷰트가 있는 fieldset
엘리먼트는 title
어트리뷰트로부터 접근 가능한 이름을 가져옵니다.
<fieldset title="시작 클래스 선택">
<label><input type="radio" name="starter-class" value="green"> Green</label>
<label><input type="radio" name="starter-class" value="red"> Red</label>
<label><input type="radio" name="starter-class" value="blue"> Blue</label>
</fieldset>
HTML input
과 textarea
엘리먼트에 대해, placeholder
어트리뷰트는 다른 (title
어트리뷰트를 포함하여) 레이블을 생성하는 것이 없다면 대체 레이블링 메커니즘으로 사용됩니다.
사용자가 폼 컨트롤에 초점을 주었을 때 시각적으로 사라지지 않기 때문에 label
엘리먼트를 사용하는 것이 더 좋습니다.
<!-- <label>을 사용하는 것이 권장됩니다 -->
<label>검색 <input type=search name=q></label>
<!-- placeholder가 폴백으로 사용됩니다 -->
<input type=search name=q placeholder="검색">
보조 기술 사용자, 특히 스크린리더 사용자의 경우, 접근 가능한 이름의 품질은 사용성에 가장 중요한 기여자 중 하나입니다. 충분한 정보를 제공하지 않는 이름이 사용자의 효과성(effectiveness)을 떨어뜨리는 반면 너무 긴 이름은 효율성(efficiency)을 떨어뜨립니다. 그리고 이해하기 어려운 이름은 효과성(effectiveness), 효율성(efficiency), 흥미를 떨어뜨립니다.
다음 지침은 사용자 친화적인 이름에 대한 시작점을 제공합니다.
X문자처럼 보이는 아이콘이 대화상자를 닫는 경우,
X가 아니라
닫기로 이름을 지정하세요. 유사하게, 왼쪽 사이드바의 내비게이션 링크 세트가 쇼핑몰 사이트의 상품 페이지를 탐색하는 경우, 내비게이션 영역을
왼쪽이 아니라
상품으로 이름을 지정하세요.
편집,
삭제,
작업버튼을 표기하는 경우,
편집 John Doe,
삭제 John Doe,
작업 John Doe가
John Doe 수정,
John Doe 삭제,
John Doe 작업보다 더 좋은 접근 가능한 이름일 것 입니다. 이름의 처음에 동사를 배치하여, 스크린리더 사용자는 더 쉽고 빠르게 John Doe에 대한 연락처 카드를 여는 엘리먼트뿐 아니라 다른 것들로부터 버튼을 구별할 수 있습니다.
버튼이라는 단어를 포함 시키거나, 이미지 이름에
이미지라는 단어를 포함시키거나, 내비게이션 영역 이름에
내비게이션이라는 단어를 포함시키지 마세요. 그렇게 하는 것은 스크린리더가 이름에 엘리먼트의 역할(role)을 추가로 전달하므로 스크린리더 출력이 중복되게 만들게 됩니다.
어떤 엘리먼트는 항상 이름을 요구하고, 어떤 엘리먼트는 보통 또는 종종 이름을 요구하고, 그러나 어떤 엘리먼트들은 결코 이름이 지정되지 않아야 합니다. 다음 표는 ARIA 역할(role)을 나열하고 각각에 대한 다음 정보를 제공합니다:
aria-label
나 aria-labelledby
가 적용된 경우, 엘리먼트와 엘리먼트의 후손에 포함된 콘텐트는 aria-labelledby
에 의해 다시 참조되지 않는 한 보조 기술 사용자에게 숨겨집니다.
그렇게 하는 것이 보조 기술 사용자에게 도움이 되는 드문 경우를 제외하고 후손 콘텐트가 숨겨지는 것을 방지하세요.
역할(role) | 이름 지정 필요성 | 지침 |
---|---|---|
alert |
재량 |
일부 스크린리더는 경고 콘텐트를 낭독하기 전에 경로 이름을 낭독합니다.
따라서, aria-label 은 경고의 내용으로 표시되지 않는 텍스트로 경고의 가시적 콘텐트에 대한 말문을 여는 방법을 제공합니다.
aria-label 을 사용하는 것은, alert 엘리먼트의 aria-label 을 지원하지 않는 스크린리더에서는 오프스크린(off-screen) 텍스트가 낭독 될 것이라는 것을 제외하고, 경고 콘텐트의 오프스크린(off-screen) 텍스트를 제공하는 것과 기능적으로 동일합니다.
|
alertdialog |
필수 | 시각적으로 보이는 레이블이 존재하는 경우 aria-labelledby 를, 그렇지 않으면 aria-label 을 사용하세요. |
application |
필수 | 시각적으로 보이는 레이블이 존재하는 경우 aria-labelledby 를, 그렇지 않으면 aria-label 을 사용하세요. |
article |
권장 |
|
banner |
재량 |
|
blockquote |
재량 |
시각적으로 보이는 레이블이 존재하는 경우, aria-labelledby 를 사용하여 인용구를 연결시키는 것은 일부 보조 기술 사용자들에게 이로울 수 있습니다.
|
button |
내용이 불충분한 경우에만 필요 |
|
caption |
금지 | |
cell |
내용이 불충분한 경우에만 필요 |
|
checkbox |
내용이 불충분한 경우에만 필요 |
|
code |
금지 | |
columnheader |
내용이 불충분한 경우에만 필요 |
|
combobox |
필수 |
|
complementary |
권장 |
|
contentinfo |
재량 |
|
definition |
권장 | aria-labelledby 를 사용하여, role="term" 를 가진 정의되는 용어를 참조시키세요. |
deletion |
금지 | |
dialog |
필수 | 시각적으로 보이는 레이블이 존재하는 경우 aria-labelledby 를, 그렇지 않으면 aria-label 을 사용하세요. |
directory |
재량 |
|
document |
재량 |
document 역할(role)을 가진 엘리먼트는 application 역할(role)을 가진 엘리먼트 내에 포함되며, 이름을 가져야 할 필요가 있습니다.
일반적으로, application 엘리먼트의 이름은 document 엘리먼트에 대한 충분한 컨텍스트와 정체성을 제공할 것입니다.
application 엘리먼트는 흔치 않은 사용자 정의 위젯을 생성하는데에만 사용되기 때문에, 주의 깊은 평가가 접근 가능한 이름을 추가할지의 여부가 유익한지 결정하는데 필요합니다.
|
emphasis |
금지 | |
feed |
권장 |
|
figure |
권장 |
|
form |
권장 |
|
generic |
금지 | |
grid |
권장 |
|
gridcell |
내용이 불충분한 경우에만 필요 |
|
group |
재량 |
|
heading |
내용이 불충분한 경우에만 필요 |
|
insertion |
금지 | |
img |
필수 | HTML img 엘리먼트의 경우, alt 어트리뷰트를 사용하세요. img 역할(role)을 가진 다른 엘리먼트의 경우, aria-labelledby 나 aria-label 을 사용하세요. |
link |
내용이 불충분한 경우에만 필요 |
|
list |
재량 |
|
listbox |
필수 |
|
listitem |
이름을 지정하지 말것 | 이름 지정이 보조 기술에 의해 지원되지 않습니다; 목록 항목 내에 관련 내용을 포함시켜야 합니다. |
log |
재량 |
일부 스크린리더는 log 엘리먼트의 콘텐트를 낭독하기 전에 log 엘리먼트의 이름을 낭독합니다.
따라서, aria-label 은 로그 엘리먼트의 부분으로 노출되지 않는 텍스트로 log 엘리먼트의 보이는 콘텐트를 미리 나타내는 방법을 제공합니다.
aria-label 을 사용하는 것은 log 엘리먼트에 aria-label 을 지원하지 않는 스크린리더에서는 오프스크린(off-screen) 텍스트가 낭독 될 것이라는 것을 제외하고, log 엘리먼트의 콘텐트의 오프스크린(off-screen) 텍스트를 제공하는 것과 기능적으로 동일합니다.
|
main |
재량 |
|
marquee |
재량 | 시각적으로 보이는 레이블이 존재하는 경우 aria-labelledby 를, 그렇지 않으면 aria-label 을 사용하세요. |
math |
권장 |
|
menu |
권장 |
|
menubar |
권장 |
|
menuitem |
내용이 불충분한 경우에만 필요 |
|
menuitemcheckbox |
내용이 불충분한 경우에만 필요 |
|
menuitemradio |
내용이 불충분한 경우에만 필요 |
|
meter |
필수 |
|
navigation |
권장 |
|
none |
금지 | role="none" 을 가진 엘리먼트는 (오류 케이스를 제외하고) 접근성 트리의 일부가 아닙니다. aria-labelledby 나 aria-label 을 사용하지 마세요. |
note |
재량 |
|
option |
내용이 불충분한 경우에만 필요 |
|
paragraph |
금지 | |
presentation |
금지 | role="presentation" 을 가진 엘리먼트는 (오류 케이스를 제외하고) 접근성 트리의 일부가 아닙니다. aria-labelledby 나 aria-label 을 사용하지 마세요. |
progressbar |
필수 |
|
radio |
내용이 불충분한 경우에만 필요 |
|
radiogroup |
필수 |
|
region |
필수 |
|
row |
내용이 불충분하고
treegrid 의 후손이며 행이 focusable한
경우에만 필수
|
row 엘리먼트가 treegrid에서 초점을 얻을 수 있는 경우, 스크린리더는 행으로 탐색하는 경우 행의 전체 콘텐트를 낭독합니다.
이것이 일반적으로 가장 적절한 동작입니다.
하지만, 어떤 상황에서, 셀이 낭독되는 순서를 변경하거나 낭독할 셀을 지정하기위해 aria-labelledby 를 사용하여 특정 셀의 낭독을 제외시키는 것이 유리할 수 있습니다.
|
rowgroup |
이름을 지정하지 말것 | 이름 지정이 보조 기술에 의해 지원되지 않습니다. |
rowheader |
내용이 불충분한 경우에만 필요 |
|
scrollbar |
재량 |
|
search |
권장 |
|
searchbox |
필수 |
|
separator |
재량 |
|
slider |
필수 |
|
spinbutton |
필수 |
|
status |
재량 |
일부 스크린리더는 status 엘리먼트의 콘텐트를 낭독하기 전에 status 엘리먼트의 이름을 낭독합니다.
따라서, aria-label 은 status 엘리먼트의 부분으로 노출되지 않는 텍스트로 로그 엘리먼트의 보이는 콘텐트를 미리 나타내는 방법을 제공합니다.
aria-label 을 사용하는 것은 status 엘리먼트에 aria-label 을 지원하지 않는 스크린리더에서는 오프스크린(off-screen) 텍스트가 낭독 될 것이라는 것을 제외하고, status 엘리먼트의 콘텐트의 오프스크린(off-screen) 텍스트를 제공하는 것과 기능적으로 동일합니다.
|
strong |
금지 | |
subscript |
금지 | |
superscript |
금지 | |
switch |
내용이 불충분한 경우에만 필요 |
|
tab |
내용이 불충분한 경우에만 필요 |
|
table |
필수 |
|
tablist |
권장 |
|
tabpanel |
필수 |
|
term |
이름을 지정하지 말것 | term은 일반적으로 role="definition" 엘리먼트에 대한 이름이기 때문에, 용어 자체가 이름을 또 가지면 혼동 될 수 있습니다. |
textbox |
필수 |
|
time |
이름을 지정하지 말것 | 이름 지정이 보조 기술에 의해 지원되지 않습니다. |
timer |
재량 |
일부 스크린리더는 timer 엘리먼트의 콘텐트를 낭독하기 전에 timer 엘리먼트의 이름을 낭독합니다.
따라서, aria-label 은 timer 엘리먼트의 부분으로 노출되지 않는 텍스트로 timer 엘리먼트의 보이는 콘텐트를 미리 나타내는 방법을 제공합니다.
aria-label 을 사용하는 것은 timer 엘리먼트에 aria-label 을 지원하지 않는 스크린리더에서는 오프스크린(off-screen) 텍스트가 낭독 될 것이라는 것을 제외하고, timer 엘리먼트의 콘텐트의 오프스크린(off-screen) 텍스트를 제공하는 것과 기능적으로 동일합니다.
|
toolbar |
권장 |
|
tooltip |
내용이 불충분한 경우에만 필요 |
|
tree |
필수 |
|
treegrid |
필수 |
|
treeitem |
내용이 불충분한 경우에만 필요 |
|
유저 에이전트는 잠재적인 이름 지정 방법의 목록을 단계별로 통과하면서 이름을 생성하는 첫 방법을 사용하여 엘리먼트에 대한 접근 가능한 이름 문자열을 구성합니다. 이 알고리즘은 접근 가능한 이름 명세에 정의되어 있습니다. 대략 다음과 같습니다:
aria-labelledby
속성(property)이 있다면 이것이 사용됩니다.
이름이 여전히 비어있다면, aria-label
속성(property)이 있다면 이것이 사용됩니다.
이름이 여전히 비어있다면, 호스트-언어별 어트리뷰트나 엘리먼트가 존재한다면 이것이 사용됩니다. HTML의 경우, 엘리먼트에 따라 다음과 같습니다:
type
어트리뷰트가 Button, Submit Button, 또는 Reset Button 상태에 있는 input
value
어트리뷰트.type
어트리뷰트가 Image Button 상태에 있는 input
img
area
alt
어트리뷰트. fieldset
legend
엘리먼트.label
엘리먼트(들).figure
figcaption
엘리먼트.table
caption
엘리먼트.이름이 여전히 비어있다면, 자식 콘텐츠로부터 이름 지정을 지원하는 역할(role)을 가진 엘리먼트의 경우, 엘리먼트의 콘텐트가 사용됩니다.
마지막으로, 이름이 여전히 비어있다면, 다른 폴백 호스트-언어별 어트리뷰트나 엘리먼트가 존재한다면 이것이 사용됩니다. HTML의 경우, 엘리먼트에 따라 다음과 같습니다:
type
어트리뷰트가 Text, Password, Search, Telephone, 또는 URL 상태에 있는 input
textarea
title
어트리뷰트. 그렇지 않으면, placeholder
어트리뷰트.type
어트리뷰트가 Submit Button 상태에 있는 input
type
어트리뷰트가 Reset Button 상태에 있는 input
type
어트리뷰트가 Image Button 상태에 있는 input
title
어트리뷰트. 그렇지 않으면, 문구 "Submit Query"의 지역화 된 문자열.summary
title
어트리뷰트마지막 단계는 폴백 메커니즘입니다. 일반적으로 엘리먼트에 레이블을 지정할 때는, 폴백이 아닌 메커니즘 중 하나를 사용하세요.
콘텐트로부터 이름을 계산하는 경우, 유저 에이전트는 아래 기술 된 대로 treeitem
과 menuitem
의 경우를 제외하고 모든 후손 노드를 단계별로 통과합니다.
그리고, aria-labelledby
어트리뷰트의 참조를 따르는 경우, 마찬가지로 각 참조된 엘리먼트의 트리를 통과합니다.
따라서, 이름 지정 알고리즘은 재귀적입니다.
다음 두 섹션은 알고리즘이 작동하는 방법의 비재귀 및 재귀 예제를 설명합니다.
treeitem
역할(role)에 대한 콘텐트로부터 이름을 계산하는 경우, 자식 group
엘리먼트의 후손 콘텐트는 포함되지 않습니다.
예를 들어, 다음 tree
에서, 첫 번째 트리 항목의 이름은 과일
입니다; 사과
, 바나나
, 오렌지
는 자동으로 생략됩니다.
<ul role="tree">
<li role="treeitem">과일
<ul role="group">
<li role="treeitem">사과</li>
<li role="treeitem">바나나</li>
<li role="treeitem">오렌지</li>
</ul>
</li>
</ul>
비슷하게, menuitem
역할(role)에 대한 콘텐트로부터 이름을 계산하는 경우, 자식 menu
엘리먼트의 후손 콘텐트는 포함되지 않습니다.
따라서, 다음 menu
위 첫 번째 부모 menuitem
의 이름은 과일
입니다.
<ul role="menu">
<li role="menuitem">과일
<ul role="menu">
<li role="menuitem">사과</li>
<li role="menuitem">바나나</li>
<li role="menuitem">오렌지</li>
</ul>
</li>
</ul>
연결된 label
엘리먼트가 없고 name
어트리뷰트만 있어서 접근 가능한 이름이 없는 input
를 가정해보세요 (이렇게 하지 마세요):
<input name="code">
placeholder
어트리뷰트가 있다면, 이름 지정 폴백 메커니즘으로 제공됩니다 (이렇게 하지 마세요):
<input name="code"
placeholder="One-time code">
또한 title
어트리뷰트가 존재하는 경우, 이것이 placeholder
대신 접근 가능한 이름으로 사용되지만, 여전히 폴백입니다 (이렇게 하지 마세요):
<input name="code"
placeholder="123456"
title="One-time code">
또한 label
엘리먼트가 존재하는 경우 (추천), 그것이 접근 가능한 이름으로 사용되고, title
어트리뷰트는 접근 가능한 설명으로 대신 사용됩니다:
<label>One-time code
<input name="code"
placeholder="123456"
title="Get your code from the app.">
</label>
또한 aria-label
어트리뷰트가 존재하는 경우 (보조 기술 사용자에게 명확성을 더해주기 위해서가 아닌 이상 추천되지 않습니다), 그것이 label
엘리먼트를 대체하여 접근 가능한 이름이 될 것입니다:
<label>Code
<input name="code"
aria-label="One-time code"
placeholder="123456"
title="Get your code from the app.">
</label>
또한 aria-labelledby
어트리뷰트가 존재하는 경우, 다른 엘리먼트와 어트리뷰트보다 우위에 섭니다 (aria-label
어트리뷰트는 사용되지 않을 경우 제거 되어야 합니다):
<p>Please fill in your <span id="code-label">one-time code</span> to log in.</p>
<p>
<label>Code
<input name="code"
aria-labelledby="code-label"
aria-label="This is ignored"
placeholder="123456"
title="Get your code from the app.">
</label>
</p>
접근 가능한 이름 계산 알고리즘은 필요할 때 재귀적으로 호출 될 것입니다. aria-labelledby
참조는 알고리즘이 재귀적으로 호출되도록 하고, 콘텐트로부터 접근 가능한 이름을 계산할 때 알고리즘은 각 자식 노드에 대해 재귀적으로 호출됩니다.
이 예에서, 버튼에 대한 레이블은 각 자식 노드로 재귀하여 계산된 결과 휴지통으로 이동
입니다.
<button><img src="bin.svg" alt="휴지통">으로 이동</button>
aria-labelledby
참조를 따를 때, 알고리즘은 무한 루프를 방지하기 위해 동일한 참조를 두 번 따르는 것을 방지합니다.
이 예에서, 버튼에 대한 레이블은 우선 aria-labelledby
가 참조하는 부모 엘리먼트를 따라 계산되고, 이후 자식 노드들로부터 그 엘리먼트에 대한 레이블을 계산하여 먼저 button
엘리먼트를 다시 방문하지만 aria-labelledby
참조를 무시하고 대신 aria-label
을 사용하고, 이후 다음 자식 (테스트 노드)를 방문하여 계산됩니다. 결과 레이블은 회의 삭제: 일일 상태 보고서
입니다.
<div id="meeting-1">
<button aria-labelledby="meeting-1" aria-label="회의 삭제:">X</button>
일일 상태 보고서
</div>
aria-describedby
속성(property)은 aria-labelledby
속성(property)과 비슷하게 동작합니다.
예를 들어, 버튼은 형태 단락에 의해 설명 될 수 있습니다.
<button aria-describedby="trash-desc">휴지통으로 이동</button>
...
<p id="trash-desc">휴지통의 항목은 30일 후 영구적으로 제거될 것입니다.</p>
설명은 텍스트 문자열로 조정 됩니다. 예를 들어, 설명이 img
엘리먼트를 포함하는 경우, 이미지에 해당하는 텍스트가 계산됩니다.
<button aria-describedby="trash-desc"> <img src="bin.svg" alt="휴지통">으로 이동</button>
...
<p id="trash-desc"><img src="bin.svg" alt="휴지통">의 항목은 30일 후 영구적으로 제거 될 것입니다.</p>
aria-labelledby
와 마찬가지로, 엘리먼트가 숨겨져 있어도 aria-describedby
를 사용하여 엘리먼트를 참조할 수 있습니다.
예를 들어, 양식의 텍스트 필드는 기본적으로 숨겨진 설명을 가질 수 있지만, 공개 위젯을 사용하여 요청 시 나타낼 수 있습니다.
설명은 aria-describedby
로 직접적으로 텍스트 필드로부터 참조될 수도 있습니다.
다음 예에서, input
엘리먼트에 대한 접근 가능한 설명은 username은 이 서비스에 로그인하는데 사용되는 이름입니다.
입니다.
<label for="username">Username</label>
<input id="username" name="username" aria-describedby="username-desc">
<button aria-expanded="false" aria-controls="username-desc" aria-label="Help about username">?</button>
<p id="username-desc" hidden>
username은 이 서비스에 로그인하는데 사용되는 이름입니다.
</p>
접근 가능한 설명이 aria-describedby
어트리뷰트를 사용하여 또는 주 호스트 언어별 어트리뷰트나 엘리먼트 중 하나를 (예를 들어, table
에 대한 caption
엘리먼트) 사용하여 제공되지 않았다면, HTML의 경우 엘리먼트가 title
어트리뷰트를 가지고 있다면 그것이 접근 가능한 설명으로 사용됩니다.
aria-describedby
와 함께 가시적으로 보이는 설명이 일반적으로 권장됩니다. 보이지 않는 설명이 필요한 경우, 접근 가능한 설명을 가질 수 있는 HTML 엘리먼트에 대해, title
어트리뷰트가 사용될 수 있습니다.
title
어트리뷰트는 일부 사용자, 특히 hover를 지원하는 포인팅 기기 (예를 들어, 마우스)를 사용하지 않고 스크린리더를 사용하지 않는 정상 시력 사용자에게 접근 가능하지 않을 수 있음을 주의하세요
예를 들어, pattern
어트리뷰트를 사용하여 제한된 입력을 가지는 input
엘리먼트는 예상되는 입력이 무엇인지를 설명하도록 title
어트리뷰트를 사용 할 수 있습니다.
<label> 부품 번호:
<input pattern="[0-9][A-Z]{3}" name="part"
title="부품 번호는 숫자 다음에 대문제 3개가 오는 숫자입니다."/>
</label>
이 경우 title
어트리뷰트는 사용자가 컨트롤에 호버하거나 초점을 줄 때 툴팁으로 사용자에게 보여질 수 있지만, 유저 에이전트가 양식을 검증할 때 input
엘리먼트의 값이 pattern
과 일치하지 않는 경우 오류 메세지의 일부로도 보여질 수 있습니다.
다른 예로, 링크는 title
어트리뷰트를 링크를 보다 자세히 설명하는데 사용할 수 있습니다.
<a href="http://twitter.com/W3C"
title="W3C 트위터를 팔로우 하세요">
<img src="/2008/site/images/Twitter_bird_logo_2012.svg"
alt="트위터" class="social-icon" height="40" />
</a>
접근 가능한 이름 계산과 같이, 접근 가능한 설명 계산은 테스트 문자열을 생성합니다.
접근 가능한 설명 계산 알고리즘은 이름이나 설명이 계산 여부에 따라 몇 가지 지점을 제외하고 접근 가능한 이름 계산 알고리즘과 동일합니다.
특히, 접근 가능한 설명을 위해 텍스트를 누적할 경우, 알고리즘은 aria-labelledby
대신 aria-describedby
를 사용합니다.
유저 에이전트는 잠잭적인 설명 방법의 목록을 단계별로 통과하면서 설명을 생성하는 첫 방법을 사용하여 엘리먼트에 대해 접근 가능한 설명 문자열을 구성합니다. 이 알고리즘은 접근 가능한 이름 명세에 정의되어 있습니다. 대략 다음과 같습니다:
aria-describedby
속성(property)이 있다면 이것이 사용됩니다.
설명이 여전히 비어있다면, 호스트 언어별 어트리뷰트나 엘리먼트가 존재한다면, 그것이 접근 가능한 이름으로 이미 사용되지 않았다면, 이것이 사용됩니다. HTML의 경우, 엘리먼트에 다라 다음과 같습니다:
type
어트리뷰트가 Button, Submit Button, 또는 Reset Button 상태에 있는 input
value
어트리뷰트.summary
table
caption
엘리먼트.마지막으로 설명이 여전히 비어있다면, 다른 호스트 언어별 어트리뷰트나 엘리먼트가 있고, 그것이 접근 가능한 이름으로 이미 사용 되지 않았다면 이것이 사용됩니다. HTML의 경우 이것은 title
어트리뷰트입니다.
네이티브 HTML 양식 엘리먼트들과 달리, 브라우저는 ARIA로 접근 가능하게 만들어진 그래픽 유저 인터페이스(GUI) 컴포넌트에 대한 키보드 지원을 제공하지 않습니다; 작성자는 코드에 키보드 지원을 제공해야 합니다. 이 섹션은 메뉴와 그리드 같은 ARIA 위젯 뿐 아니라 키보드로 운용할 수 있는 툴바와 대화상자 같은 인터랙티브 컴포넌트를 포함하는 웹 페이지의 기능을 만드는 원칙과 방법을 설명합니다. 초점 관리의 기본 사항과 함께, 이 섹션은 키보드 사용자들에게 다른 사람들이 사용할 수 있는 경험 만큼 효율적이고 즐거운 경험을 제공한다는 목표에 대한 지침을 제공합니다.
이 섹션은 다음을 다룹니다:
이 섹션을 완료하기 위한 작업은 issue 217에서 추적됩니다.
키보드로 조작할 경우, 좋은 경험의 두 가지 필수 요소는 키보드 초점의 위치를 쉽게 식별할 수 있고 탐색 키가 눌린 후 초점이 놓인 위치를 예측 할 수 있는 기능입니다. 다음 요인들은 웹 페이지가 사용자에게 이러한 기능을 제공하는 정도에 영향을 줍니다.
경우에 따라, 동시에 한 페이지에 두 엘리먼트가 초점을 가지는 것처럼 나타날 수 있습니다. 예를 들어, 다중 선택 목록상자에서, 옵션 항목이 선택되는 경우 회색으로 표시 될 것입니다. 그러나, 초점 표시기는 선택 될 수 있는 다른 옵션 항목으로 여전히 이동 될 수 있습니다. 마찬가지로, 사용자가 탭 목록에서 탭을 활성화시키면, 선택된 상태가 탭에 설정되고 시각적 모양이 변경됩니다. 하지만 사용자는 탭이 선택 된 모양과 상태를 유지하면서 페이지의 다른 곳으로 초점 포시기를 이동하면서 여전히 탐색 할 수 있습니다.
초점과 선택은 상당히 다릅니다. 키보드 사용자의 관점에서, 초점은 마우스 포인터와 같은 포인터 입니다; 탐색 경로를 추적합니다. 초점 포인트는 항상 하나 뿐이며 모든 작업은 초점 포인트에서 이루어집니다. 반면에, 선택은 목록상자, 트리, 탭 목록과 같은 일부 위젯에서 수행될 수 있는 작업입니다. 위젯이 단 한 개 선택만 지원하는 경우, 단 한 개 항목만 선택 가능하고 초점이 위젯 내부를 이동할 때 선택 된 상태가 단순히 초점을 따라가는 경우가 많습니다. 즉, 일부 위젯에서, 초점 이동이 선택 작업을 수행 할 수도 있습니다. 하지만, 위젯이 다중 선택을 지원하는 경우, 선택된 상태는 한 개 이상이 될 수 있고, 초점 이동에 대한 키는 선택을 수행하지 않습니다. 일부 다중 선택 위젯은 초점 이동과 선택 변경 키 명령을 지원하지만, 이러한 키는 일반 탐색 키와는 다릅니다. 마지막으로 초점이 선택된 엘리먼트를 포함하는 위젯을 떠날 때, 선택 된 상태는 지속됩니다.
개발자 관점에서, 차이점은 간단합니다 -- 초점을 얻은 엘리먼트는 활성 엘리먼트 (document.activeElement)입니다.
선택된 엘리먼트는 aria-selected="true"
를 가지는 엘리먼트입니다.
초점과 선택 된 상태와 관련하여, 디자이너와 개발자에게 중요한 고려사항은 다음과 같습니다:
탭 목록이나 단일 선택 목록상자와 같이 단 하나의 엘리먼트만 선택 될 수 있는 복합 위젯에서, 초점 이동은 초점을 얻은 엘리먼트가 선택 된 엘리먼트가 되게 할 수 있습니다. 이를 초점을 따라 선택 되도록 하는 것이라고 합니다. 초점을 따라 선택 되도록 하는 것은 종종 사용자에게 유익하지만, 일부 상황에서는 접근성에 매우 해롭습니다.
예를 들어, 탭 목록에서, 선택 상태는 패널이 노출되어 있음을 나타내는데 사용 됩니다. 따라서, 탭 목록에서 선택이 초점을 따르는 경우, 한 탭에서 다른 탭으로 초점 이동은 자동으로 노출되는 패널을 변경시킵니다. DOM에 패널의 콘텐츠가 존재한다면, 새로운 패널의 노출은 거의 즉시 이루어집니다. 6개 탭 중 4번째 탭을 노출시키기 원하는 키보드 사용자는 오른쪽 키를 3번 빠르게 눌러 그렇게 할 수 있습니다. 그리고 탭의 레이블을 탐색하여 인식하는 스크린리더 사용자는 대기 시간 없이 전체 탭 목록을 효율적을 읽을 수 있습니다.
반면에, 새로운 패널을 노출시키는 것이 네트워크 요청을 발생시키고 페이지가 갱신(refresh) 될 수 있는 경우, 초점을 따라 자동으로 선택되게 하는 것은 키보드와 스크린리더 사용자의 경험을 파괴할 수 있습니다. 이 경우, 네 번째 탭을 표시하거나 탭 목록을 읽는 것은 사용자가 각 초점의 이동과 함께 상당한 지연 시간을 경험하기 때문에 지루하고 시간을 낭비하는 작업이 됩니다. 게다가, 새 탭이 페이지를 갱신하면 사용자는 새 페이지가 로드 될 때까지 기다려야 할 뿐만 아니라 탭 목록으로 초점을 다시 보내야 합니다.
선택이 초점을 따르지 않는 경우, 사용자는 Enter나 Space 키를 눌러 선택 된 엘리먼트를 변경합니다.
6.1 핵심 키보드 탐색 규칙 섹션에 설명된 대로, 모든 대화형 UI 컴포넌트는 키보드를 통해 접근 할 수 있어야 합니다. 이것은 탭 시퀀스에 그것들을 포함시키거나 탭 시퀀스에 있는 컴포넌트에 (예를 들어, 복합 컴포넌트의 일부) 접근 할 수 있도록 함으로써 가장 잘 달성됩니다. 이 섹션에서는 탭 시퀀스를 만들고 관리하는 방법을 다루고, 이후 섹션에서는 컴포넌트 내에 포함된 초점을 얻을 수 있는(focusable) 엘리먼트가 키보드 접근 가능하도록 하는 내용을 다룹니다.
[HTML] tabindex와 [SVG2] tabindex 어트리뷰트는 탭 시퀀스에 엘리먼트를 추가하거나 제거하는데 사용될 수 있습니다. tabindex 값은 탭 시퀀스 순서에도 영향을 미칠 수도 있지만, 그 목적으로 tabindex를 사용하지 않는 것을 강력히 권합니다.
HTML 에서, 웹 페이지의 기본 탭 시퀀스는 maxOS에서는 form 엘리먼트만 포함하는 것을 제외하고, 링크와 form 엘리먼트만 포함합니다. macOS 시스템 환경 설정에는 탭 키가 모든 초점을 얻을 수 있는(focusable) 엘리먼트로 초점을 이동할 수 있는 키보드 설정이 포함되어 있습니다.
탭 시퀀스의 기본 엘리먼트 순서는 DOM의 엘리먼트 순서입니다. DOM 순서는 또한 스크린리더 낭독 순서를 결정합니다. 이는 6.2 식별 가능하고 예측 가능한 키보드 초점에 기술된 대로 키보드 탭 시퀀스와 스크린리더 낭독 순서를 정렬되고, 논리적이고, 예측 가능하게 유지하는데 중요합니다. 읽기 순서와 함께 정렬을 유지하면서 탭 시퀀스 순서를 조작하는 모든 브라우저에서 현재 사용 가능한 가장 강력한 방법은 DOM에서 엘리먼트를 재정렬 하는 것입니다.
tabindex 어트리뷰트 값은 다음 효과를 가집니다.
6.1 핵심 키보드 탐색 규칙 섹션에 기술된 대로, 탭 시퀀스는 단 하나의 복합 UI 컴포넌트의 초점을 얻을 수 있는(focusable) 엘리먼트만 포함해야 합니다. 일단 복합 컴포넌트가 초점을 포함하면, Tab과 Shift + Tab 이외의 키들로 사용자가 복합 컴포넌트의 초점을 얻을 수 있는(focusable) 엘리먼트 간에 초점 이동을 할 수 있게 합니다. 작성자는 복합 컴포넌트 내부에서 초점을 이동시키는 키를 자유롭게 선택할 수 있지만, 3. 설계 패턴과 위젯에 설명 된 대로 공통 GUI 운영 체제의 유사한 컴포넌트와 동일한 키 바인딩을 사용하는 것을 강력히 권합니다.
Tab 키 이벤트의 결과로 초점을 얻을 때 복합 컴포넌트 내 초점을 얻을 위치에 대한 규칙은 복합 컴포넌트의 유형에 따라 다릅니다. 일반적으로 다음 중 하나입니다.
다음 섹션에서는 복합 엘리먼트에서 초점을 관리하기 위한 두가지 전략: 이동(roving) tabindex 생성과 aria-activedescendant 속성(property) 사용에 대해 설명합니다.
복합 UI 컴포넌트에서 초점을 관리하기 위해 이동 tabindex를 사용하는 경우, 탭 시퀀스에 포함 되어야 할 엘리먼트는 0 값의 tabindex를 가지고 복합 컴포넌트의에 포함 된 다른 모든 초점을 얻을 수 있는(focusable) 엘리먼트는 -1 값의 tabindex를 가집니다. 이동 tabindex 전략에 대한 알고리즘은 다음과 같습니다.
tabindex="0"
를 설정하고 포함 된 다른 모든 초점을 얻을 수 있는(focusable) 엘리먼트에 tabindex="-1"
을 설정하세요.tabindex="0"
를 가진 엘리먼트에 tabindex="-1"
를 설정하세요.tabindex="0"
를 설정하세요.tabindex="0"
를 가진 엘리먼트에 element.focus()
로 초점을 설정하세요.tabindex="0"
를 가지고 있는지 확인하세요.
그렇지 않으면, 대상 엘리먼트에 tabindex="0"
를 설정하고 이전에 tabindex="0"
를 가졌던 엘리먼트에 tabindex="-1"
을 설정하세요.
초점을 관리하기 위해 aria-activedescendant 보다 이동 tabindex 사용의 한 가지 이점은 유저 에이전트가 새롭게 초점을 얻은 엘리먼트를 뷰(view)로 스크롤 한다는 것입니다.
컴포넌트 컨테이너가 aria-activedescendant 속성을 지원하는 ARIA 역할(role)을 가지는 경우, tabindex 어트리뷰트를 관리하고 컨테이너 내에 초점을 얻을 수 있는(focusable) 엘리먼트 간에 DOM 초점을 이동시킬 필요가 없습니다. 대신, 컨테이너 엘리먼트만 탭 시퀀스에 포함되면 됩니다. 컨테이너가 DOM 초점을 가지는 경우, 컨테이너의 aria-activedescendant 값은 위젯에서 활성화 되는 엘리먼트를 보조 기술에 알려줍니다. 보조 기술은 DOM 초점이 aria-activedescendant 속성(property)를 가진 엘리먼트에 있다 하더라도 활성화 된 것으로 참조되는 엘리먼트를 초점을 얻은 엘리먼트라고 간주할 것입니다. 그리고, aria-activedescendant 값이 변경될 때, 보조 기술은 DOM 초점이 실제로 이동될 때 받는 것과 동일한 초점 변경 이벤트를 받을 것입니다.
초점 관리의 aria-activedescendant 사용 방법 단계는 다음과 같습니다.
aria-activedescendant="IDREF"
가집니다.
참조 된 엘리먼트는 아래 설명된 DOM 관계 요구 사항을 충족해야 합니다.
aria-activedescendant에 대한 명세는 aria-activedescendant 어트리뷰트를 가진 초점을 얻은 엘리먼트와 어트리뷰트 값에 의해 활성으로 참조되는 엘리먼트 간의 DOM 관계에 중요한 제한 사항을 둡니다. 다음 세 가지 조건 중 하나가 충족되어야 합니다.
기본적으로 비활성화 된 HTML input 엘리먼트는 탭 시퀀스에서 제거됩니다. 대부분의 상황에서, 일반적인 예상은 비활성화 된 인터랙티브 엘리먼트는 초점을 얻을 수 없다는 것입니다. 하지만, 비활성화 된 엘리먼트가 초점을 얻을 수 있는 것이 일반적인 상황이 있습니다, 특히 복합 위젯 내부에서. 예를 들어, 3.15 Menu or Menu bar 패턴에서 보여지는 것처럼, 비활성화 된 항목이 방향키로 메뉴를 탐색할 때 초점을 얻을 수 있습니다.
비활성화 된 엘리먼트에서 초점 가능성을 제거하는 것은 사용자에게 장점과 단점을 모두 제공할 수 있습니다. 키보드 사용자가 비활성화 된 엘리먼트를 건너 뛰는 것을 허용하는 것은 일반적으로 작업을 완료하는데 필요한 키 누름 회수를 줄입니다. 하지만, 비활성화 된 엘리먼트로의 이동으로부터 초점을 차단하는 것은 초점 이동을 통해 "보는" 스크린리더 사용자에게 해당 엘리먼트의 존재를 숨기게 될 수 있습니다.
작성자는 비활성화 된 엘리먼트의 초점 가능성에 대해 일관된 규칙을 채택하도록 권장됩니다. 이 지침의 예는 일반적인 사례를 반영하고 우선순위를 조정하려고 시도하는 다음 규칙을 채택합니다.
비활성화 된 엘리먼트를 키보드 초점 경로에 포함시키는 것의 영향을 완화시키는 한 가지 설계 기법은 6.9 키보드 단축키에 기술 된 대로 적절한 단축키를 사용하는 것입니다.
다음의 키 할당은 전통적으로 연관된 기능이 적절한 모든 컨텍스트에서 사용될 수 있습니다. Windows와 Linux 플램폼과 관련 된 할당은 macOS에서 실행되는 브라우저에서 구현되고 사용될 수 있지만, macOS 기기에서 실행되는 브라우저에서 macOS 할당으로 그것들을 대체하는 것은 그 사용자들에 대해 키보드 인터페이스를 보다 쉽게 찾게 할 수 있고 직관적으로 만들 수 있습니다. 경우에 따라, 시스템이나 브라우저 키보드 충돌을 방지하는데 도움이 될 수도 있습니다.
기능 | Windows/Linux 키 | macOS 키 |
---|---|---|
컨텍스트 메뉴 열기 | Shift + F10 | |
클립보드에 복사 | Control + C | Command + C |
클립보드에서 붙여 넣기 | Control + V | Command + V |
클립보드로 잘라내기 | Control + X | Command + X |
마지막 작업 되돌리기 | Control + Z | Command + Z |
작업 다시 실행 | Control + Y | Command + Shift + Z |
효과적으로 설계 된 경우, 엘리먼트에 초점을 주거나, 위젯을 활성화 시키는 키보드 단축키는 페이지나 사이트의 자주 사용되는 기능의 사용성을 극적으로 향상시킬 수 있습니다. 이 섹션은 다음을 포함하여 효율성에 가장 큰 영향을 미치는 키보드 단축키 설계와 구현 요소에 대해 설명합니다:
이 섹션은 키보드 단축키를 할당할 엘리먼트 및 기능과 각 단축키에 제공할 동작을 결정할 때 다음 요소에 대해 설명합니다:
단축키를 할당하기 전에, 기능(feature)과 단축키가 할당되는 기능(function)이 키보드 단축키 없이도 접근 가능함을 보장하는 것이 중요합니다. 다시 말해, 키보드 단축키에 대한 대상이 될 수 있는 모든 엘리먼트는 다음에 설명된 방법을 사용하여 키보드를 통해 초점을 얻을 수 있어야 합니다:
탐색을 통한 접근에 대한 대체로 키보드 단축키를 사용하지 마세요. 이것은 다음의 이유로 전체 키보드 접근에 필수적입니다:
다음 규칙은 키보드 단축키에 대한 가장 유리한 동작을 식별하는데 도움이 될 수 있습니다.
이 섹션에 대한 초안 콘텐트 작업은 issue 219에서 추적됩니다.
키보드 인터페이스를 설계할 때 첫 번째 목표는 기본 키보드 내비게이션 지원만으로 간단하고, 효율적이며, 직관적인 조작입니다. 키보드 인터페이스의 기본 조작이 비효율적인 경우, 키보드 단축키를 구현하여 최적화 되지 않은 레이아웃이나 명령 구조와 같은 근본적인 설계 이슈에 대한 보완을 위한 시도하는 것은 사용자 불만을 줄일 수 없을 것입니다. 이것의 실질적인 의미는, 대부분의 잘 설계된 유저 인터페이스에서는 최적화 된 사용성을 만들기 위해 키보드 단축키를 통해 접근 할 수 있어야 하는 기능의 비율이 높지 않다는 것입니다. 많은 단순한 유저 인터페이스에서, 키보드 단축키는 완전히 불필요할 수 있습니다. 그리고, 키보드 단축키가 너무 많은 유저 인터페이스에서는, 가장 유용한 단축키를 기억하기 어렵게 만드는 인지 부하를 발생시킵니다.
키보드 단축키를 할당을 결정할 때 다음 사항을 고려하세요:
할당할 단축키를 선택할 때 고려해야 할 많은 요소들이 있습니다.
학습과 기억을 지원하는 단축키 체계를 설계하는 방법은 이 지침의 범위를 벗어납니다. 단축키 체계가 광범위 하지 않은 이상, 브라우저와 같은 일반적인 데스크탑 소프트웨어에서 익숙한 개념을 모방하는 것으로 충분합니다. 마찬가지로 지역화가 중요하지만, 이를 해결하는 방법을 설명하는 것은 그 토픽을 전문으로 하는 다른 리소스에 맡깁니다.
이 섹션의 나머지 부분에서는 키 할당 충돌과 관련된 요구 사항과 우려 사항을 조정하는 지침을 제공합니다. 일반적으로 키 할당은 사용자의 운영 체제, 브라우저, 보조 기술의 기능에 할당 된 키와 충돌하지 않는 경우가 이상적입니다. 충돌은 사용자에게 필수적인 기능에 대한 유효한 접근을 차단할 수 있고, 충돌의 더할 수 없이 나쁜 상황은 사용자를 가두어 버릴 수 있습니다. 동시에, 의도적인 충돌이 유용한 상황도 있습니다. 그리고 방대한 운영 체제, 브라우저, 보조 기술 키를 감안할 때, 일부 충돌이 존재하지 않는 다는 것은 거의 불가능합니다. 따라서 의도적이든 알려지지 않았든, 충돌의 영향을 완화하는 전략을 채택하는 것도 중요합니다.
다음 섹션에서, meta키는 Windows 호환 키보드의 Windows와 MacOS 호환 키보드의 Command키를 가리킵니다.
어플리케이션 및 창 관리, 디스플레이 및 사운드 제어와 같은 시스템 수준 기능을 수행하는 키와의 충돌을 방지하는 것이 중요합니다. 일반적으로, 다음과 같은 유형의 할당을 자제함으로써 이를 달성 할 수 있습니다.
"보조 키(modifier key)"는 Shift, Ctrl, Alt 키를 의미합니다.
또한, 브라우저를 포함하여 대부분의 어플리케이션이 일반적으로 지원하는 몇 가지 중요한 어플리케이션 수준 기능이 있습니다. 다음이 포함됩니다:
보조 기술은 통틀어 수천 개의 키 할당을 취했지만 충돌을 피하는 것은 비교적 쉽습니다. 이는 보조 기술이 운영 체제 및 어플리케이션과의 충돌을 피하는 키 할당 체계를 개발해야 했기 때문입니다. 특정 키를 키 명령을 고유하게 정의하는 보조 키로 가로채는 방식으로 이를 수행합니다. 예를 들어, 많은 보조 기술들이 보조 키로 Caps Lock를 사용합니다.
다음 유형의 할당을 피하여 보조 기술 키 충돌을 피하세요.
브라우저 키보드 체계에는 상당한 유사성이 있지만 체계 내의 패턴은 동질적이지 않습니다. 따라서 브라우저 키 할당과의 충돌을 피하는 것이 더 어렵습니다. 충돌의 영향은 거의 모든 기능 -- 키보드 접근 가능한 메뉴와 키보드 단축키에 대한 두 가지 경로를 사용할 수 있기 때문에 다소 완화되지만, 많이 사용되는 기능에 대한 단축키와의 충돌을 피하는 것이 중요합니다. 다음 단축키와의 충돌을 방지하기 위해 각별히 주의하세요:
키 충돌을 피하는 것이 일반적으로 바람직하지만, 브라우저 기능과 의도적으로 충돌하는 것이 적절하거나 심지어 바람직한 상황이 있습니다. 다음 조건의 조합이 유발하는 경우 발생할 수 있습니다:
예를 들어, 초점이 편집기에 있을 경우 사용 가능한 저장 키를 생각해보세요. 대다수의 브라우저가 ... to be continued ...
그리드 또는 테이블을 완전히 나타내고 설명하려면, 그리드 패턴이나 테이블 패턴에 기술 된 역할(role)을 사용하여 헤더, 행(row), 셀(cell)을 해석하는 것 외에도 보조 기술이 다음을 결정할 수 있어야 합니다:
브라우저는 자동으로 렌더링 된 DOM을 기준으로 그리드나 테이블의 행과 열 개수로 접근 가능한 트리를 채웁니다. 하지만, 데이터가 너무 커서 완전히 렌더링 할 수 없는 경우와 같이 DOM이 전체 그리드나 테이블이 포함하지 않는 많은 상황이 있습니다. 게다가, 건너 뛴 열이나 행 및 데이터 정렬 방법과 같은 일부 정보는 DOM 구조에서 파생될 수 없습니다.
아래 섹션에서는 ARIA가 그리드와 테이블에 접근성을 제공하는 속성(property)들을 사용하는 방법을 설명합니다.
속성(property) | 정의 |
---|---|
aria-colcount |
table , grid , treegrid 의 총 열 개수를 정의. |
aria-rowcount |
table , grid , treegrid 의 총 행 개수를 정의. |
aria-colindex |
|
aria-rowindex |
|
aria-colspan |
table , grid , treegrid 내의 셀 또는 그리드셀에 합쳐진 열의 수 정의 . |
aria-rowspan |
table , grid , treegrid 내의 셀 또는 그리드셀에 합쳐진 행의 수 정의. |
aria-sort |
행 또는 열이 오름차순 혹은 내림차순으로 정렬 되는지 여부를 나타냅니다. |
DOM 구조가 나타낸 행의 개수가 table, grid, treegrid에 사용 가능한 총 행 개수가 아닌 경우,
aria-rowcount
속성(property)이 사용 가능한 총 행 개수를 전달하는데 사용되고,
DOM에 있는 행의 행 인덱스를 식별하기 위해 aria-rowindex
속성(property)이 수반됩니다.
aria-rowcount
는 table
, grid
, treegrid
역할(role)이 있는 엘리먼트에 지정됩니다.
값은 헤더 행을 포함하여 사용 가능한 행의 총 개수와 동일한 정수입니다.
행의 총 개수를 알 수 없는 경우, -1
값이 지정 될 수 있습니다.
-1
값을 사용하는 것은 사용 가능한 공급의 크기를 지정하지 않고 사용 가능한 더 많은 행을 DOM에 포함 시킬 수 있음을 나타냅니다
table
, grid
, treegrid
에 aria-rowcount
가 사용되는 경우,
aria-rowindex
속성(property) 값이 헤더 행을 포함하여 각 하위 행에 지정됩니다.
aria-rowindex
값은 다음과 같은 정수입니다:
aria-rowindex
값보다 큰 값.
주의! aria-rowindex
의 누락 또는 부적합한 값은 보조 기술 동작에 치명적인 영향을 미칠 수 있습니다.
예를 들어, aria-rowindex
에 유효하지 않은 값을 지정하거나 테이블에 모든 행이 아니라 일부에만 설정하는 것은 스크린리더 테이블 낭독 기능이 행을 건너 뛰거나 단순히 기능을 중지 시키게 할 수 있습니다.
다음 코드는 가상의 수업 목록을 포함하는 표에 aria-rowcount
와 aria-rowindex
속성(property)의 사용을 보여줍니다.
<!--
aria-rowcount는 마크업에 4개의 행만 존재함에도 불구하고 그리드의 실제 크기가
463개 행이라고 보조 기술에 알려줍니다.
-->
<table role="grid" aria-rowcount="463"
aria-label="역사 101 학생 명부">
<thead>
<tr aria-rowindex="1">
<th>성</th>
<th>이름</th>
<th>E-mail</th>
<th>전공</th>
<th>부전공</th>
<th>학년</th>
</tr>
</thead>
<tbody>
<!--
aria-rowindex는 이 행이 463 행 중
51번째 행이라고 보조 기술에 알려줍니다
-->
<tr aria-rowindex="51">
<td>Henderson</td>
<td>Alan</td>
<td>ahederson56@myuniveristy.edu</td>
<td>경영</td>
<td>스페인어</td>
<td>3학년</td>
</tr>
<!--
aria-rowindex는 이 행이 463 행 중
52번째 행이라고 보조 기술에 알려줍니다.
-->
<tr aria-rowindex="52">
<td>Henderson</td>
<td>Alice</td>
<td>ahederson345@myuniveristy.edu</td>
<td>공학</td>
<td>없음</td>
<td>2학년</td>
</tr>
<!--
aria-rowindex는 이 행이 463 행 중
53번째 행이라고 보조 기술에 알려줍니다.
-->
<tr aria-rowindex="53">
<td>Henderson</td>
<td>Andrew</td>
<td>ahederson75@myuniveristy.edu</td>
<td>General Studies</td>
<td>없음</td>
<td>1학년</td>
</tr>
</tbody>
</table>
DOM 구조에 나타난 열 개수가 table, grid, treegrid에 사용 가능한 열의 총 개수가 아닐 경우,
aria-colcount
속성(property)이 사용 가능한 열의 총 개수를 전달하는데 사용되고,
DOM에 있는 열의 열 인덱스를 식별하기 위해 aria-colindex
속성(property)이 수반됩니다.
aria-colcount
는 table
, grid
, or treegrid
역할(role)이 있는 엘리먼트에 지정됩니다.
값은 사용 가능한 열의 총 개수와 동일한 정수입니다.
열의 총 개수를 알 수 없는 경우, -1
값이 지정될 수 있습니다.
-1
값을 사용하는 것은 사용 가능한 공급의 크기를 지정하지 않고 사용 가능한 더 많은 열을 DOM에 포함 시킬 수 있음을 나타냅니다.
table
, grid
, treegrid
에 aria-colcount
가 사용되는 경우,
aria-colindex
속성(property) 값은 아래 기술된 대로 열이 연속되어 있는지에 따라 각 후손 행이나 후손 행의 모든 셀에 지정됩니다.
aria-colindex
의 값은 다음과 같은 정수입니다:
주의! aria-colindex
의 누락 또는 부적합한 값은 보조 기술 동작에 치명적인 영향을 미칠 수 있습니다.
예를 들어, aria-colindex
에 유효하지 않은 값을 지정하거나 행의 모든 셀이 아니라 일부에만 설정하는 것은 스크린리더 테이블 낭독 기능이 셀을 건너 뛰거나 단순히 기능을 중지 시키게 할 수 있습니다.
행의 모든 셀이 연속적인 정수인 열 인덱스 번호를 가지는 경우,
aria-colindex
가 세트의 첫 번째 열의 인덱스 번호와 동일한 값이 행 엘리먼트에 설정될 수 있습니다.
브라우저는 행의 각 셀의 열 번호를 계산합니다.
다음의 코드는 사용자에게 2 ~ 5까지의 열이 표시 된 16개 열을 가진 그리드를 보여줍니다.
열 세트가 연속적이기 때문에, aria-colindex
가 각 행에 배치될 수 있습니다.
<div role="grid" aria-colcount="16">
<div role="rowgroup">
<div role="row" aria-colindex="2">
<span role="columnheader">이름</span>
<span role="columnheader">성</span>
<span role="columnheader">회사</span>
<span role="columnheader">주소</span>
</div>
</div>
<div role="rowgroup">
<div role="row" aria-colindex="2">
<span role="gridcell">Fred</span>
<span role="gridcell">Jackson</span>
<span role="gridcell">Acme, Inc.</span>
<span role="gridcell">123 Broad St.</span>
</div>
<div role="row" aria-colindex="2">
<span role="gridcell">Sara</span>
<span role="gridcell">James</span>
<span role="gridcell">Acme, Inc.</span>
<span role="gridcell">123 Broad St.</span>
</div>
…
</div>
</div>
행의 셀이 비연속적인 정수인 열 인덱스 번호를 가지는 경우, aria-colindex
는 행의 각 셀에 설정 되어야 합니다.
다음 예제는 처음 두 열이 학생 이름을 포함하고 이후 열들이 점수를 포함하는 온라인 성적표에 대한 그리드를 보여줍니다.
이 예에서, 학생 이름이 있는 첫 두 열은 표시되고, 점수 열은 10 ~ 13 열을 표시하도록 스크롤 되었습니다.
열 3 ~ 9는 표시되지 않으므로 DOM에 없습니다.
<table role="grid" aria-rowcount="463" aria-colcount="13">
aria-label="역사 101에 대한 학생 성적"
<!--
aria-rowcount와 aria-colcount는 보조 기술에
그리드의 실제 크기가 463개 행 x 13개 열 임을 알려주며,
이는 마크업에서 발견되는 행과 열의 수가 아닙니다.
-->
<thead>
<tr aria-rowindex="1">
<!--
aria-colindex는 보조기술에
다음 열이 전체 데이터 세트의 1, 2열을 나타냄을 전달합니다.
-->
<th aria-colindex="1">성</th>
<th aria-colindex="2">이름</th>
<!--
aria-colindex는 보조기술 사용자에게
다음 열이 전체 성적 데이터 세트의 10, 11, 12, 13열을 나타냄을
전달합니다.
-->
<th aria-colindex="10">숙제 4</th>
<th aria-colindex="11">시험 2</th>
<th aria-colindex="12">숙제 5</th>
<th aria-colindex="13">숙제 6</th>
</tr>
</thead>
<tbody>
<tr aria-rowindex="50">
<!--
모든 셀은 aria-colindex 어트리뷰트를 정의해야 합니다
-->
<td aria-colindex="1">Henderson</td>
<td aria-colindex="2">Alan</td>
<td aria-colindex="10">8</td>
<td aria-colindex="11">25</td>
<td aria-colindex="12">9</td>
<td aria-colindex="13">9</td>
</tr>
<tr aria-rowindex="51">
<td aria-colindex="1">Henderson</td>
<td aria-colindex="2">Alice</td>
<td aria-colindex="10">10</td>
<td aria-colindex="11">27</td>
<td aria-colindex="12">10</td>
<td aria-colindex="13">8</td>
</tr>
<tr aria-rowindex="52">
<td aria-colindex="1">Henderson</td>
<td aria-colindex="2">Andrew</td>
<td aria-colindex="10">9</td>
<td aria-colindex="11">0</td>
<td aria-colindex="12">29</td>
<td aria-colindex="13">8</td>
</tr>
</tbody>
</table>
HTML table
엘리먼트가 아닌 엘리먼트를 사용하여 tables, grids, treegrids이 생성된 경우,
행과 열 합침은 aria-rowspan
과 aria-colspan
속성(property)으로 정의됩니다.
aria-colspan
의 값은 다음과 같은 정수입니다:
aria-rowspan
의 값은 다음과 같은 정수입니다:
다음 예제 그리드는 두 개의 행 헤더를 가집니다. 첫 두 열은 헤더의 모든 행에 걸쳐진 헤더를 가집니다. 이후 6개 열은 첫번째 행의 헤더로 각 2개 열이 합쳐진 3쌍으로 그룹핑 됩니다.
<div role="grid" aria-rowcount="463">
aria-label="역사 101에 대한 학생 성적"
<div role="rowgroup">
<div role="row" aria-rowindex="1">
<!--
aria-rowspan와 aria-colspan는
헤더 셀이 하나 이상의 행 또는 열로 합쳐질 경우
올바른 데이터 셀 헤더 정보를 보조기술에 제공합니다.
-->
<span role="columnheader" aria-rowspan="2">성</span>
<span role="columnheader" aria-rowspan="2">이름</span>
<span role="columnheader" aria-colspan="2">시험 1</span>
<span role="columnheader" aria-colspan="2">시험 2</span>
<span role="columnheader" aria-colspan="2">최종</span>
</div>
<div role="row" aria-rowindex="2">
<span role="columnheader">점수</span>
<span role="columnheader">등급</span>
<span role="columnheader">점수</span>
<span role="columnheader">등급</span>
<span role="columnheader">점수</span>
<span role="columnheader">등급</span>
</div>
</div>
<div role="rowgroup">
<div role="row" aria-rowindex="50">
<span role="cell">Henderson</span>
<span role="cell">Alan</span>
<span role="cell">89</span>
<span role="cell">B+</span>
<span role="cell">72</span>
<span role="cell">C</span>
<span role="cell">161</span>
<span role="cell">B-</span>
</div>
<div role="row" aria-rowindex="51">
<span role="cell">Henderson</span>
<span role="cell">Alice</span>
<span role="cell">94</span>
<span role="cell">A</span>
<span role="cell">86</span>
<span role="cell">B</span>
<span role="cell">180</span>
<span role="cell">A-</span>
</div>
<div role="row" aria-rowindex="52">
<span role="cell">Henderson</span>
<span role="cell">Andrew</span>
<span role="cell">82</span>
<span role="cell">B-</span>
<span role="cell">95</span>
<span role="cell">A</span>
<span role="cell">177</span>
<span role="cell">B+</span>
</div>
</div>
</div>
참고: table
엘리먼트를 사용하는 경우,
열과 행 합침을 정의하도록 rowspan
과 colspan
어트리뷰트를 사용하여
th
와 td
의 기본 의미론을 사용하세요.
행 또는 열이 정렬되는 경우, aria-sort
속성(property)이 정렬 방법을 나타내기 위해 열이나 행 헤더에 적용될 수 있습니다.
다음 표는 aria-sort
에 허용된 값을 설명합니다.
값 | 설명 |
---|---|
ascending |
데이터가 오름차순으로 정렬됩니다. |
descending |
데이터가 내림차순으로 정렬됩니다. |
other |
데이터가 오름차순 또는 내림차순 이외의 알고리즘으로 정렬됩니다. |
none |
기본 (정렬이 적용되지 않음). |
ARIA가 여러 정렬 키를 가진 데이터 세트에 대한 정렬의 수준을 나타내는 방법을 제공하지 않는다는 점에 유의해야 합니다.
따라서, 둘 이상의 열이나 행에 none
이외의 값을 가진 aria-sort
를 적용하는데 제한적인 값이 있습니다.
다음 예제 그리드는 행이 최고 "Quiz 2" 점수부터 최저 "Quiz 2" 점수로 정렬되었음을 나타내는데 aria-sort
를 사용합니다.
<table role="grid" aria-rowcount="463" aria-colcount="13"
aria-label="역사 101에 대한 학생 성적">
<thead>
<tr aria-colindex="10" aria-rowindex="1">
<th>Homework 4</th>
<!--
aria-sort가 헤딩 "Quiz 2"를 가진 열이 그리드의 행을
정렬하는데 사용되었음을 나타냅니다.
-->
<th aria-sort="descending">Quiz 2</th>
<th>Homework 5</th>
<th>Homework 6</th>
</tr>
</thead>
<tbody>
<tr aria-colindex="10" aria-rowindex="50">
<td>8</td>
<td>30</td>
<td>9</td>
<td>9</td>
</tr>
<tr aria-colindex="10" aria-rowindex="51">
<td>10</td>
<td>29</td>
<td>10</td>
<td>8</td>
</tr>
<tr aria-colindex="10" aria-rowindex="52">
<td>9</td>
<td>9</td>
<td>27</td>
<td>6</td>
</tr>
<tr aria-colindex="10" aria-rowindex="53">
<td>9</td>
<td>10</td>
<td>26</td>
<td>8</td>
</tr>
<tr aria-colindex="10" aria-rowindex="54">
<td>9</td>
<td>7</td>
<td>24</td>
<td>6</td>
</tr>
</tbody>
</table>
ARIA가 주로 의미론을 표현하는데 사용되지만, 보조 기술로부터 엘리먼트의 의미론을
숨기는 것이 도움이 되는 상황이 있습니다. 이는 오직 표현(presentation)을 위해서만
사용되고 있고 따라서 어떤 접근 가능한 의미를 가지지 않음을 선언하
는 presentation 역할(role)로
수행됩니다. ARIA 1.1 명세는
presentation
의 동의어로서 제공되는
none 역할(role)도 포함합니다.
예를 들어, HTML ul
엘리먼트를 사용하여 만들어진 탭 위젯을 고려해보세요.
<ul role="tablist">
<li role="presentation">
<a role="tab" href="#">Tab 1</a>
</li>
<li role="presentation">
<a role="tab" href="#">Tab 2</a>
</li>
<li role="presentation">
<a role="tab" href="#">Tab 3</a>
</li>
</ul>
목록이 탭 목록으로 선언되었기 때문에, 목록 항목은 목록 컨텍스트에 있지 않습니다.
보조 기술이 그 목록 항목들을 렌더링 한다면 사용자에게 혼란을 줄 수 있습니다.
li
엘리먼트에 presentation
역할(role)을 적용하는 것은
접근성 트리에서 그 엘리먼트를 빼도록 브라우저에게 전달합니다. 따라서 보조 기술은
목록 항목 엘리먼트를 알지도 못하고 탭 엘리먼트를 탭 목록의 직속 자식으로 간주합니다.
presentation
역할(role)의 일반적인 3가지 용도는 다음과 같습니다:
엘리먼트에 role="presentation"
이 지정 된 경우,
브라우저가 presentation
역할(role)을 무시하는데 필요한 조건이 없는 경우,
다음과 같은 세 가지 효과를 가집니다.
display: none
으로 스타일링 되었거나 aria-hidden="true"
를
가지는 경우를 제외하고, 보조 기술에 계속 노출됩니다.
presentation
이 ul
이나 ol
엘리먼트에 적용 된 경우, 각 자식 li
엘리먼트는 ARIA가 부모 list
엘리먼트를 가지도록 listitem
엘리먼트를 요구하므로, presentation
역할(role)을 상속받습니다. 따라서, li
엘리먼트는 보조 기술에 노출되지 않지만, 중첩된 목록을 포함하여 그 li
엘리먼트 내부에 포함된 엘리먼트는 보조 기술에 노출 됩니다.presentation
이 table
엘리먼트에 적용 된 경우,
후손 caption
, thead
, tbody
, tfoot
,
tr
, th
, td
엘리먼트는 presentation
역할(role)을 상속하고 따라서 보조 기술에 노출되지 않습니다.
하지만, 중첩 된 테이블을 포함하여 th
와 td
엘리먼트 내부의 엘리먼트는 보조 기술에 노출 됩니다.
브라우저는 적용 된 엘리먼트에 대해서 다음 중 하나가 참이면 role="presentation"
를 무시하므로 효과가 없습니다:
tabindex
어트리뷰트를 가진 경우.aria-label
을 가지는 경우.
이 코드는:
<ul role="presentation">
<li>Date of birth:</li>
<li>January 1, 3456</li>
</ul>
브라우저에 의해 해석 될 때, 스크린리더나 브라우저의 접근성 트리에 의존하는 다른 보조 기술의 관점에서 다음과 동일합니다:
<div>Date of birth:</div>
<div>January 1, 3456</div>
플랫폼 접근성 API에 나타날 때, 텍스트를 포함할 수만 있는
몇 가지 유저 인터페이스 컴포넌트 유형이 있습니다. 예를 들어, 접근성 API는
버튼에 포함 된 의미 엘리먼트를 나타내는 방법이 없습니다. 이 제한을 다루기 위해,
WAI-ARIA는 브라우저에 자동으로 presentation
역할을(role) 의미 자식을
지원할 수 없는 역할(role)을 가진 모든 엘리먼트의 모든 후손 엘리먼트에 적용하도록 요구합니다.
모든 자식이 표현적이 되도록 요구하는 역할(role)은 다음과 같습니다:
예를 들어, 제목이 포함된 다음 탭 엘리먼트를 고려해보세요.
<li role="tab"><h3>탭 제목</h3></li>
WAI-ARIA는 탭의 후손을 표현적이 되도록 요구하기 때문에, 다음 코드는 동일합니다.
<li role="tab"><h3 role="presentation">탭 제목</h3></li>
그리고, 스크린리더와 같은 접근성 API에 의존하는 기술을 사용하는 사람의 관점에서, 이전 코드가 다음과 동일하기 때문에 헤딩은 존재하지 않습니다.
<li role="tab">탭 제목</li>
동작에 대한 자세한 설명은
presentation
역할(role)에 대한 섹션
을 참고하세요.
ARIA는 페이지 구조의 접근성 의미를 전달하는 역할 집합을 제공합니다. 이 역할은 제목(heading), 목록, 표와 같은 콘텐츠를 구성하고 구조화하는 에리먼트의 레이아웃 및 모양을 전달하는 의미를 나타냅니다.
HTML 같은 일부 호스트 언어는 ARIA 역할(role)과 동일한 의미를 나타내는 엘리먼트를 포함합니다.
예를 들어, HTML <p>
엘리먼트는 <div role="paragraph">
와 정확히 동일한 방식으로 접근성 API에 매핑됩니다.
ARIA와 HTML 명세는 HTML 엘리먼트와 ARIA 어트리뷰트의 이 매핑을 암묵적 의미론이라고 칭합니다. 예를 들어 HTML <p>
엘리먼트의 암묵적 ARIA 역할(role)은 paragraph
입니다.
HTML을 개발할 때, 가능한 한 기본 HTML 엘리먼트를 사용하는 것이 중요합니다. 동등한 의미를 가진 HTML 엘리먼트를 사용하는 것이 가능하다면, ARIA 역할(role)이나 속성(property)를 사용하지 마세요. 동등한 HTML 대신 ARIA 어트리뷰트를 사용하는 것이 적절한 상황은 다음과 같습니다:
다음 표는 ARIA 1.2에 정의된 모든 구조적 역할(role)을 나열합니다.
ARIA 역할(role) | 동등한 HTML |
---|---|
application | 동등한 엘리먼트 없음 |
article | article |
blockquote | blockquote |
caption | caption |
cell | td |
code | code |
columnheader | th |
definition | dd |
deletion | del |
directory | 동등한 엘리먼트 없음 |
document | 동등한 엘리먼트 없음 |
emphasis | em |
feed | 동등한 엘리먼트 없음 |
figure | figure |
generic | div, span |
group | 동등한 엘리먼트 없음 |
heading with aria-level="N" where N is 1, 2, 3, 4, 5, or 6 | h1, h2, h3, h4, h5, h6 |
insertion | ins |
img | img |
list | ul, ol |
listitem | li |
math | 동등한 엘리먼트 없음 |
none | 동등한 엘리먼트 없음 |
note | 동등한 엘리먼트 없음 |
presentation | 동등한 엘리먼트 없음 |
paragraph | p |
row | tr |
rowgroup | tbody, thead, tfoot |
rowheader | th |
separator (when not focusable) | hr |
strong | strong |
subscript | sub |
superscript | sup |
table | table |
term | dfn |
time | time |
toolbar | 동등한 엘리먼트 없음 |
tooltip | 동등한 엘리먼트 없음 |
APG 1.1 supported ARIA 1.1, and this version, APG 1.2, includes changes to support version 1.2 of the ARIA specification. It also includes nearly 200 significant updates to improve the quality and breadth of content. A detailed log of all changes is available on the wiki of the w3c/aria-practices GitHub repository. Highlights of major changes to support ARIA 1.2 as well as some of the improvements include the following.
Jump tomenu, a button to open the example in CodePen, and added a prominently placed warning with guidance about testing before re-using example code.
Comprehensive lists of closed issues included in APG 1.2 release 1 are tracked in the following GitHub milestones.
menu system) with dropdown lists of links coded using the disclosure pattern.
button
role.
data-
attributes instead of with rel
attributes.Also see:
Also see:
Also see:
Browser and Assistive Technology Supportsection of
Read Me First
Report Issuepage in the Github repository
Related Issueslisted in the Github project for the example
Design Patternsection that applies to the example
Also see:
Also see:
This version of the ARIA Authoring Practices Guide is dedicated to the memory of Carolyn MacLeod whose contributions are visible throughout the entire guide. She was dedicated to all aspects of the work of the APG Task Force from writing code and suggesting editorial revisions to testing examples with assistive technologies.
While WAI-ARIA Authoring Practices is the work of the entire Authoring Practices Task Force and also benefits from many people throughout the open source community who both contribute significant work and provide valuable feedback, special thanks goes to the following people who provided distinctly large portions of the content and code.
This publication has been funded in part with U.S. Federal funds from the Department of Education, National Institute on Disability, Independent Living, and Rehabilitation Research (NIDILRR), initially under contract number ED-OSE-10-C-0067, then under contract number HHSP23301500054C, and now under HHS75P00120P00168. The content of this publication does not necessarily reflect the views or policies of the U.S. Department of Education, nor does mention of trade names, commercial products, or organizations imply endorsement by the U.S. Government.
label
을 클릭하면 이label
의for
어트리뷰트로 연결된 엘리먼트를 활성화 하도록 동작하는데, 위 예제에서와 같이 ARIA의 작성하는 것은 label의 동작과 같은 HTML 네이티브 동작을 제공하지 않음을 의미합니다. 따라서, HTML 네이티브와 동등하게 동작하게 하는 것은 작성자의 몫으로 남겨집니다.