VoiceOver, NVDA, JAWS, TalkBack 같은 스크린 리더는 화면의 픽셀이 아니라 브라우저가 만든 접근성 트리(accessibility tree)를 읽습니다. 가상 커서(virtual cursor)가 한 번에 요소 하나씩 이동하며 그 요소의 역할(heading, button, image...), 이름(accessible name), 상태(선택됨, 펼쳐짐...)를 순서대로 읽어줍니다.
이 순서는 화면에 보이는 위치가 아니라 **DOM 순서**를 따릅니다. CSS로 시각적 순서를 바꿔도(`order`, `position: absolute`) 스크린 리더가 읽는 순서는 그대로라서, 시각 순서와 DOM 순서가 크게 어긋나면 혼란스러운 경험이 됩니다.
데모는 미니 페이지 위에서 가상 커서가 제목 → 이미지 → 본문 → 버튼 순서로 이동하며, 오른쪽 트랜스크립트에 실제로 읽히는 문장이 하나씩 쌓이는 과정을 보여줍니다.
언제 쓰나
레이아웃을 짤 때 시각 순서와 DOM 순서를 크게 다르게 만들지 마세요. 확인하려면 실제 스크린 리더(맥 VoiceOver는 Cmd+F5)를 한 번 켜서 Tab만으로 페이지를 읽어보는 게 가장 정확합니다.