Visual Accessibility Testing
Visual accessibility testing checks whether people with low vision, colour-vision deficiencies, vestibular disorders or simply a small screen in bright sunlight can perceive and operate the interface. It covers contrast, colour, images, zoom, spacing, target size and motion — the part of WCAG 2.2 you can mostly test with your eyes, a browser and a few settings.
This guide explains what each success criterion requires, how to test it quickly and reliably, and how to write the defect. Keyboard focus and screen-reader output are covered in their own guides.
Text contrast: what the ratio means and how to measure it
1.4.3 Contrast (Minimum) (AA) requires text and images of text to have a contrast ratio of at least 4.5:1 against their background, or 3:1 for large-scale text. WCAG defines large scale as at least 18 point, or 14 point bold (in CSS pixels, 18pt is 24px and 14pt is about 18.7px). Text in inactive components, pure decoration, invisible text, text that is part of a picture with significant other visual content, and logotypes have no contrast requirement. The stricter 1.4.6 Contrast (Enhanced) is AAA at 7:1 and 4.5:1.
The ratio is not a design opinion. WCAG defines it from the relative luminance of the two colours — the relative brightness of each colour on a scale from 0 for darkest black to 1 for lightest white, computed from its sRGB values — and the resulting ratio runs from 1:1 to 21:1. Use a contrast checker that implements the WCAG definition; do not estimate by eye.
For example: grey #767676 on white is 4.54:1 and passes for body text; #777777 on white is 4.48:1 and fails for normal-size text (do not round up), though it passes for large text. Measure the colours as rendered: text over a photo or gradient must be checked at its worst point, and hover, focus, visited, selected and error states each need their own measurement.
#767676 on white (4.54:1) passes for body text, while #777777 (4.48:1) fails and is never rounded up.Contrast ratio on white
Axis shortened between 8 and 20: not to scale
- ≥ 3:1Large text AA (1.4.3) · UI components and graphics (1.4.11)
- ≥ 4.5:1Normal text AA (1.4.3) · large text AAA (1.4.6)
- ≥ 7:1Normal text AAA (1.4.6)
- 11.61:1
#CCCCCCinput borderBelow 3:1 (1.4.11): the field is hard to identify.Fail - 22.85:1
#999999hint textBelow 4.5:1 for normal-size text (1.4.3).Fail - 34.48:1
#777777textFails for normal-size text; passes for large text.Fail - 44.54:1
#767676textPasses for body text.Pass
Magnified: 4.4:1 to 4.6:1
- ≥ 4.5:1Normal text AA (1.4.3)
- 14.48:1
#777777Fail - 24.54:1
#767676Pass
- Pick colours with the browser devtools colour picker or read them from the computed styles, not from the design file.
- Check body text, secondary text, links, button labels, input text and hint text, table headers, badges and toast messages.
- Check text on images and on semi-transparent overlays at the lightest area behind the text.
- Disabled controls are exempt, but a control that merely looks disabled while still working is not.
Non-text contrast: components, states and graphics
1.4.11 Non-text Contrast (AA) requires 3:1 against adjacent colours for the visual information needed to identify user-interface components and their states, and for the parts of graphics required to understand the content. Inactive components and unmodified browser-default controls are excepted, as are graphics where a particular presentation is essential.
The usual failures are pale input borders (a #CCCCCC border on white is 1.61:1), a checkbox whose checked state differs only by a faint tint, icon-only buttons in light grey, focus indicators that barely differ from the background, and chart lines or pie segments distinguished only by similar pastel colours. If a field has no visible border at all, check that something else identifies it as a field — a background fill or an underline that meets 3:1.
Use of colour
1.4.1 Use of Color (A) says colour must not be the only visual means of conveying information, indicating an action, prompting a response or distinguishing an element. This is separate from contrast: two colours can both pass contrast and still be indistinguishable for someone with a red–green deficiency.
Test by switching the page to greyscale (an operating-system colour filter or a browser vision-deficiency emulation) and asking: can I still tell which field is in error, which link is a link, which line on the chart is which, which status is “failed”? Links inside body text that differ from surrounding text only by colour need an underline or another non-colour cue.
Text alternatives: deciding what the alt text should be
1.1.1 Non-text Content (A) requires a text alternative that serves the equivalent purpose. Tools can tell you whether an alt attribute exists; only a person can decide whether it is right. Classify each image first, then judge the text.
- Informative image — alt conveys the information the image adds in context, briefly: “Bar chart: refunds fell from 9% to 4% after the new checkout” rather than “chart.png”.
- Decorative image — empty alt (alt="") or a CSS background, so screen readers skip it. A decorative image with alt="decorative swirl" is noise.
- Functional image — an image that is a link or button: alt describes the action or destination (“Search”, “Download invoice PDF”), not the picture (“magnifying glass”).
- Complex image — charts, diagrams, maps: a short alt that identifies it plus a longer description or data table nearby that carries the detail.
- Images of text — 1.4.5 Images of Text (AA) requires real text instead of images of text when the technology can achieve the same visual presentation; customizable images and essential ones such as logotypes are excepted.
- Redundant alt — if the adjacent text already says it, the image can be decorative; repeating the caption doubles what a screen-reader user hears.
Resize text, reflow at 320 CSS px and text spacing
1.4.4 Resize Text (AA): text can be resized up to 200 percent without assistive technology and without loss of content or functionality. Test with browser zoom at 200% and with a larger default font size, and look for clipped text, overlapping elements and controls that move off-screen.
1.4.10 Reflow (AA): content works without scrolling in two dimensions at a width equivalent to 320 CSS pixels (for vertically scrolling content) or a height of 256 CSS pixels (for horizontally scrolling content). WCAG notes that 320 CSS pixels corresponds to a 1280 px wide viewport at 400% zoom, which is the practical test: set the browser window to 1280 px, zoom to 400%, and read the whole page scrolling only vertically. Maps, diagrams, video, games, presentations and data tables may keep two-dimensional scrolling for those parts.
1.4.12 Text Spacing (AA): no content or functionality is lost when the user sets line height to 1.5 times the font size, spacing after paragraphs to 2 times, letter spacing to 0.12 times and word spacing to 0.16 times. Apply the override below with a bookmarklet or a user-stylesheet extension and look for truncated labels, overlapping text and buttons whose text is cut off. WCAG includes an exception for languages and scripts that do not use one of these properties — relevant to Arabic, where letter spacing interacts badly with joined letterforms; agree with your team how you apply it.
/* WCAG 1.4.12 text-spacing test override */
* {
line-height: 1.5 !important;
letter-spacing: 0.12em !important;
word-spacing: 0.16em !important;
}
p {
margin-bottom: 2em !important;
}Target size
2.5.8 Target Size (Minimum) (AA), new in WCAG 2.2, requires pointer targets to be at least 24 by 24 CSS pixels, with exceptions. An undersized target passes if a 24 CSS px diameter circle centred on it does not intersect another target or another undersized target’s circle; it also passes when an equivalent control that meets the size exists on the same page, when it is inline in a sentence, when its size is set by the user agent and not modified, or when the presentation is essential or legally required.
Measure in devtools (the element’s box, including padding that is part of the clickable area). Typical failures: close “×” icons in dialogs and chips, pagination numbers packed together, small checkboxes, and icon rows in table cells. Mobile platform guidelines from Apple and Google recommend larger touch targets than this minimum; when testing native apps, use the platform guidance as well.
Motion, animation and reduced-motion preferences
Three criteria matter. 2.2.2 Pause, Stop, Hide (A): moving, blinking or scrolling content that starts automatically, lasts more than five seconds and is shown alongside other content needs a way to pause, stop or hide it — carousels and marquee banners are the usual suspects. 2.3.1 Three Flashes or Below Threshold (A): nothing flashes more than three times in any one-second period, unless the flash is below the general and red flash thresholds. 2.3.3 Animation from Interactions (AAA): motion animation triggered by interaction can be disabled unless it is essential.
Even when a project targets AA, honouring the operating-system “reduce motion” setting is cheap and expected. Browsers expose it through the prefers-reduced-motion media feature. Turn on reduce motion in the OS (or emulate it in devtools) and verify that parallax, zoom-in page transitions, auto-playing background video and large sliding effects are removed or replaced by simple fades.
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}Dark mode, high contrast and forced colours
A dark theme is a second visual presentation, and every contrast check applies to it independently. Common dark-mode defects: brand colours that pass on white but fail on near-black, transparent PNG logos and icons with dark strokes that vanish, focus rings designed for a light background, charts that keep light-theme palettes, and shadows used as the only boundary of a card or field. Switch themes with the OS setting or the prefers-color-scheme emulation in devtools and re-run the contrast pass.
Also test with a forced-colours or high-contrast mode (for example Windows contrast themes). The browser replaces author colours, so information carried only by background colour or background images can disappear: custom checkboxes drawn with backgrounds, icons implemented as CSS backgrounds, and focus styles that rely on box-shadow alone.
Checklist: visual accessibility test cases
VISUAL A11Y CHECKLIST — <page / screen / build / theme>
Contrast
[ ] Body, secondary, link, button, input and hint text >= 4.5:1 (large text >= 3:1) (1.4.3)
[ ] Text over images/gradients measured at the worst point
[ ] Hover, focus, selected, visited and error states measured
[ ] Input borders, icons, checkbox/radio states, focus indicator >= 3:1 (1.4.11)
[ ] Chart elements needed for understanding >= 3:1 against neighbours (1.4.11)
Colour
[ ] In greyscale, errors, links, statuses and chart series are still distinguishable (1.4.1)
Images
[ ] Each image classified: informative / decorative / functional / complex (1.1.1)
[ ] Functional images describe the action; decorative have alt=""
[ ] No images of text except logos (1.4.5)
Zoom & layout
[ ] 200% zoom: no clipped or overlapping text, all functions available (1.4.4)
[ ] 1280px at 400% (= 320 CSS px): vertical scroll only, except 2-D content (1.4.10)
[ ] Text-spacing override: nothing truncated or overlapping (1.4.12)
Targets & motion
[ ] Pointer targets >= 24x24 CSS px or meet an exception (2.5.8)
[ ] Auto-moving content > 5 s can be paused/stopped/hidden (2.2.2)
[ ] No flashing more than 3 times per second (2.3.1)
[ ] Reduce-motion setting removes non-essential motion
Themes
[ ] Dark theme: full contrast pass repeated
[ ] Forced colours/high contrast: controls, icons and focus still visibleTypical defects, written as bug titles
Quote the measured colours and ratio in the report, attach a screenshot, and name the criterion. A contrast bug with “#9E9E9E on #FFFFFF = 2.68:1, required 4.5:1” gets fixed without debate.
- “Login: hint text #999999 on white is 2.85:1, below 4.5:1 (1.4.3)”
- “Profile form: input borders #CCCCCC on white are 1.61:1, fields not identifiable (1.4.11)”
- “Orders table: status ‘Failed’ vs ‘Paid’ shown only by red/green dot (1.4.1)”
- “Header search button: image alt is ‘magnifier icon’ instead of the action ‘Search’ (1.1.1)”
- “Pricing page at 1280px/400% zoom: comparison cards require horizontal scrolling (1.4.10)”
- “Chip close buttons are 16×16 CSS px and touch each other (2.5.8)”
- “Home carousel auto-advances every 4 s with no pause control (2.2.2)”
- “Dark theme: primary button text 3.1:1 on brand blue (1.4.3)”
Frequently asked questions
Is 4.49:1 close enough to 4.5:1?
No. The threshold is a minimum; a value below it fails. Report the measured ratio exactly as the checker computes it.
Do disabled buttons need to meet contrast?
No — text in inactive user-interface components is exempt from 1.4.3, and inactive components are exempt from 1.4.11. The exemption does not cover controls that look disabled but still work.
How do I test reflow without a phone?
Set the desktop browser window to 1280 CSS px wide and zoom to 400%; WCAG notes this is equivalent to 320 CSS px. Devtools responsive mode at 320 px wide is a useful cross-check.
Does WCAG require a dark mode or reduced-motion support?
No success criterion requires a dark theme; if you ship one, test it like any other presentation. Disabling interaction-triggered motion is 2.3.3, a AAA criterion; supporting prefers-reduced-motion is a common way to meet it and good practice at any level.
Is 24×24 CSS px enough for mobile apps?
It is the WCAG 2.2 AA minimum for web content. Apple and Google each publish larger recommended touch-target sizes in their platform guidelines, which teams usually adopt for native apps.
What should decorative images have: alt="" or no alt attribute?
An empty alt attribute. Without an alt attribute, some screen readers may announce the file name instead, which is worse than silence.
References
- Web Content Accessibility Guidelines (WCAG) 2.2The W3C Recommendation that defines the testable success criteria for accessible web content, organised under four principles and three conformance levels (A, AA, AAA).
- Understanding WCAG 2.2The informative explanation of each WCAG 2.2 guideline and success criterion: intent, who benefits, examples and techniques (not normative).
- How to Meet WCAG (Quick Reference)A filterable checklist of every WCAG 2.2 success criterion with its sufficient techniques and common failures.
- Easy Checks – A First Review of Web AccessibilitySimple first checks anyone can run — page title, text alternatives, headings, contrast, text resize, keyboard access — before a full evaluation.
- Accessibility — MDNPractical guides to building and checking accessible web pages: semantic HTML, ARIA, keyboard support and testing.
- Accessibility — Human Interface GuidelinesApple's accessibility design guidance for iOS and other platforms: VoiceOver, Dynamic Type, contrast, touch targets and motion.
- Test your app's accessibilityHow to test an Android app's accessibility manually with TalkBack and other services, and automatically with the platform's testing tools.
Practice exercise
Review a visual accessibility pass on a booking page
You test the web app of a chain of medical centres (fictional) where patients book appointments. Build 4.8.0-rc1 brings a redesigned booking page, and the contract requires WCAG 2.2 level AA. The app has an English and an Arabic UI. You have started the visual pass on the English UI and written down fourteen raw observations with the colours, ratios and sizes you measured; UI text is quoted in English in every language version because that is the UI under test. Before anything is filed, turn the notes into verdicts and defects.
Work on paper with the guide’s success criteria and its checklist. The ratios are already measured, so no luminance calculation is needed; the pointer targets need a little arithmetic. Not every observation is a failure, and not every problem is a failure at level AA: say which is which, and why. Allow 25–30 minutes.
Medical centre chain appointment booking (fictional) - web app, English and Arabic UI
Build 4.8.0-rc1: redesigned "Book an appointment" page, four steps on one page.
Contract: WCAG 2.2 level AA.
Pass so far: English UI, light theme, Chrome on Windows, browser window 1280 px wide,
plus one spot check in the dark theme. Ratios as shown by the devtools contrast
checker. Sizes are in CSS px, measured in devtools.
1 Step heading "Choose a doctor": 24px, regular weight.
#8A8A8A on #FFFFFF = 3.45:1
2 Doctor card, line "Next free slot: Tue 10:30": 14px, regular.
As rendered: #767676 on the card background #F5F5F5 = 4.17:1.
The design file shows a white card: #767676 on #FFFFFF = 4.54:1.
3 Hint under the mobile number field, "Example: 0501234567": 13px, regular.
#777777 on #FFFFFF = 4.48:1
Developer’s comment: "4.48 rounds to 4.5, so it passes."
4 Button "Pay at the clinic": 16px, regular, #9E9E9E on #EEEEEE = 2.31:1.
It looks disabled, but it works: one click books the visit without online payment.
5 Button "Next" on step 1 before a doctor is chosen: has the disabled attribute and
does nothing when clicked. #BDBDBD on #F5F5F5 = 1.72:1.
6 Text fields (name, mobile number, national ID): 1px border #D6D6D6 on #FFFFFF
= 1.45:1. No fill, no underline: the border is the only sign of where a field is.
7 Time slots: free slots have a light green background (#C8E6C9), booked slots a
light red one (#FFCDD2). The time text, e.g. "10:30", is #212121 on both
(11.98:1 and 11.44:1). Nothing else differs. Booked slots cannot be selected.
8 Icon-only button that opens the date picker:
<button type="button"><img src="calendar.svg" alt="calendar icon"></button>
9 Banner above the form: a JPG of plain white text on a flat green background,
"Free check-up for over-60s every Sunday", and the same sentence as its alt text.
No photo or other picture in the banner.
10 Browser window 1280 px wide, zoom 400%:
a) The form keeps a fixed width of 600 px. The "Next" button is cut off on the
right and can be reached only by scrolling sideways.
b) The fee table (a data table with 6 columns) scrolls sideways inside its own
box. The rest of the page scrolls only vertically.
11 Pointer targets (box including padding):
a) Chosen services are listed as chips, one under the other. Each chip has a "×"
remove button of 16×16 px. The "×" buttons of neighbouring chips are 20 px
apart, centre to centre. Nothing else on this step removes a service.
b) "i" info icon next to the fee: 18×18 px. The nearest other target is 30 px
from its edge.
12 "Health tips" carousel above the form: starts on page load, slides to the next
tip every 6 s and loops without end. No pause, stop or hide control.
13 With prefers-reduced-motion: reduce emulated in devtools, moving from one step
to the next still slides the whole form in from the side (about 0.4 s).
14 Dark theme spot check: link "Change doctor", 16px regular, #1565C0 on the page
background #121212 = 3.26:1. The same link colour on white is 5.75:1.- Give each observation a verdict — Pass, Fail, Exempt (no requirement applies) or Not an AA failure — and name the success criterion with its number and level (A, AA or AAA). Judge 10a, 10b, 11a and 11b separately.
- For every colour observation, first write which threshold applies and why — 4.5:1 for normal text, 3:1 for large-scale text, 3:1 for non-text, or none — and only then compare it with the measured ratio.
- Write a bug title in the guide’s style for each failure: the screen and element, the measured values against the required one, and the criterion.
- Compare your notes with the guide’s checklist. List the checks still missing before this visual pass can be called complete, and say which observations to re-check in which mode or setting.
Show the model answer
Text contrast — threshold first, then the ratio. 1, step heading: Pass, 1.4.3 Contrast (Minimum) (AA). 24px is 18pt, so the heading is large-scale text even in regular weight and needs 3:1; 3.45:1 passes. The same grey would need 4.5:1, and fail, if the heading were made smaller than 24px regular or about 18.7px bold. 2, doctor card: Fail, 1.4.3. 14px regular is normal text and needs 4.5:1, and what counts is the colour as rendered: #767676 on #F5F5F5 is 4.17:1. The white card in the design file does not matter. Title: “Booking, doctor card: ‘Next free slot’ text #767676 on #F5F5F5 is 4.17:1, below 4.5:1 (1.4.3)”. 3, mobile number hint: Fail, 1.4.3. 4.48:1 is below the 4.5:1 minimum, and ratios are never rounded up; answer the developer with the rule and the measured value, not with an opinion. Title: “Booking form: mobile number hint #777777 on white is 4.48:1, below 4.5:1 (1.4.3)”.
4, Pay at the clinic: Fail, 1.4.3. The contrast exemption covers inactive components only, and this button works, so its text needs 4.5:1 and has 2.31:1. It also misleads: patients may read the option as unavailable, so ask for it to be styled as the active button it is. Title: “Booking: active ‘Pay at the clinic’ button text #9E9E9E on #EEEEEE is 2.31:1, below 4.5:1, and looks disabled (1.4.3)”. 5, disabled Next: Exempt. The button has the disabled attribute and does nothing, so it is an inactive component: its text has no requirement under 1.4.3, and the component is excepted from 1.4.11. Not a defect. 6, text fields: Fail, 1.4.11 Non-text Contrast (AA). The border is the only visual information that identifies a field, so it needs 3:1 against the white background; 1.45:1 fails. A darker border, or a fill or underline that reaches 3:1, fixes it. Title: “Booking form: input borders #D6D6D6 on white are 1.45:1, below 3:1, fields not identifiable (1.4.11)”. 14, dark theme link: Fail, 1.4.3. 16px regular needs 4.5:1, and #1565C0 on #121212 is 3.26:1. The same colour passes on white at 5.75:1, which is exactly why a dark theme needs its own contrast pass. Title: “Dark theme, booking page: ‘Change doctor’ link #1565C0 on #121212 is 3.26:1, below 4.5:1 (1.4.3)”.
Colour and images. 7, time slots: Fail, 1.4.1 Use of Color (A). The time text passes 1.4.3 on both backgrounds whatever its size, because 11.98:1 and 11.44:1 are above 4.5:1, but free and booked slots differ only by colour, and the two backgrounds are almost equally light (about 1.05:1 against each other), so in greyscale, or for someone with a red–green deficiency, they look the same. A good contrast ratio does not satisfy 1.4.1. Fix it with a cue that is not colour: the word “Booked”, an icon, a strike-through, or hiding booked slots. Title: “Booking, time slots: booked and free shown only by red/green background (1.4.1)”. 8, date picker button: Fail, 1.1.1 Non-text Content (A). The image is the only content of a button, so it is a functional image, and its alt must say what the button does — “Choose a date” — not what the picture shows. Title: “Booking form: date picker button image alt is ‘calendar icon’ instead of the action ‘Choose a date’ (1.1.1)”. 9, banner: Fail, 1.4.5 Images of Text (AA), although 1.1.1 passes because the alt carries the same text. Plain text on a flat background can be produced with real text and CSS, and the banner is not a logo, not customizable and not essential. As an image, its text also blurs when zoomed and ignores the text-spacing override and the dark theme. Title: “Booking page: ‘Free check-up for over-60s every Sunday’ banner is an image of text (1.4.5)”.
Layout and targets. 10a, fixed-width form: Fail, 1.4.10 Reflow (AA). A 1280 px window at 400% zoom is a 320 CSS px viewport, and a form is not content that needs a two-dimensional layout, so a “Next” button reachable only by scrolling sideways fails. Title: “Booking form at 1280px/400% zoom: fixed 600 px width, ‘Next’ reachable only by horizontal scrolling (1.4.10)”. 10b, fee table: Pass. Data tables may keep two-dimensional scrolling, for that part only, and the rest of the page reflows. 11a, chip “×” buttons: Fail, 2.5.8 Target Size (Minimum) (AA). 16×16 is below 24×24, and the spacing exception does not help: 24 px circles centred 20 px apart overlap, because 20 is less than 24. No equivalent control exists on the step, the buttons are not inline in a sentence, and their size is set by the author, not the user agent. Fix: 24×24 targets, or centres at least 24 px apart with no other target inside the circles. Title: “Booking, chosen services: chip ‘×’ remove buttons are 16×16 CSS px, below 24×24, centres 20 px apart (2.5.8)”. 11b, info icon: Pass, through the spacing exception. A 24 px circle centred on the 18 px icon reaches only 3 px beyond its edge (12 − 9); even if the nearest target is small too, its circle reaches at most 12 px beyond that target’s edge, and 3 + 12 is well under 30.
Motion. 12, carousel: Fail, 2.2.2 Pause, Stop, Hide (A). It starts automatically, runs beside the form and keeps moving for far more than five seconds in total. The five seconds are about how long the movement lasts, not the 6 s between slides. Title: “Booking page: ‘Health tips’ carousel auto-advances every 6 s and loops, no pause, stop or hide control (2.2.2)”. 13, step transition with reduced motion: Not an AA failure. Being able to turn off motion triggered by an interaction is 2.3.3 Animation from Interactions, a level AAA criterion, and 2.2.2 does not apply to a 0.4 s transition the user starts. Log it as an improvement — honouring the reduce-motion setting is cheap and expected — and label it clearly as not blocking the AA contract.
What the pass has not covered yet, from the guide’s checklist: hover, focus, selected, visited and error states, for example the selected time slot and the error state of the mobile number field (1.4.3 for their text, 1.4.11 for the state indicators); the focus indicator, which needs 3:1 (1.4.11); icons and other non-text parts, such as the calendar and “i” icons and any checkbox or radio states (1.4.11); a greyscale check of the whole page — error messages, links in body text, statuses — not only the slots (1.4.1); 200% zoom and a larger default font size (1.4.4); the text-spacing override (1.4.12); flashing in the carousel (2.3.1); a full contrast pass, text and non-text, in the dark theme instead of one spot check; forced colours or a high-contrast theme, where the slot backgrounds of observation 7 are replaced by system colours, so free and booked slots can look identical, and where focus styles that rely on box-shadow alone can vanish; and the same pass on the Arabic UI, where the font and the text lengths differ and the team must agree how to apply the letter-spacing exception of 1.4.12. Measure the banner text of observation 9 on its green background as well: 1.4.3 covers images of text too, and the measurement is repeated once the banner is real text. Keyboard focus order and screen reader output are separate passes with their own guides, not gaps in this one.
Record and check. Every bug carries the build (4.8.0-rc1), browser, window width, zoom and theme, a screenshot and the measured colours, so that confirmation testing after the fix repeats the same measurement. Tally: 11 Fail (2, 3, 4, 6, 7, 8, 9, 10a, 11a, 12, 14), 3 Pass (1, 10b, 11b), 1 Exempt (5) and 1 Not an AA failure (13). If your verdicts differ, check the usual traps: the threshold depends on text size and weight; ratios are never rounded up; colours are measured as rendered; only truly inactive components are exempt; use of colour is judged separately from contrast; 1.1.1 and 1.4.5 are different criteria; the two-dimensional exception covers only that part of the page; and a level AAA criterion is not an AA failure.
Your progress on this topic
Not started
Mark the topic complete when you have studied it and done the exercise.
Sign in to track your progress
Mark topics complete, continue where you left off and unlock specialisation exams.
Part of the QA Roadmap
Before this topic
Next topics
Tools mentioned in this guide
Convert colors between HEX, RGB(A), HSL(A), HSB/HSV, CMYK and CSS named colors with a live preview.
Quickly convert between HEX, RGB and HSL color values.
Generate a tailored QA checklist (functional, UI, API, security, performance, accessibility, release) for any feature with Mutqan AI.
Generate clear, searchable bug titles from a messy description with Mutqan AI.