역할 · 문서 구조
role="feed"
스크롤하면 글(article)이 계속 추가되는 무한 스크롤 목록을 화면낭독기로 탐색할 수 있게 합니다.
심화
한눈에 보기
- 분류
- 문서 구조
- 대응 HTML
- 없음
- 이름 정하는 방법
- 작성자 (author)
- 이름 필수
- 아니요
- 필수 상위 요소
- 없음
- 필수 하위 요소
article
설명
feed는 뉴스 피드, SNS 타임라인처럼 사용자가 읽어 내려가면 새 글을 불러와 끝없이 이어지는 글 목록입니다. 일반 무한 스크롤은 화면낭독기 사용자가 끝에 도달하기 전에 내용이 바뀌거나, 반대로 새 내용을 불러오지 못하는 문제가 있습니다. feed는 이를 해결하기 위해 읽기 커서 이동과 포커스를 연동하는 규칙을 정합니다.
구조 규칙
- feed의 자식은
article입니다. 각 article은 포커스를 받을 수 있게tabindex="0"(또는-1)을 주고, 포커스를 받으면 화면에 보이도록 스크롤합니다. - 각 article에
aria-labelledby(제목)와 필요하면aria-describedby(본문 요약)를 줍니다. - 전체 개수를 알면
aria-setsize, 모르면-1을 쓰고, 각 article의 위치를aria-posinset으로 알립니다. - 글을 추가·제거하는 동안 feed에
aria-busy="true"를 두고, 끝나면false로 돌립니다. 목록 중간에 글을 끼워 넣지 않습니다.
feed와 log의 차이
log는 새 항목이 생기면 자동으로 읽어 주는 라이브 리전이고, feed는 사용자가 스스로 읽어 가며 불러오는 구조입니다. feed는 새 글을 자동으로 읽어 주지 않습니다.
참고
feed는 지원과 사용 사례가 많지 않은 고급 패턴입니다. “더 보기” 버튼으로 다음 글을 불러오는 방식이 대부분의 사용자에게 더 예측 가능합니다.
함께 쓰는 속성
전역 속성(이름·설명 등)은 모든 역할에 쓸 수 있어 생략했습니다.
키보드 동작
| 키 | 동작 |
|---|---|
| Page Down | 다음 article로 포커스를 옮깁니다. |
| Page Up | 이전 article로 포커스를 옮깁니다. |
| Ctrl + End | feed 다음의 첫 포커스 가능한 요소로 이동합니다. |
| Ctrl + Home | feed 앞의 첫 포커스 가능한 요소로 이동합니다. |
사용 예
피드 구조
<div role="feed" aria-label="새 소식" aria-busy="false">
<article tabindex="0" aria-labelledby="a1-h" aria-posinset="1" aria-setsize="-1">
<h3 id="a1-h">여름 독서 교실 모집</h3>
<p>…</p>
</article>
<article tabindex="0" aria-labelledby="a2-h" aria-posinset="2" aria-setsize="-1">
<h3 id="a2-h">휴관일 안내</h3>
<p>…</p>
</article>
</div>글을 불러올 때
feed.setAttribute('aria-busy', 'true');
appendArticles(newItems); // 목록 끝에만 추가
feed.setAttribute('aria-busy', 'false');화면낭독기에서는
| 상황 | 들리는 안내 (예) |
|---|---|
| 피드 안의 글로 이동 | 새 소식, 피드, 여름 독서 교실 모집, 아티클, 1 |
사용 지침
이렇게 쓰세요
- article마다 포커스와 이름을 주고
aria-posinset/aria-setsize를 관리합니다. - 불러오는 동안
aria-busy="true"를 둡니다.
이렇게 쓰지 마세요
- article 사이 중간 위치에 새 글을 끼워 넣지 않습니다.
- feed 자식으로 article 외의 요소를 두지 않습니다.