한국형 웹콘텐츠 접근성 지침의 검사항목 중 헤딩과 관련된 항목이 있다.

2.4.2(제목 제공) 페이지, 프레임, 콘텐츠 블록에는 적절한 제목을 제공해야 한다.

검사항목을 준수하고 페이지를 구조적으로 마크업하기 위해 콘텐츠 블럭의 제목으로 헤딩(heading)을 많이 제공하고 있다. 제공된 헤딩 정보는 화면낭독기를 이용하는 사용자가 웹페이지의 구조를 파악하고 페이지를 빠르게 탐색하는데 매우 효과적으로 이용된다.

우선 헤딩의 존재만으로 콘텐츠 블럭을 구분하는 효과가 있다. 시각장애인은 한번에 하나의 요소에만 접근할 수 있기 때문에 전체적인 구조와 맥락을 파악하는 것이 쉽지 않다. 이 때 헤딩정보가 요소와 요소를 구분하고 단락을 구분하고 묶어 줄 수 있는 정보로 활용된다.
또한 헤딩의 숫자는 콘텐츠의 포함관계와 계층구조를 이해할 수 있게 한다. h1은 로고, h2는 메뉴, h3은 콘텐츠영역의 제목 등 일반적으로 많이 사용되는 헤딩숫자에 대한 구조적인 의미를 이해할 수 있고, h2가 나오다가 h3이 나온 경우 하위에 포함된 콘텐츠로 계층구조를 인지할 수 있다.

다들 이렇게 알고 있지만 실제로 화면낭독기가 헤딩을 어떻게 음성출력하는지 알고 있는 사람은 많지 않다

헤딩에 많이 사용되는 텍스트, 이미지, 텍스트링크, 이미지링크를 조합해서 화면낭독기가 어떻게 읽어주고 있는지 확인해보자

 

테스트환경

Windows 7 32bit / Internet Explorer 8
센스리더 3.2.2.0
센스리더 4.0 beta4
JAWS 13 한글
JAWS 15 영문
NVDA development 10114

헤딩 테스트 샘플 페이지

http://haeppa.kr/test/heading201406.html

헤딩정보 탐색에 이용되는 화면낭독기 기능키

기능 센스리더 3.2.2.0 센스리더 4.0 beta4 JAWS 13
한글
JAWS 15
영문
NVDA development 10114
헤딩단위 이동 Ctrl+F6
Ctrl+Shift+F6
H
Shift+H
H
Shift+H
H
Shift+H
H
Shift+H
헤딩 레벨단위 이동 none 1~6
Shift+1~6
1~6
Shift+1~6
1~6
Shift+1~6
1~6
Shift+1~6
헤딩 목록 none none Insert+F6 Insert+F6 Insert+F7

※ 헤딩레벨 단위 이동기능은 헤딩레벨에 해당하는 숫자(1~6)를 직접 눌러서 이동합니다.
※ JAWS 는 헤당레벨 단위 이동기능 사용시 section, landmark role, frame 등의 영향을 받아 이동 범위가 제한되지만 센스리더와 NVDA는 페이지내의 모든 헤딩으로 레벨단위 이동을 사용할 수 있습니다.

 

 

화면낭독기의 헤딩 음성출력 결과

아래 테스트 결과는 헤딩단위, 헤딩레벨단위 이동기능을 사용하지 않고 위/아래 방향키만 눌러서 페이지를 탐색하고 그 결과를 정리한 것입니다. 헤딩단위 이동기능 사용시 각 화면낭독기 마다 헤딩 속 요소에 대한 음성출력 방식이 매우 다르기 때문에 헤딩에 대한 지원여부를 직관적으로 확인하기 어려운 점을 감안한 것입니다.

 

1. 헤딩 기본 스타일

HTML
<h3>뽀로로</h3>
<h3><a href="poro.jpg">뽀로로</a></h3>
<h3><img src="poro.jpg" alt="뽀로로" /></h3>
<h3><a href="poro2.jpg"><img src="poro.jpg" alt="뽀로로" /></a></h3>

