Skip to content

Visual Heading Not Marked Up As Such ​

Some text on a page is obviously a heading — it is bigger, it is bold, it has space around it, and it introduces the block below it. But if it was built with styling alone and never marked up as a heading, it exists only for people who can see it. A screen reader reads it as an ordinary line of text, and it never appears in the heading list.

This check finds text that looks like a heading but is not one.


What the tool checks ​

Every visible piece of text that is not already a heading is measured against four visual signals:

SignalThreshold
Font sizeAt least 1.5× the surrounding text
Font weight700 or heavier (bold)
Visual isolationAt least 16px of margin or padding around it
Text length120 characters or fewer

Text that meets at least three of the four is treated as a probable heading, and the tool reports it. It also suggests a level (h1–h6) based on how big the text is and how it relates to the headings the page already has.


Why it matters ​

Heading navigation is how screen reader users skim. A page that looks well organised but has no real headings behaves, to them, like one undifferentiated block of text — they have to read it top to bottom to find anything.


When it reports an issue ​

A run of text passes three or more of the visual signals and is not marked as <h1>–<h6> or role="heading".

Typical examples: "Our Premium Services", "Key Benefits" — short, large, bold, standing alone above a block of content.


When it stays quiet ​

SituationWhy it is not reported
<legend> inside a <fieldset>Already announced as the group's label
<figcaption> inside a <figure>Already tied to its figure
Bold text inside a paragraphEmphasis, not a section title
Content inside dialogs or modalsCovered by a separate check
Hidden elementsNot visible to anyone
Non-text elementsScripts, styles, raw SVG and similar are not text

What the report says ​

Title: Visual heading is not marked up as such

Description: The "[text]" visually looks like a heading but is not marked up as such.

Expected result: The text should be marked using a proper heading element (h1–h6).

WCAG checkpoint: 1.3.1 - Info and Relationships

The report includes the affected text, the suggested heading level, and which of the four visual signals it matched.


How to verify it by hand ​

  1. Open the page and turn on a screen reader.
  2. Navigate by headings — the H key in NVDA.
  3. Compare what you hear against what you see: is there text on screen that clearly reads as a section title but never comes up in the heading list?

Known limitations ​

This check is a judgement based on appearance, so it is the one most likely to be occasionally wrong in both directions.

  • False positives happen. A large, bold, isolated line that is genuinely not a heading — a pull quote, a price, a short callout — can match three signals and be reported.
  • False negatives happen too. A heading styled subtly, at only slightly larger text, may not reach three signals and will be missed.
  • Text inside images or SVG is not read. A heading rendered as a picture is invisible to this check.
  • It judges appearance, not intent. The tool cannot know what the author meant the text to be; it only knows what it looks like.

WCAG reference ​

Success Criterion 1.3.1 Info and Relationships (Level A)