The frame-title rule flags an <iframe> (or <frame>) that has no accessible name. A screen reader then has nothing reliable to announce – depending on the software, people hear just "frame", a web address or whatever title the embedded document happens to have – and cannot tell a map from a video from an advert before they enter it. The fix is a short, descriptive title attribute: <iframe title="Map: our office in Berlin" …>.
What the rule means
An iframe is a separate document inside the page. Assistive technology treats it as its own region and needs a name to announce it. WCAG 4.1.2 Name, Role, Value requires that user interface components have a name that software can determine; axe-core maps this rule to 4.1.2.
The rule passes when the frame has any of these:
- a non-empty
titleattribute – the usual way; aria-label, oraria-labelledbypointing to visible text;role="presentation"orrole="none".
Not checked: frames with a negative tabindex and frames hidden with CSS, such as display: none.
What the rule does not check: whether the name describes the content. title="iframe", title="Embedded content" or the generic "YouTube video player" from a copied embed code all pass, but none tells people which video or map they are about to enter.
Who is affected
Mainly blind people using a screen reader. When they reach an iframe, the screen reader announces its name; some screen readers also offer a list of frames on the page. Without a name, every embed sounds the same, and the only way to find out what is inside is to go in and explore. A missing name costs time on every page with an embed.
Why the check fails
- Embed codes copied from map, calendar, booking or form services that come without a
title. - CMS embed blocks and page builders that strip or never output the attribute.
- Third-party widgets – chat, reviews, social feeds, adverts – that inject their own iframes.
- Tracking and consent iframes that show nothing but are still exposed to assistive technology.
- Legacy framesets in old intranets and archives.
- JavaScript that creates iframes, for example lazy-loaded video players, without setting a name.
How to fix it
- Give every visible iframe a
titlethat says what is inside: "Map: our office in Berlin", "Video: installing the wall bracket (3 min)". - Change the generic names from embed codes – "YouTube video player" – to something specific.
- For frames that hold nothing for people, such as tracking pixels, hide them from everyone (
hiddenordisplay: none) instead of inventing a name. - For third-party widgets you cannot change, raise it with the vendor and log the finding with a reason.
<!-- Before: an embedded map with no name -->
<h2>How to find us</h2>
<iframe class="office-map" src="/embed/office-map.html"
width="600" height="400" loading="lazy"></iframe>
<!-- After: the title says what the frame contains -->
<h2>How to find us</h2>
<iframe class="office-map" src="/embed/office-map.html"
title="Map: Example Ltd office, Berlin"
width="600" height="400" loading="lazy"></iframe>
The title can repeat the visible heading, but should still make sense on its own, since screen readers may list frames out of context.
How to test it manually
- In the browser console, list every frame and its name:
[...document.querySelectorAll('iframe')].map(f => f.title). An empty string means no title. - Read each title and ask: would I know what is inside without seeing it?
- With a screen reader (NVDA on Windows, VoiceOver on macOS), tab or arrow to the embed and listen to what is announced.
- Check the content inside the frame too – a video player's own buttons need names, and those are checked inside the frame, not by this rule.
Related WCAG criterion
4.1.2 Name, Role, Value, Level A. Related: 2.4.1 Bypass Blocks, because named frames help people skip content blocks, and 1.3.1 Info and Relationships.
How Reviseberg reports it
Reviseberg runs frame-title on every crawled page at 1280px. Embeds in the header or footer – a map, a chat widget – show up on every page, so the page count tells you whether a template or a single article is the cause. The issue list shows the rule with its severity, WCAG criterion 4.1.2 and level, the number of elements and pages, and the points you get back by fixing it. The detail view shows the selector, the HTML snippet with the frame's src and every affected page. For a third-party widget you cannot change, you can mark the finding "can't fix" with a reason; "ignore" and "false positive" are there too, and every decision is logged.
Whether a title actually describes its frame is not something a crawl decides. With no findings, 4.1.2 shows as partly checked, not passed, until a person records a manual result.