헤딩 기본 스타일 음성출력 내용
화면낭독기 종류 음성출력 내용 비고
센스리더 3.2.2.0 뽀로로 헤딩3
뽀로로 헤딩3 링크
헤딩3 *1
뽀로로 이미지
뽀로로 헤딩3 그래픽링크
*1) 헤딩에 이미지가 있음녀 헤딩과 이미지를 분리
센스리더 4.0 beta4 뽀로로 헤딩3
뽀로로 헤딩3 링크
뽀로로 헤딩3 그래픽 링크 *1
뽀로로 헤딩3 그래픽 링크
*1) 이미지를 그래픽링크로 음성출력하는 버그 (추정)
JAWS 13 한글 헤딩레벨3 뽀로로
헤딩레벨3 링크 뽀로로
헤딩레벨3 그래픽 뽀로로
헤딩레벨3 링크 그래픽 뽀로로
none
JAWS 15 영문 헤딩레벨3 뽀로로
헤딩레벨3 링크 뽀로로
헤딩레벨3 그래픽 뽀로로
헤딩레벨3 링크 그래픽 뽀로로
none
NVDA
development 10114
헤딩레벨3 뽀로로
헤딩레벨3 링크 뽀로로
헤딩레벨3 그래픽 뽀로로
헤딩레벨3 링크 그래픽 뽀로로
none

 

2. 헤딩 속 링크와 텍스트가 2개

HTML
<h3><a href="poro.jpg">뽀로로</a>크롱이</h3>
<h3><a href="poro.jpg">뽀로로</a><a href="krong.jpg">크롱이</a></h3>

헤딩 속 링크와 텍스트 음성출력 내용
화면낭독기 종류 음성출력 내용 비고
센스리더 3.2.2.0 뽀로로 헤딩3 링크
크롱이 *1
뽀로로 헤딩3 링크
크롱이 링크 *1
*1) 헤딩으로 묶어도 링크와 텍스트가 분리되어 헤딩 정보를 알 수 없음
센스리더 4.0 beta4 뽀로로 헤딩3 링크
크롱이 *1
뽀로로 헤딩3 링크
크롱이 링크 *1
*1) 헤딩으로 묶어도 링크와 텍스트가 분리되어 헤딩 정보를 알 수 없음
JAWS 13 한글 헤딩레벨3 링크 뽀로로
헤딩레벨3 크롱이
헤딩레벨3 링크 뽀로로
헤딩레벨3 링크 크롱이
none
JAWS 15 영문 헤딩레벨3 링크 뽀로로
헤딩레벨3 크롱이
헤딩레벨3 링크 뽀로로
헤딩레벨3 링크 크롱이
none
NVDA
development 10114
헤딩레벨3 링크 뽀로로 크롱이
헤딩레벨3 링크 뽀로로 링크 크롱이
none

 

3. 헤딩 속 이미지와 텍스트가 2개

HTML
<h3><img src="poro.jpg" alt="뽀로로" />크롱이</h3>
<h3><img src="poro.jpg" alt="뽀로로" /><img src="krong.jpg" alt="크롱이" /></h3>
<h3><img src="krong.jpg" alt="크롱이" /><img src="poro.jpg" alt="뽀로로" /></h3>

헤딩 속 이미지와 텍스트 음성출력 내용
화면낭독기 종류 음성출력 내용 비고
센스리더 3.2.2.0 헤딩3 *1
뽀로로 이미지
크롱이 *2
헤딩3 *1
뽀로로 이미지
크롱이 이미지 *2
헤딩3 *1
크롱이 이미지
뽀로로 이미지 *2
*1) 헤딩에 이미지가 있으면 헤딩과 이미지를 분리
*2) 헤딩으로 묶어도 요소가 모두 분리되어 헤딩 정보를 알 수 없음
센스리더 4.0 beta4 뽀로로 헤딩3 그래픽링크 *1*2
크롱이 헤딩3 그래픽링크 *1*3
뽀로로 헤딩3 그래픽링크 *1*3
*1) 이미지를 그래픽링크로 음성출력하는 버그 (추정)
*2) 텍스트정보가 누락됨
*3) 헤딩 안에 이미지가 2개인 경우 마지막 이미지만 음성출력
JAWS 13 한글 헤딩레벨3 그래픽 뽀로로
헤딩레벨3 크롱이
헤딩레벨3 그래픽 뽀로로
헤딩레벨3 그래픽 크롱이
헤딩레벨3 그래픽 크롱이
헤딩레벨3 그래픽 뽀로로
none
JAWS 15 영문 헤딩레벨3 그래픽 뽀로로
헤딩레벨3 크롱이
헤딩레벨3 그래픽 뽀로로
헤딩레벨3 그래픽 크롱이
헤딩레벨3 그래픽 크롱이
헤딩레벨3 그래픽 뽀로로
none
NVDA
development 10114
헤딩레벨3 그래픽 뽀로로 크롱이
헤딩레벨3 그래픽 뽀로로 그래픽 크롱이
헤딩레벨3 그래픽 크롱이 그래픽 뽀로로
none

 

 

4. 헤딩 속 이미지와 링크가 2개

