Whole page hidden from screen readers
What it is
The page’s <body> or <html> tag carries aria-hidden="true" in the HTML your server sends. That attribute removes an element and everything inside it from the accessibility tree, the version of the page that assistive technology reads, so on the body it hides the entire page. In the HTML a server sends, it typically comes from a caching or pre-rendering tool that saved the page while a pop-up, cookie banner or menu script had hidden it, or from a template that writes it.
Why it matters
Screen reader users get nothing to read and cannot use the page, while sighted visitors see it as normal, so the problem easily goes unnoticed. Keyboard users can still tab to links that are never announced, which MDN warns against. An AI agent that reads pages through the accessibility tree may likewise see little of it; OpenAI says its agent in ChatGPT Atlas uses ARIA labels and roles. It fails WCAG 1.3.1 Info and Relationships and 4.1.2 Name, Role, Value , both Level A, which the European Accessibility Act has applied to many businesses selling to consumers online in the EU since June 2025.
How Asky checks it
Asky reads the page’s raw HTML and reports the page when the <body> or <html> tag has aria-hidden set to true, in any letter case, and the issue says which of the two carries it. The attribute is not reported on a wrapper around all content, and a value added or removed by JavaScript after the page loads is not seen. The checks for button and link names, form labels, frame titles, heading order and tabindex skip everything inside aria-hidden="true", including a hidden body or <html>, so fixing this can reveal issues that were masked.
Reported as an error with high severity.
How to fix it
- Open the page’s source, not the browser’s element inspector, and find
aria-hidden="true"on the<body>tag, or on<html>or a wrapper around the whole page. - Remove it from the template, theme or custom code that writes it.
- If a pop-up, cookie banner or menu script sets it, fix or update the script: it should hide only the content behind the open dialog, never the body, because the dialog is inside the body too. A
<dialog>element opened withshowModal()hides the rest of the page from assistive technology without this attribute. - If a caching or pre-rendering tool saved the page with a dialog open, clear that cache after fixing the script.
- Run the audit again: issues such as unnamed buttons or unlabeled fields that the hidden body masked may now be reported.
Example
The home page of https://example.com is served as it was left by a cookie banner:
<!-- Before: the whole page is hidden from screen readers -->
<body class="home" aria-hidden="true">
<!-- After -->
<body class="home">