Accessibility / Screen Readers / Screen Reader Simulation

The Screen Reader Simulation bookmarklet approximates how screen reader users perceive a page by removing visual presentation and revealing accessibility markup. Prompts to include element role labels and optionally strip all CSS, removes decorative images (alt="", SVGs without roles), replaces images with their alt text, swaps aria-label and aria-labelledby content into visible text, reveals visually-hidden content in purple dashed outlines, removes aria-hidden elements, and displays accessible names in green boxes with image/SVG icons. Useful for understanding the screen reader experience without using assistive technology.

WCAG SC 1.1.1: Non-text Content
Run Screen Reader Simulation

Test run or drag to
bookmarklets bar to install

javascript:%21function()%7B%22use%20strict%22%3Btry%7B%21function()%7Bfunction%20e(e%2Ct)%7Bt.parentNode.insertBefore(e%2Ct.nextSibling)%7Dfunction%20t(e)%7Bvar%20t%2Cr%3Bfor(t%3D0%3Bt%3Ce.styleSheets.length%3Bt%2B%2B)e.styleSheets.item(t).disabled%3D%210%3Bfor(t%3D0%2Cr%3De.getElementsByTagName(%22*%22)%3Bt%3Cr.length%3Bt%2B%2B)r%5Bt%5D.style.cssText%3D%22%22%7Dfunction%20r(e)%7Bvar%20t%2Cr%3De.createElement(%22style%22)%3Be.head.appendChild(r)%2C(t%3Dr.sheet).insertRule(%22img%2Cfigure%20%7Bmax-height%3A200px%21important%3Bwidth%3Aauto%21important%3B%7D%22%2C0)%2Ct.insertRule(%22svg%20%7Bmax-height%3A40px%21important%3Bwidth%3Aauto%21important%3B%7D%22%2C0)%2Ct.insertRule(%22video%20%7Bmax-width%3A500px%21important%3Bheight%3Aauto%21important%3B%7D%22%2C0)%7Dlet%20n%3D%211%2Cl%3D%211%3Bvar%20a%2Co%2Ci%3Bconfirm(%22Do%20you%20want%20to%20include%20roles%20for%20interactive%20elements%3F%5Cn%5BOnly%20links%20and%20buttons%20included%20at%20present%5D%5Cn%5CnOK%20-%20Include%20roles%5CnCancel%20-%20Leave%20them%20out%22)%26%26(n%3D%210)%2Cconfirm(%22Do%20you%20want%20to%20strip%20all%20existing%20styles%3F%5Cn%5BThis%20may%20reveal%20content%2Fsections%20that%20are%20currently%20NOT%20visible%20to%20screen%20reader%20users%20and%20would%20be%20dynamically%20show%2Fhidden%5D%5Cn%5CnOK%20-%20Strip%20styles%5CnCancel%20-%20Leave%20as-is%22)%26%26(l%3D%210)%2Cn%26%26document.querySelector(%22body%22).classList.add(%22append-element-role%22)%2CArray.from(document.querySelectorAll(%22%5Baria-hidden%5D%22)).forEach(e%3D%3E%7Be.remove()%7D)%2Cfunction()%7Bvar%20e%3Ddocument.querySelectorAll(%22%5Baria-labelledby%5D%22)%3Blet%20t%3Ddocument.querySelectorAll(%27a%5Bhref%5D%2Cbutton%2Cselect%2Cinput%3Anot(%5Btype%3D%22hidden%22%5D)%2Ctextarea%2Csummary%2Carea%2C%5Btabindex%5D%3Anot(%23WTFocusPanel)%3Anot(%5Btabindex%5E%3D%22-1%22%5D)%2C%5Bcontenteditable%5D%3Anot(%5Bcontenteditable%3D%22false%22%5D)%27)%3BArray.from(e).forEach(e%3D%3E%7Blet%20r%3D%211%3Bif(Array.from(t).forEach(t%3D%3E%7Be%3D%3D%3Dt%26%26(r%3D%210)%7D)%2Cr)%7Blet%20t%3D%22%22%2Cr%3De.getAttribute(%22aria-labelledby%22).split(%22%20%22)%3BArray.from(r).forEach(e%3D%3E%7Bif(document.querySelector(%22%23%22%2Be))%7Blet%20r%3Ddocument.querySelector(%22%23%22%2Be).textContent%3Br%26%26(t%2B%3Dr%2B%22%20%22)%7D%7D)%2Ct%3Dt.trim()%2Ce.textContent%3Dt%2Ce.classList.add(%22swapped-text%22)%2Ce.removeAttribute(%22aria-labelledby%22)%7D%7D)%7D()%2CArray.from(document.querySelectorAll(%22a%5Baria-label%5D%2C%5Brole%3Dlink%5D%5Baria-label%5D%2Cb%5Baria-label%5D%2C%5Brole%3Dbutton%5D%5Baria-label%5D%22)).forEach(e%3D%3E%7Be.textContent%3De.getAttribute(%22aria-label%22)%2Ce.classList.add(%22swapped-text%22)%2Ce.classList.add(%22svg%22)%7D)%2CArray.from(document.querySelectorAll(%27img%5Balt%3D%22%22%5D%3Anot(img%5Baria-label%5D)%27)).forEach(e%3D%3E%7Be.remove()%7D)%2CArray.from(document.querySelectorAll(%22svg%3Anot(%5Brole%3Dimg%5D%5Baria-label%5D%2C%5Brole%3Dimg%5D%5Baria-labelledby%5D)%22)).forEach(e%3D%3E%7Be.remove()%7D)%2CArray.from(document.querySelectorAll(%22img%3Anot(img%5Balt%5D)%22)).forEach(t%3D%3E%7Blet%20r%3Ddocument.createElement(%22span%22)%3Br.textContent%3Dt.getAttribute(%22src%22)%2Cr.classList.add(%22img-warning%22)%2Ce(r%2Ct)%2Ct.remove()%7D)%2CArray.from(document.querySelectorAll(%22img%5Balt%5D%22)).forEach(t%3D%3E%7Blet%20r%3Ddocument.createElement(%22span%22)%3Br.textContent%3Dt.getAttribute(%22alt%22)%2Cr.classList.add(%22swapped-text%22)%2Cr.classList.add(%22img%22)%2Ce(r%2Ct)%2Ct.remove()%7D)%2CArray.from(document.querySelectorAll(%22.visually-hidden%22)).forEach(t%3D%3E%7Blet%20r%3Ddocument.createElement(%22span%22)%3Br.textContent%3Dt.textContent%2Cr.classList.add(%22visually-hidden-revealed%22)%2Ce(r%2Ct)%2Ct.remove()%7D)%2CArray.from(document.querySelectorAll(%22*%22)).forEach(e%3D%3E%7Bi%3DgetComputedStyle(e)%3Bfor(var%20t%3D%211%2Cr%3D%211%2Cn%3D%211%2Cl%3D%211%2Cd%3D%211%2Cs%3D%211%2Cc%3D%211%2Cu%3D%211%2Cm%3D0%3Bm%3Ci.length%3Bm%2B%2B)a%3Di.item(m)%2Co%3Di.getPropertyValue(a)%2C%22clip%22%3D%3D%3Da%26%26%22rect(1px%2C%201px%2C%201px%2C%201px)%22%3D%3D%3Do%26%26(t%3D%210)%2C%22clip-path%22%3D%3D%3Da%26%26%22inset(100%25)%22%3D%3D%3Do%26%26(r%3D%210)%2C%22height%22%3D%3D%3Da%26%26%221px%22%3D%3D%3Do%26%26(n%3D%210)%2C%22overflow-x%22%3D%3D%3Da%26%26%22hidden%22%3D%3D%3Do%26%26(l%3D%210)%2C%22overflow-y%22%3D%3D%3Da%26%26%22hidden%22%3D%3D%3Do%26%26(d%3D%210)%2C%22position%22%3D%3D%3Da%26%26%22absolute%22%3D%3D%3Do%26%26(s%3D%210)%2C%22white-space%22%3D%3D%3Da%26%26%22nowrap%22%3D%3D%3Do%26%26(c%3D%210)%2C%22width%22%3D%3D%3Da%26%26%221px%22%3D%3D%3Do%26%26(u%3D%210)%3B%210%3D%3D%3Dt%26%26%210%3D%3D%3Dr%26%26%210%3D%3D%3Dn%26%26%210%3D%3D%3Dl%26%26%210%3D%3D%3Dd%26%26%210%3D%3D%3Ds%26%26%210%3D%3D%3Dc%26%26%210%3D%3D%3Du%26%26e.classList.add(%22visually-hidden%22)%7D)%2Cl%26%26t(document)%2Cr(document)%2Cfunction()%7Bvar%20e%2Ct%3Ddocument.createElement(%22style%22)%3Bdocument.head.appendChild(t)%2C(e%3Dt.sheet).insertRule(%22*%20%7Bfont-size%3A1.25rem%7D%22%2C0)%2Ce.insertRule(%22.visually-hidden-revealed%20%7Boutline%3A3px%20dashed%20purple%3B%7D%22%2C0)%2Ce.insertRule(%22.img-warning%20%7Boutline%3A3px%20dashed%20red%3B%7D%22%2C0)%2Ce.insertRule(%22.swapped-text%20%7Boutline%3A3px%20dashed%20green%3Bbackground%3A%23dbefdb%3Bpadding%3A3px%3Bline-height%3A1.5%3B%7D%22%2C0)%2Ce.insertRule(%22.img-type-indicator%20%7Bdisplay%3Ainline-block%3Bmargin-left%3A5px%7D%22%2C0)%2Ce.insertRule(%22table%2Cth%2Ctd%20%7Boutline%3A1px%20dotted%20black%3B%7D%22%2C0)%2Ce.insertRule(%22th%2Ctd%20%7Bpadding%3A3px%3B%7D%22%2C0)%2Ce.insertRule(%22button%2C%5Brole%3Dbutton%5D%20%7Bpadding%3A3px%2020px%3Bbackground%3A%23dedede%3Bborder%3A3px%20solid%20black%3Bdisplay%3Ainline-block%3Btext-align%3Acenter%3Bborder-radius%3A5px%3B%7D%22%2C0)%2Ce.insertRule(%22a%2C%5Brole%3Dlink%5D%20%7Btext-decoration%3Aunderline%3Bcolor%3Ablue%3Bfont-weight%3Anormal%3B%7D%22%2C0)%2Ce.insertRule(%27.append-element-role%20a%3Aafter%2C.append-element-role%20%5Brole%3Dlink%5D%3Aafter%20%7Bdisplay%3Ainline-block%3Bmargin-left%3A5px%3Bcontent%3A%20%22LINK%22%7D%27%2C0)%2Ce.insertRule(%27.append-element-role%20button%3Aafter%2C.append-element-role%20%5Brole%3Dbutton%5D%3Aafter%20%7Bdisplay%3Ainline-block%3Bmargin-left%3A5px%3Bcontent%3A%20%22BUTTON%22%7D%27%2C0)%7D()%2CArray.from(document.querySelectorAll(%22iframe%22)).forEach(e%3D%3E%7Bt(e.contentWindow.document)%2Cr(e.contentWindow.document)%7D)%2CArray.from(document.querySelectorAll(%22.swapped-text.img%22)).forEach(e%3D%3E%7Blet%20t%3Ddocument.createElement(%22span%22)%3Bt.textContent%3D%22%5Cud83c%5Cudfde%5Cufe0f%22%2Ct.setAttribute(%22aria-hidden%22%2C%22true%22)%2Ct.classList.add(%22img-type-indicator%22)%2Ct.setAttribute(%22title%22%2C%22Alternative%20text%20from%20IMG%20element%22)%2Ce.appendChild(t)%7D)%2CArray.from(document.querySelectorAll(%22.swapped-text.svg%22)).forEach(e%3D%3E%7Blet%20t%3Ddocument.createElement(%22span%22)%3Bt.textContent%3D%22%5Cu2733%5Cufe0f%22%2Ct.setAttribute(%22aria-hidden%22%2C%22true%22)%2Ct.classList.add(%22img-type-indicator%22)%2Ct.setAttribute(%22title%22%2C%22Alternative%20text%20from%20SVG%20element%22)%2Ce.appendChild(t)%7D)%7D()%2Cconsole.log(%22%5CnSource%3A%20https%3A%2F%2Fa11y-tools.com%2Fbookmarklets%2F%5CnBookmarklet%20name%3A%20Screen%20Reader%20Simulation%5CnAuthor%3A%20lloydi%20(Ian%20Lloyd)%5CnLicense%3A%20Refer%20to%20https%3A%2F%2Fa11y-tools.com%20for%20licensing%20information%5Cn%22)%7Dcatch(e)%7Balert(%22Bookmarklet%20Error%3A%20%22%2Be.message)%7D%7D()%3B
← Back to all bookmarklets