Sample report · Tabstop Audits, a brand of Clearwork Studio

Sample Accessibility Audit Report: CityLights demo home page (W3C BAD, "before" version)

Report date
October 24, 2026
Standard
WCAG 2.2 Level A and AA
Page audited
https://www.w3.org/WAI/demos/bad/before/home.html
Scope
One page: the CityLights demo content of the W3C Before and After Demonstration inaccessible home page (https://www.w3.org/WAI/demos/bad/before/home.html). The W3C wrapper around the demo (yellow header with "Skip to inaccessible demo page", demo navigation, and footer) is out of scope.

About this sample: the page audited is a public teaching demo built by the W3C Web Accessibility Initiative to be inaccessible on purpose. It is not a real business. This report is not legal advice and is not a certification of compliance.

Summary

Issues by severity
SeverityIssuesMeaning
critical3blocks some people from using the page or completing a task
serious5causes major difficulty or confusion
moderate2causes friction; workarounds exist
minor1polish and best practice
Screenshot of the CityLights inaccessible demo home page at desktop width, showing an image-based left menu, a quick menu drop-down in the banner, news stories, and two teaser panels on the right.
The page as tested, desktop width (1280 px).

Results at a glance

All issues, most severe first
#SeverityIssueWCAG 2.2 criteria
1criticalKeyboard focus is thrown away on most links2.1.1 Keyboard (A); 2.4.7 Focus Visible (AA)
2criticalImage-based menu links and "more" arrows have no accessible name1.1.1 Non-text Content (A); 2.4.4 Link Purpose (In Context) (A); 4.1.2 Name, Role, Value (A)
3criticalQuick menu has no label and jumps to a new page when you arrow through it3.2.2 On Input (A); 4.1.2 Name, Role, Value (A); 3.3.2 Labels or Instructions (A)
4seriousImages are missing text alternatives, or have wrong or unhelpful ones1.1.1 Non-text Content (A)
5seriousPage language is not set3.1.1 Language of Page (A)
6seriousNo headings or page structure in the demo content1.3.1 Info and Relationships (A); 2.4.6 Headings and Labels (AA)
7seriousContent does not reflow on narrow screens or at high zoom1.4.10 Reflow (AA)
8seriousLow-contrast text in the right-hand teaser headings1.4.3 Contrast (Minimum) (AA)
9moderateText shown as images1.4.5 Images of Text (AA)
10moderateLink text that doesn't say where it goes2.4.4 Link Purpose (In Context) (A)
11minorSmall adjacent links in the W3C wrapper (out of scope, noted for completeness)2.5.8 Target Size (Minimum) (AA)

Issues in detail

1. Keyboard focus is thrown away on most links

critical · 2.1.1 Keyboard (A); 2.4.7 Focus Visible (AA)

Found by
Manual keyboard test (axe-core has no rule for this)
Where
14 of the 20 links in the demo content: the left navigation (Home, News, Tickets, Survey), the three news headlines, the three "more" arrows, both "Click here" links, and both "Read More..." links. Each has onFocus="blur();".
Why it matters
When a keyboard user tabs to one of these links, the page immediately removes focus from it. Pressing Enter then does nothing. In our test, focusing the News link and pressing Enter left us on the home page. People who use a keyboard, switch device, or voice control that relies on focus cannot follow these links at all.
How to fix
Delete the onFocus="blur();" attributes. Never remove focus from an element when it receives it. If the outline was removed for looks, restyle it instead.

Before

<a href="news.html" onFocus="blur();">Heat wave linked to temperatures</a>

After

<a href="news.html">Heat wave linked to temperatures</a>

/* CSS: a clear, consistent focus style */
a:focus-visible { outline: 3px solid #b34700; outline-offset: 2px; }

2. Image-based menu links and "more" arrows have no accessible name

critical · 1.1.1 Non-text Content (A); 2.4.4 Link Purpose (In Context) (A); 4.1.2 Name, Role, Value (A)

Found by
axe-core link-name (7 links), image-alt; Lighthouse
Where
Left navigation: 4 links whose only content is an image of text with no alt attribute (nav_home.gif, nav_news.gif, nav_facts.gif, nav_survey.gif). News stories: 3 "more" arrow links whose image has alt="".
Why it matters
A screen reader announces these as "link" with no name, or reads out the file name or URL. A blind visitor can't tell which link goes to News and which to Tickets, and voice control users can't say the link's name to click it.
How to fix
Use real text links for navigation (better), or give each image alt text that matches the words in the image. For the arrows, give each link a name that says where it goes.

Before

<a href="javascript:location.href='news.html';" onFocus="blur();"><img src="./img/nav_news.gif" name="nav_news"></a>
<a href="news.html" onFocus="blur();"><img src="./img/morearrow.gif" alt=""></a>

After

<nav aria-label="Main">
  <ul>
    <li><a href="home.html" aria-current="page">Home</a></li>
    <li><a href="news.html">News</a></li>
    <li><a href="tickets.html">Tickets</a></li>
    <li><a href="survey.html">Survey</a></li>
  </ul>
</nav>
<a href="news.html">Read more<span class="visually-hidden">: Heat wave linked to temperatures</span></a>

3. Quick menu has no label and jumps to a new page when you arrow through it

critical · 3.2.2 On Input (A); 4.1.2 Name, Role, Value (A); 3.3.2 Labels or Instructions (A)

Found by
axe-core select-name; manual keyboard test
Where
The "QUICKMENU ---->" drop-down in the top banner (<select onchange="location.href = this.value;">).
Why it matters
The drop-down has no label, so a screen reader just says "combo box". Worse, keyboard users move through options with the arrow keys, and each arrow press fires onchange. In our test, one press of the down arrow navigated away to the first option's page, so keyboard users can never reach the other 14 options.
How to fix
Give the select a visible label and only navigate when the person presses a Go button. Better still, replace it with an ordinary list of links.

Before

<SELECT ONCHANGE="location.href = this.value;">
  <OPTION SELECTED>QUICKMENU ----&gt;
  <OPTION VALUE="../offsite.html">Broadcasting
  ...
</SELECT>

After

<form action="go.html">
  <label for="quickmenu">City services</label>
  <select id="quickmenu" name="service">
    <option value="broadcasting">Broadcasting</option>
    ...
  </select>
  <button type="submit">Go</button>
</form>

4. Images are missing text alternatives, or have wrong or unhelpful ones

serious · 1.1.1 Non-text Content (A)

Found by
axe-core image-alt (33 images); manual review
Where
33 <img> elements have no alt attribute. Most are layout spacers and borders (border_*.gif, marker2_*.gif, blank_5x5.gif). Meaningful images without alt: the weather icon (top_weather.gif, a sun behind a cloud) and the two right-column photos (teaser_right1.jpg, a singer on a dark stage; teaser_right2.jpg). The three news photos are CSS background images with title="image", so there is no text alternative at all. The hotline image shows "(1) 269 C-H-O-K-E" but its alt says "1234 56789". The logo's alt text is a 60-word visual description. Bullet images have alt="bullet".
Why it matters
Screen readers read out missing-alt images as file names ("border underscore left underscore top dot gif"), dozens of times on this page. Meanwhile, information that matters is lost or wrong: a blind visitor who wants artichoke advice would be given the wrong phone number.
How to fix
Decorative images: alt="" (or move them into CSS). Meaningful images: short alt text that gives the same information. Content photos: use <img> with alt, not CSS backgrounds. Logo: alt="CityLights: your access to the city". Phone number: use real text.

Before

<img src="./img/border_top.gif" height="10">
<img src="./img/telefon_white_bg.gif" alt="1234 56789">
<div class="image" style="background:url(./img/panda-sm.jpg)" title="image"></div>

After

<img src="./img/border_top.gif" height="10" alt="">
<p>Artichoke advice hotline: (1) 269 C-H-O-K-E</p>
<img src="./img/panda-sm.jpg" alt="[describe the photo's point in the story]">

5. Page language is not set

serious · 3.1.1 Language of Page (A)

Found by
axe-core html-has-lang; Lighthouse
Where
The <html> element has no lang attribute.
Why it matters
Screen readers use the language to choose pronunciation. Without it, a reader set to another language may read English text with the wrong accent and rules, making it hard to understand. Browser translation and spell-check also rely on it.
How to fix
Add the page language to the html element.

Before

<HTML>

After

<html lang="en">

6. No headings or page structure in the demo content

serious · 1.3.1 Info and Relationships (A); 2.4.6 Headings and Labels (AA)

Found by
Manual DOM review (0 heading elements in the demo); axe-core region and landmark-one-main (best practice)
Where
"Welcome to CityLights", "Elsewhere on the Web", the three news headlines, and the "Free Penguins" and "More City Parks" teasers all look like headings but are styled paragraphs, <b>, or <font> text. The layout is built with nested tables. There is no <main>, <nav>, or other landmark.
Why it matters
Screen reader users commonly move through a page by heading or landmark to find what they need. With no headings and no landmarks, they have to listen to the whole page from the top, including dozens of spacer images.
How to fix
Mark up visual headings as real headings in a logical order, use landmarks for the main areas, and replace layout tables with CSS layout.

Before

<p class="headline">Welcome to CityLights</p>
<TABLE WIDTH=780px ...> ... </TABLE>

After

<header>...</header>
<nav aria-label="Main">...</nav>
<main>
  <h1>Welcome to CityLights</h1>
  <section aria-labelledby="news-h"><h2 id="news-h">Latest news</h2>
    <h3>Heat wave linked to temperatures</h3> ...
  </section>
</main>

7. Content does not reflow on narrow screens or at high zoom

serious · 1.4.10 Reflow (AA)

Found by
Manual test in a 320 px wide viewport (equivalent to 400% zoom on a 1280 px screen)
Where
Whole page. Fixed-width tables (WIDTH=800px and 780px) force a page width of 800 px; at 320 px wide the page needs sideways scrolling to read every line.
Why it matters
People with low vision who zoom in, and anyone on a small phone, must scroll left and right for every line of text, which is slow and makes it easy to lose your place.
How to fix
Remove fixed pixel widths and use a responsive CSS layout that stacks columns on narrow screens.

Before

<TABLE WIDTH=800px ...>

After

.page { max-width: 50rem; margin: 0 auto; }
.columns { display: flex; flex-wrap: wrap; gap: 1rem; }
.columns > * { flex: 1 1 15rem; }
Screenshot of the demo page in a 320 pixel wide window: only the left part of the banner and menu are visible and the content is cut off on the right.
At 320 px wide the page is cut off and needs sideways scrolling.

8. Low-contrast text in the right-hand teaser headings

serious · 1.4.3 Contrast (Minimum) (AA)

Found by
axe-core color-contrast; Lighthouse
Where
"Free Penguins" and "More City Parks" headings: #41545D text on #A9B8BF background, a contrast ratio of 3.88:1. Normal-size text needs at least 4.5:1.
Why it matters
People with low vision or color-vision differences, and anyone reading on a phone in sunlight, may struggle to read these headings.
How to fix
Darken the text or lighten the background. For example, #1F2A30 on #A9B8BF is about 7.2:1.

Before

<TD BGCOLOR=#A9B8BF><FONT COLOR=#41545D ...><B>Free Penguins</B></FONT></TD>

After

<h2 class="teaser-title">Free Penguins</h2>
.teaser-title { background: #a9b8bf; color: #1f2a30; }

9. Text shown as images

moderate · 1.4.5 Images of Text (AA)

Found by
Manual review
Where
Navigation labels (nav_*.gif), the phone number (telefon_white_bg.gif), and the "CITYLIGHTS" banner text.
Why it matters
Text in images blurs when zoomed, can't be restyled by people who change fonts or colors to read comfortably, and can't be copied or translated. Logos are an allowed exception; the menu and phone number are not.
How to fix
Use real HTML text styled with CSS for navigation and the phone number.

Before

<img src="./img/nav_news.gif">

After

<a href="news.html" class="nav-link">News</a>

10. Link text that doesn't say where it goes

moderate · 2.4.4 Link Purpose (In Context) (A)

Found by
Manual review
Where
Two "Click here" links (Killer bees, Onions) and two "Read More..." links in the right column. The "Click here" links also open a new window without warning.
Why it matters
Screen reader users often pull up a list of links to scan a page. A list with "Click here, Click here, Read More..., Read More..." tells them nothing. An unexpected new window can disorient people, especially when the Back button stops working.
How to fix
Make the link text describe the destination, and say when a link opens a new window (or don't open one).

Before

Killer bees. <a href="../offsite.html" target="_blank">Click here</a>.

After

<a href="../offsite.html">Killer bee safety information (external site)</a>

11. Small adjacent links in the W3C wrapper (out of scope, noted for completeness)

minor · 2.5.8 Target Size (Minimum) (AA)

Found by
axe-core target-size
Where
The "Report" links in the W3C demo navigation, outside the CityLights page.
Why it matters
Small, tightly packed targets are hard to hit for people with tremors or limited dexterity.
How to fix
Not part of the audited page. Listed so the axe-core results reconcile with this report.

Method and limits

Automated scan
axe-core 4.13.0 via @axe-core/playwright, rule tags wcag2a/aa, wcag21a/aa, wcag22aa and best-practice, run on the live page in Chrome (headless), October 24, 2026.
Lighthouse
Lighthouse 12.8.2 accessibility category. The W3C site served an automated-traffic check page to Lighthouse's headless browser, so Lighthouse was run against a byte-for-byte local copy of the page and its images and stylesheets (fetched with wget) served from localhost.
WAVE methodology
Visual review of the same items WAVE highlights: alt text, structure, contrast, links, and form labels. The WAVE tool itself was not run.
Manual keyboard pass
Reasoned from the DOM, then confirmed with scripted keypresses in Chrome via Playwright: tab sequence from the start of the demo, Enter on a focused link, arrow key on the quick menu.
Reflow
Page loaded in a 320 × 640 CSS pixel viewport; document width measured (800 px).
Not covered
Screen reader listening session (not performed for this sample; findings that affect screen readers are inferred from the code), mobile devices, other pages of the demo.

Next steps

  1. Fix the three critical issues first (items 1 to 3). They are small code changes.
  2. Add alt text and the page language, and fix contrast (items 4, 5, 8).
  3. Plan the structural rework: headings, landmarks, and a responsive layout (items 6, 7).
  4. Re-test with a keyboard and a screen reader after fixes.