Screen readers like VoiceOver, NVDA, JAWS, and TalkBack don't read pixels — they read the accessibility tree the browser builds from the DOM. A virtual cursor moves one element at a time, announcing its role (heading, button, image...), accessible name, and state (selected, expanded...) in sequence.
That order follows **DOM order**, not visual position. Reordering things visually with CSS (`order`, `position: absolute`) doesn't change what a screen reader reads next — when the two diverge a lot, the experience gets confusing fast.
The demo moves a virtual cursor across a mini page — heading, image, paragraph, button — while the transcript on the right fills in with each announcement as it happens.
When to use
When laying out a page, avoid making visual order diverge sharply from DOM order. The most reliable check is turning on a real screen reader (VoiceOver on Mac: Cmd+F5) and reading the page with nothing but Tab.