HTML
<h3><img src="poro.jpg" alt="뽀로로" /><a href="krong.jpg">크롱이</a></h3>
<h3><img src="poro.jpg" alt="뽀로로" /><a href="poro.jpg"><img src="krong.jpg" alt="크롱이" /></a></h3>
<h3><a href="poro.jpg"><img src="poro.jpg" alt="뽀로로" /></a><a href="krong.jpg"><img src="krong.jpg" alt="크롱이" /></a></h3>

헤딩 속 이미지와 링크 음성출력 내용
화면낭독기 종류 음성출력 내용 비고
센스리더 3.2.2.0 헤딩3 *1
뽀로로 이미지
크롱이 링크 *2
헤딩3 *1
뽀로로 이미지
크롱이 그래픽링크 *2
뽀로로 헤딩3 그래픽링크
크롱이 그래픽링크 *2
*1) 헤딩에 이미지가 있으면 헤딩과 이미지를 분리
*2) 헤딩으로 묶어도 요소가 모두 분리되어 헤딩 정보를 알 수 없음
센스리더 4.0 beta4 뽀로로 헤딩3 그래픽링크
크롱이 링크 *1
뽀로로 헤딩3 그래픽링크
크롱이 그래픽링크 *1
뽀로로 헤딩3 그래픽링크
크롱이 그래픽링크 *1
*1) 헤딩으로 묶어도 요소가 모두 분리되어 헤딩 정보를 알 수 없음
JAWS 13 한글 헤딩레벨3 그래픽 뽀로로
헤딩레벨3 링크 크롱이
헤딩레벨3 그래픽 뽀로로
헤딩레벨3 링크 그래픽 크롱이
헤딩레벨3 링크 그래픽 뽀로로
헤딩레벨3 링크 그래픽 크롱이
none
JAWS 15 영문 헤딩레벨3 그래픽 뽀로로
헤딩레벨3 링크 크롱이
헤딩레벨3 그래픽 뽀로로
헤딩레벨3 링크 그래픽 크롱이
헤딩레벨3 링크 그래픽 뽀로로
헤딩레벨3 링크 그래픽 크롱이
none
NVDA
development 10114
헤딩레벨3 그래픽 뽀로로 링크 크롱이
헤딩레벨3 그래픽 뽀로로 링크 그래픽 크롱이
헤딩레벨3 링크 그래픽 뽀로로 링크 그래픽 크롱이
none

 

정리하자면…

  • JAWS 13 한글과 15 영문은 음성출력에 차이가 없음
  • NVDA, JAWS는 헤딩정보와 요소의 누락이 없음
  • 센스리더 3.2.2.0은
    • 이미지와 헤딩이 분리되어 헤딩정보 불확실
    • 헤딩 속 이미지, 링크, 텍스트가 2개 이상 있으면 서로 분리되고 헤딩정보가 누락
  • 센스리더 4.0 beta4는
    • “헤딩x 이미지”를 “헤딩x 그래픽링크”로 음성출력하는 버그
    • 헤딩 속 이미지, 링크, 텍스트가 2개 이상 있으면 서로 분리되고 헤딩정보가 누락
    • 헤딩 속 이미지와 텍스트가 있으면 텍스트 누락
    • 헤딩 속 이미지가 2개 있으면 첫번째 이미지 정보 누락
  • NVDA는 2,3,4 샘플에서 화면레이아웃모드 사용으로 모든 요소를 한 번에 음성출력하고 있으나 좌/우 방향키를 눌러 확인하면 요소의 시작/끝을 알 수 있어 문제되지 않음

 

추가, 헤딩 / 헤딩레벨 단위 이동기능의 차이

HTML

<h1>제목1</h1> 
<h3>내용1-1</h3>
<h3>내용1-2</h3>
<h1>제목2</h1>
<h3>내용2-1</h3>
<h3>내용2-2</h3>
<h1>제목3</h1>
<h3>내용3-1</h3>
<h3>내용3-2</h3>

위와 같은 구성된 경우 헤딩단위 이동기능을 이용하면

제목1 헤딩1
내용1-1 헤딩3
내용1-2 헤딩3
제목2 헤딩1
내용2-1 헤딩3
내용2-2 헤딩3
…..

위와 같이 모든 헤딩을 읽으면서 페이지를 탐색합니다.
하지만 헤딩레벨 단위 이동기능은 약간 다릅니다.

숫자 1만 누르면

제목1 헤딩1
제목2 헤딩1
제목3 헤딩1

숫자3만 누르면

내용1-1 헤딩3
내용1-2 헤딩3
내용2-1 헤딩3
내용2-2 헤딩3
……

위와 같은 형태로 숫자에 해당하는 레벨의 헤딩만 읽으면서 페이지를 탐색하게 됩니다. 페이지 구성에 따라 헤딩레벨단위 이동기능을 잘 활용한다면 효과적인 페이지 탐색이 가능합니다.

2014/06/15 21:47 2014/06/15 21:47
해빠 이 작성.

웹 접근성에 관심을 가지고 가장 처음 접하게 되는 정보 중 하나가 img의 alt 속성이다. 시각장애인은 이미지 정보를 눈으로 확인할 수 없기 때문에 이를 보완하기 위해 alt 속성을 사용하게 되고, 이것을 화면낭독기가 음성출력한다.

다들 알다시피 모든 이미지에 alt 속성값을 제공하는 것은 아니다. alt 속성의 제공에서 제외되는 것은 정보를 담지 않은 블릿, 선, 배경 등의 이미지다. 장식에 사용되는 이런 이미지에는 화면낭독기가 음성을 출력하지 않도록 alt=””과 같이 공백문자를 제공한다.

 

뭐가 문제냐면요…

일반 이미지에서는 alt 속성의 사용이 매우 명확하다. 하지만 링크에 사용된 이미지라면 어떨까?

<a href=”#go” ><img src=”abc.jpg” alt=”아름다운풍경”></a>
<a href=”#go”>아름다운 풍경</a>

이 경우 인접한 두 링크의 텍스트와 목적지가 같기 때문에 이미지링크는 alt=”” 공백처리를 하게 된다.

<a href=”#go” ><img src=”abc.jpg” alt=””></a>
<a href=”#go”>아름다운 풍경</a>

제작자의 의도와 다르게 화면낭독기는 링크 속 이미지는 공백문자로 처리하지 않는다. 센스리더와 죠스는 아래와 같이 파일명을 그대로 음성출력하고 있다.

센스리더 : 에이비시점제이피지 그래픽링크
죠스 : 경로명/에이비씨 링크 그래픽

이런 현상에 대해 화면낭독기 개발사 측의 입장은 이렇다.

사이트를 이용하다 보면 아직도 전반적으로 준수상태가 매우 낮고 대체텍스트가 누락되거나 심지어 사이트의 모든 이미지링크가 공백처리 된 경우도 있다. 화면낭독기가 링크의 이미지도 alt=””를 공백처리하게 되면 일부 사이트를 이용할 수 없는 문제가 있다.

처음 이런 설명을 듣는 경우 납득하지 못할 수도 있지만, 화면낭독기는 접근성을 준수하지 않은 사이트도 이용해야하는 장애인보조기기이므로 이 주장을 반박하기가 어렵다.

 

어떻게 해야하죠?

그렇다면 어떻게 보완할 수 있을까? 해결방법은 “한국형웹콘텐츠접근성지침 v2.1 검사항목 2.4.3 적절한 링크텍스트”에서 확인할 수 있다

1-3) 이미지 링크를 제공하는 경우: URL에 관한 정보를 제공하는 텍스트와 URL로 이동하는 이미지 링크는 하나의 링크로 구성하는 것이 바람직하다. 이 경우, 이미지 링크의 대체 텍스트는 공백 문자로 제공해야 한다.

지침에서 알려주는 대로 한번 적용해보자.

<a href=”#go” ><img src=”abc.jpg” alt=””>아름다운풍경</a>

이미지를 공백처리하고 텍스트와 하나의 링크로 만들면 아래와 같이 음성출력 한다.

센스리더 : 아름다운풍경 그래픽링크
죠스 : 아름다운풍경 링크

이미지와 텍스트 링크가 인접한 경우 이 방법으로 보완할 수는 있지만, 이것이 정답이라고 말할 수는 없다. 디자인이나 개발 등 여러 이유로 하나의 링크로 묶을 수 없는 경우도 많기 때문이다.

이 사례를 접할 때마다 “지침상의 의도와 이상적인 접근성 높은 웹”이, “화면낭독기가 접하는 접근성 낮은 현실의 웹”과 상충하고 있는 지금이 참 씁쓸하다.

 

추가로,

이 문제를 보완하는 여러 방법이 있겠지만, 이미지를 링크에 넣지 않고 링크 영역의 베경이미지로 사용하면 된다는 의견이 제시 되었지만, 어쨋든 이 경우에도 링크라는 요소가 인지되고 음성출력되기 때문에 추천하기는 어려울 것 같다.

 

테스트는…

Internet Explorer 8
센스리더 v3.2.2.0
죠스 한글판 v13

2014/06/06 18:49 2014/06/06 18:49
해빠 이 작성.