<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: a11ySolutions</title>
    <description>The latest articles on DEV Community by a11ySolutions (@a11ysolutions).</description>
    <link>https://dev.to/a11ysolutions</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3891044%2F5e091ec5-d07a-4d4f-b5dc-81adb3053f59.jpg</url>
      <title>DEV Community: a11ySolutions</title>
      <link>https://dev.to/a11ysolutions</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/a11ysolutions"/>
    <language>en</language>
    <item>
      <title>Focus indicators that fail WCAG 1.4.11: real cases and exact fixes</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Wed, 13 May 2026 08:52:26 +0000</pubDate>
      <link>https://dev.to/a11ysolutions/focus-indicators-that-fail-wcag-1411-real-cases-and-exact-fixes-4aeo</link>
      <guid>https://dev.to/a11ysolutions/focus-indicators-that-fail-wcag-1411-real-cases-and-exact-fixes-4aeo</guid>
      <description>&lt;p&gt;&lt;strong&gt;What is a focus indicator — and why does WCAG regulate it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a user navigates a website using a keyboard, they need to know where they are on the page at all times. The focus indicator is the visual signal that answers that question: the outline, highlight, or state change that appears on the element currently receiving keyboard focus.&lt;/p&gt;

&lt;p&gt;WCAG Success Criterion 1.4.11 (Non-text Contrast) requires that the visual presentation of UI components, including focus and hover indicators, has a contrast ratio of at least 3:1 against adjacent colors.&lt;/p&gt;

&lt;p&gt;Without a sufficient focus indicator:&lt;/p&gt;

&lt;p&gt;Keyboard-only users lose their place on the page.&lt;br&gt;
Users with low vision cannot perceive the current focus state.&lt;br&gt;
The product fails a Level AA audit, the standard required by the EAA, ADA, and EN 301 549.&lt;/p&gt;

&lt;p&gt;Below are three real cases from accessibility audits, extracted from a structured issue bank. No simulated data. No approximations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 1&lt;/strong&gt; — Login page: Dropdown focused/hovered option&lt;br&gt;
&lt;strong&gt;Component:&lt;/strong&gt; "Tipo de documento" dropdown — focused and hovered option state&lt;br&gt;
&lt;strong&gt;Audit type:&lt;/strong&gt; Color Contrast · Priority: High&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was found:&lt;/strong&gt;&lt;br&gt;
When the dropdown expanded and the user hovered or focused an option, the selected state was communicated only through a light grey background. There was no outline or other indicator with sufficient contrast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbzad7pbt0wh4qs1hfy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbzad7pbt0wh4qs1hfy7.png" alt="Table showing a WCAG 1.4.11 contrast failure where the focused option background color (#F1F4F4) is compared against a white page background (#FFFFFF). The measured contrast ratio is 1.1:1, below the required minimum of 3:1." width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The CSS driving the problem:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;.css-1kwd9xn-option {&lt;br&gt;
  background-color: rgb(241, 244, 244); /* #F1F4F4 */&lt;br&gt;
  color: rgb(0, 43, 69);&lt;br&gt;
  font-size: 14px;&lt;br&gt;
  font-weight: normal;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;A ratio of 1.1:1 means the focused state is virtually indistinguishable from the default state. For a user with low vision navigating with a keyboard, the dropdown is effectively unusable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
Replace the near-white background with a grey that achieves the required 3:1 threshold against the white page background.&lt;br&gt;
css/* Before &lt;em&gt;/&lt;br&gt;
.css-1kwd9xn-option {&lt;br&gt;
  background-color: rgb(241, 244, 244); /&lt;/em&gt; ratio 1.1:1 — FAIL */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;/* After &lt;em&gt;/&lt;br&gt;
.css-1kwd9xn-option:hover,&lt;br&gt;
.css-1kwd9xn-option:focus {&lt;br&gt;
  background-color: #939393; /&lt;/em&gt; ratio 3.0:1 against #FFFFFF — PASS */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 2&lt;/strong&gt; — Login page: Password digit field borders&lt;br&gt;
&lt;strong&gt;Component:&lt;/strong&gt; Input field boundaries — digit fields for password entry&lt;br&gt;
&lt;strong&gt;Audit type:&lt;/strong&gt; Color Contrast · Priority: Medium&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was found:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The password entry screen used a series of individual digit input fields. Each field had only a bottom border as its visible boundary — the indicator that communicates "this is an input". That border failed the 3:1 contrast requirement against the white background.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zvj909uqipq8g05l73b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zvj909uqipq8g05l73b.png" alt="Table showing a WCAG 1.4.11 non-text contrast failure for an input bottom border color (#CCD5DA) against a white background (#FFFFFF). The measured contrast ratio is 1.48:1, below the required minimum of 3:1." width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WCAG 1.4.11 applies not only to focus rings but to any visual indicator that communicates the presence or boundary of an interactive component. A field border that a user cannot see means they cannot locate the input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
Use a darker grey for the border that maintains the visual style while meeting the threshold.&lt;/p&gt;

&lt;p&gt;css/* Before &lt;em&gt;/&lt;br&gt;
.password-digit-field {&lt;br&gt;
  border-bottom: 1px solid #CCD5DA; /&lt;/em&gt; ratio 1.48:1 — FAIL */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;/* After &lt;em&gt;/&lt;br&gt;
.password-digit-field {&lt;br&gt;
  border-bottom: 1px solid #8094A3; /&lt;/em&gt; ratio 3.14:1 — PASS */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 3&lt;/strong&gt; — Account page: Radio button borders&lt;br&gt;
&lt;strong&gt;Component:&lt;/strong&gt; Radio button visual boundaries — payment method selection&lt;br&gt;
&lt;strong&gt;Audit type:&lt;/strong&gt; Color Contrast · Priority: Low&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was found:&lt;/strong&gt;&lt;br&gt;
A payment method selection screen presented a group of radio buttons for choosing between credit cards. The unchecked radio buttons used a light grey border to indicate their boundary. That border failed 3:1 against the white background.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37q8ure9e1dw2w59yong.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37q8ure9e1dw2w59yong.png" alt="Table showing a WCAG 1.4.11 non-text contrast failure for a radio button border color (#C2CFD6) against a white background (#FFFFFF). The measured contrast ratio is 1.59:1, below the required minimum of 3:1." width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When radio button borders are invisible, users with low vision cannot detect that a selectable option is present. This is a form usability failure, not just an aesthetic one: invisible controls block task completion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
css/* Before &lt;em&gt;/&lt;br&gt;
.sc-radio-field-label:before {&lt;br&gt;
  border: 0.0625rem solid #C2CFD6; /&lt;/em&gt; ratio 1.59:1 — FAIL */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;/* After &lt;em&gt;/&lt;br&gt;
.sc-radio-field-label:before {&lt;br&gt;
  border: 0.0625rem solid #949494; /&lt;/em&gt; ratio 3.03:1 — PASS */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What these three cases have in common&lt;/strong&gt;&lt;br&gt;
All three failures share the same root cause: grey UI elements on white backgrounds, where the grey is not dark enough to reach 3:1.&lt;/p&gt;

&lt;p&gt;This pattern is extremely common in design systems that prioritize subtle, minimal aesthetics. The visual result feels clean. The accessibility result is that a significant portion of users cannot perceive the interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8tbkpvo8jkfo6jx8vg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8tbkpvo8jkfo6jx8vg7.png" alt="Table comparing failing and corrected WCAG 1.4.11 non-text contrast ratios for three UI components: dropdown focused state improved from 1.1:1 to 3.0:1 using color #939393, password field border improved from 1.48:1 to 3.14:1 using color #8094A3, and radio button border improved from 1.59:1 to 3.03:1 using color #949494." width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of these fixes required redesigning the component. Each required changing one CSS color value.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Focus indicators failing WCAG 1.4.11: real cases and exact fixes</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Tue, 12 May 2026 11:48:12 +0000</pubDate>
      <link>https://dev.to/a11ysolutions/focus-indicators-failing-wcag-1411-real-cases-and-exact-fixes-13hm</link>
      <guid>https://dev.to/a11ysolutions/focus-indicators-failing-wcag-1411-real-cases-and-exact-fixes-13hm</guid>
      <description>&lt;p&gt;Focus indicators failing WCAG 1.4.11: real cases and exact fixes&lt;br&gt;
What is a focus indicator?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A focus indicator&lt;/strong&gt; is the visual signal that shows keyboard users which interactive element is currently focused.&lt;/p&gt;

&lt;p&gt;WCAG 2.1 SC 1.4.11 (Non-text Contrast) regulates focus indicators because users navigating with a keyboard must clearly perceive where focus is located.&lt;/p&gt;

&lt;p&gt;The minimum required contrast ratio for visible focus indicators is 3:1 against adjacent colors.&lt;/p&gt;

&lt;p&gt;Why static accessibility tools often miss these issues&lt;/p&gt;

&lt;p&gt;Most static accessibility scanners cannot reliably detect focus indicator failures because the :focus or :focus-visible state only exists during actual keyboard interaction.&lt;/p&gt;

&lt;p&gt;To properly validate focus indicators, manual testing with the keyboard is required.&lt;/p&gt;

&lt;p&gt;Usually:&lt;/p&gt;

&lt;p&gt;Tab&lt;br&gt;
Shift + Tab&lt;br&gt;
Browser DevTools&lt;br&gt;
Contrast analyzers&lt;br&gt;
Real accessibility audit cases&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 1 — Tourism company&lt;/strong&gt;&lt;br&gt;
The primary search button had a focus indicator with a contrast ratio below 3:1.&lt;/p&gt;

&lt;p&gt;Problem&lt;/p&gt;

&lt;p&gt;Keyboard users could technically navigate to the button, but the visible focus state was too subtle to perceive clearly.&lt;/p&gt;

&lt;p&gt;WCAG failure&lt;br&gt;
SC 1.4.11 — Non-text Contrast&lt;br&gt;
Fix&lt;/p&gt;

&lt;p&gt;Use a high-contrast outline with :focus-visible.&lt;/p&gt;

&lt;p&gt;:focus-visible {&lt;br&gt;
  outline: 2px solid #FFFFFF;&lt;br&gt;
  outline-offset: 2px;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 2 — Educational platform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The “Login” button changed from #02959F to #027279 when focused.&lt;/p&gt;

&lt;p&gt;Problem&lt;/p&gt;

&lt;p&gt;Contrast between both visual states was only 1.57:1.&lt;/p&gt;

&lt;p&gt;The component relied exclusively on color to communicate focus.&lt;/p&gt;

&lt;p&gt;WCAG failures&lt;br&gt;
SC 1.4.11 — Non-text Contrast&lt;br&gt;
SC 1.4.1 — Use of Color&lt;br&gt;
Fix&lt;/p&gt;

&lt;p&gt;Add a visible outline independent of color changes.&lt;/p&gt;

&lt;p&gt;:focus-visible {&lt;br&gt;
  outline: 2px solid #FFFFFF;&lt;br&gt;
  outline-offset: 2px;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 3 — Same platform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The “Remember me” checkbox used a black focus indicator (#212529) over a dark background (#1D191C).&lt;/p&gt;

&lt;p&gt;Problem&lt;/p&gt;

&lt;p&gt;Contrast ratio:&lt;/p&gt;

&lt;p&gt;1.12:1&lt;/p&gt;

&lt;p&gt;The focus state became nearly invisible.&lt;/p&gt;

&lt;p&gt;Fix&lt;/p&gt;

&lt;p&gt;Replace the focus indicator with:&lt;/p&gt;

&lt;p&gt;outline: 2px solid #0297A2;&lt;br&gt;
Results&lt;br&gt;
4.92:1 against background&lt;br&gt;
3.79:1 against adjacent colors&lt;/p&gt;

&lt;p&gt;WCAG compliant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test focus indicators properly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recommended setup:&lt;/p&gt;

&lt;p&gt;Chrome or Firefox&lt;br&gt;
Keyboard navigation only&lt;br&gt;
Colour Contrast Analyser (CCA)&lt;br&gt;
Optional: NVDA or VoiceOver&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing steps:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Navigate using only Tab&lt;br&gt;
Verify focus is always visible&lt;br&gt;
Measure contrast of the focus indicator&lt;br&gt;
Validate zoom and dark mode scenarios&lt;br&gt;
Quick production checklist&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before release, ask:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can focus be identified immediately?&lt;br&gt;
Does the indicator reach at least 3:1 contrast?&lt;br&gt;
Does the state rely only on color changes?&lt;br&gt;
Is focus still visible in dark mode?&lt;br&gt;
Is it visible at 200% zoom?&lt;/p&gt;

&lt;p&gt;Focus indicators are one of the most commonly overlooked accessibility failures in production systems, especially because many automated tools cannot fully detect them.&lt;/p&gt;

&lt;p&gt;And yet, for keyboard users, they are critical navigation cues.&lt;/p&gt;

&lt;h1&gt;
  
  
  css #accessibility #wcag #webdev #a11y #focusvisible
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Keyboard traps: what they are, how to reproduce them, and how to fix them</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Mon, 11 May 2026 08:01:00 +0000</pubDate>
      <link>https://dev.to/a11ysolutions/keyboard-traps-what-they-are-how-to-reproduce-them-and-how-to-fix-them-157m</link>
      <guid>https://dev.to/a11ysolutions/keyboard-traps-what-they-are-how-to-reproduce-them-and-how-to-fix-them-157m</guid>
      <description>&lt;p&gt;Definition of a keyboard trap according to WCAG 2.1 SC 2.1.2:&lt;/p&gt;

&lt;p&gt;“If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface.”&lt;/p&gt;

&lt;p&gt;Why can’t static accessibility tools detect it?&lt;/p&gt;

&lt;p&gt;Because detecting a keyboard trap requires actual keyboard navigation — typically using the Tab key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real case&lt;/strong&gt; (educational platform):&lt;/p&gt;

&lt;p&gt;The login form contained a keyboard trap. When users activated the “Login” button with empty required fields, keyboard focus was completely lost. Keyboard only users could no longer identify where to continue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problematic HTML&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;input type="submit" name="commit" value="Entrar" class="btn btn-xchool btn-block mt-4" data-disable-with="Enviando..."&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Programmatically move focus to the error message’s “Close” button using &lt;code&gt;focus()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tested with Chrome + NVDA.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>a11y</category>
    </item>
    <item>
      <title>5 ARIA mistakes that make accessibility worse, not better</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Wed, 06 May 2026 08:34:27 +0000</pubDate>
      <link>https://dev.to/a11ysolutions/5-aria-mistakes-that-make-accessibility-worse-not-better-2pmp</link>
      <guid>https://dev.to/a11ysolutions/5-aria-mistakes-that-make-accessibility-worse-not-better-2pmp</guid>
      <description>&lt;p&gt;There's a rule in accessibility that doesn't get enough attention:&lt;/p&gt;

&lt;p&gt;No ARIA is better than bad ARIA.&lt;/p&gt;

&lt;p&gt;Adding ARIA attributes without understanding them doesn't help assistive tech, it actively misleads it. Here are the mistakes I find most often in real audits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. role="button" on a div — without keyboard support&lt;/strong&gt;&lt;br&gt;
If you give something a button role, screen readers announce it as a button.&lt;br&gt;
Users expect to activate it with Space or Enter.&lt;br&gt;
If your div only handles onClick, keyboard users get announced a button they can't press. Use &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;. That's what it's there for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. aria-label that duplicates visible text — badly&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;&amp;lt;button aria-label="Click here to submit the form"&amp;gt;Submit&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;br&gt;
Screen readers read the aria-label, ignoring "Submit". Now your button is "Click here to submit the form", verbose, inconsistent, and confusing in a list of controls.&lt;br&gt;
If the visible label is accurate, you don't need aria-label.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. aria-hidden="true" on focusable elements&lt;/strong&gt;&lt;br&gt;
Hiding something from the accessibility tree while leaving it focusable creates a ghost, keyboard users can tab to it, but screen readers announce nothing. That's worse than not hiding it at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. aria-live on everything&lt;/strong&gt;&lt;br&gt;
aria-live="assertive" interrupts whatever the screen reader is doing to announce the update. Useful for critical alerts. Catastrophic for &lt;br&gt;
status messages, loading indicators, or anything non-urgent.&lt;br&gt;
Most of the time, aria-live="polite" is what you want, or nothing at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Decorative icons without aria-hidden&lt;/strong&gt;&lt;br&gt;
An icon inside a button with no aria-hidden forces screen readers to &lt;br&gt;
announce the SVG path or file name alongside the button label.&lt;br&gt;
&lt;code&gt;&amp;lt;svg aria-hidden="true"&amp;gt;&lt;/code&gt; is two words. Use them.&lt;/p&gt;

&lt;p&gt;No ARIA is better than bad ARIA.&lt;br&gt;
Before reaching for it, ask if a native HTML element solves it first.&lt;/p&gt;

&lt;p&gt;What ARIA mistakes do you see most in code reviews?&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>Form accessibility: the checklist nobody actually uses (until users complain)</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:19:49 +0000</pubDate>
      <link>https://dev.to/a11ysolutions/form-accessibility-the-checklist-nobody-actually-uses-until-users-complain-1b3h</link>
      <guid>https://dev.to/a11ysolutions/form-accessibility-the-checklist-nobody-actually-uses-until-users-complain-1b3h</guid>
      <description>&lt;p&gt;Forms are where accessibility debt becomes user abandonment.&lt;/p&gt;

&lt;p&gt;A form can pass every automated scan and still be completely unusable &lt;br&gt;
for a significant chunk of your users.&lt;/p&gt;

&lt;p&gt;Here's what I see skipped constantly in real audits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Placeholder text used as a label&lt;/strong&gt;&lt;br&gt;
When the field gets focus, the hint disappears. For users with cognitive disabilities or memory issues, that's a dead end.&lt;br&gt;
Use &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; elements. Always.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error messages that only exist visually&lt;/strong&gt;&lt;br&gt;
Red border + error text looks complete. But if the error isn't linked to the input via &lt;code&gt;aria-describedby&lt;/code&gt;, screen readers announce nothing.&lt;br&gt;
The user submits. Nothing happens. They don't know why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Required fields with no accessible indicator&lt;/strong&gt;&lt;br&gt;
An asterisk (*) is a visual convention. Without &lt;code&gt;aria-required="true"&lt;/code&gt; or a text equivalent, it means nothing to assistive tech.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autocomplete missing on personal data fields&lt;/strong&gt;&lt;br&gt;
WCAG 1.3.5 exists. Most teams don't know it does. Name, email, phone, address, those fields need proper &lt;code&gt;autocomplete&lt;/code&gt; &lt;br&gt;
attributes. For users with motor disabilities, it can be the difference between completing the form or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Focus order that fights the visual layout&lt;/strong&gt;&lt;br&gt;
Tab order follows DOM order, not visual order. If your CSS grid or &lt;br&gt;
flexbox rearranges things visually, keyboard users may be jumping around the form in a completely unexpected sequence.&lt;/p&gt;

&lt;p&gt;None of these fail an automated scan.&lt;br&gt;
All of them fail real users.&lt;/p&gt;

&lt;p&gt;If you're doing form reviews, what's the first thing you check?&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>html</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Great insights by Vitaly Skadorva! Our benchmarks confirm that moving to dynamic interaction testing is key, increasing finding precision from ~20% to over 80%. A must-read for true A11y!</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Mon, 27 Apr 2026 16:24:17 +0000</pubDate>
      <link>https://dev.to/a11ysolutions/great-insights-by-vitaly-skadorva-our-benchmarks-confirm-that-moving-to-dynamic-interaction-mb7</link>
      <guid>https://dev.to/a11ysolutions/great-insights-by-vitaly-skadorva-our-benchmarks-confirm-that-moving-to-dynamic-interaction-mb7</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9" class="crayons-story__hidden-navigation-link"&gt;Accessibility Testing: Best Practices&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/vitalyskadorva" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3829602%2Ff815fcd6-c31b-40eb-abe7-08844fbc54d0.jpg" alt="vitalyskadorva profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/vitalyskadorva" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Vitaly Skadorva
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Vitaly Skadorva
                
              
              &lt;div id="story-author-preview-content-3555038" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/vitalyskadorva" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3829602%2Ff815fcd6-c31b-40eb-abe7-08844fbc54d0.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Vitaly Skadorva&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 27&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9" id="article-link-3555038"&gt;
          Accessibility Testing: Best Practices
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/a11y"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;a11y&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/qa"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;qa&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/testing"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;testing&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              2&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            12 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Accessibility issues that automated tools won't catch (from real audits)</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Fri, 24 Apr 2026 10:35:10 +0000</pubDate>
      <link>https://dev.to/a11ysolutions/accessibility-issues-that-automated-tools-wont-catch-from-real-audits-2o8l</link>
      <guid>https://dev.to/a11ysolutions/accessibility-issues-that-automated-tools-wont-catch-from-real-audits-2o8l</guid>
      <description>&lt;p&gt;I run accessibility audits regularly. One pattern keeps showing up:&lt;/p&gt;

&lt;p&gt;The most critical issues are never in the code. They're in the interaction.&lt;/p&gt;

&lt;p&gt;Automated tools are genuinely useful, they catch structural and semantic &lt;br&gt;
issues fast. But they don't simulate real user behavior. And that's where &lt;br&gt;
things actually break.&lt;/p&gt;

&lt;p&gt;Here are the failure patterns I find most often:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keyboard traps in modals&lt;/strong&gt;: focus gets locked inside a dialog with no &lt;br&gt;
way out unless you know to press Escape (and even then, sometimes it doesn't &lt;br&gt;
work).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpredictable focus jumps&lt;/strong&gt;: after a button click or route change, focus &lt;br&gt;
lands somewhere random. A screen reader user loses their place entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Silent error messages&lt;/strong&gt;: form validation runs, the error renders visually, &lt;br&gt;
but &lt;code&gt;aria-live&lt;/code&gt; is missing. Screen readers announce nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forms that validate but can't be completed&lt;/strong&gt;: the markup passes the &lt;br&gt;
scanner. Real users hit walls at step 2.&lt;/p&gt;

&lt;p&gt;None of these show up in axe, Lighthouse, or WAVE. You only find them &lt;br&gt;
when you actually use the product, keyboard only, screen reader on, &lt;br&gt;
cognitive load simulated.&lt;/p&gt;

&lt;p&gt;Accessibility isn't about passing a scan. It's about whether people can &lt;br&gt;
complete critical flows.&lt;/p&gt;

&lt;p&gt;How are you testing beyond automated tools in your projects?&lt;br&gt;
Keyboard only passes? Screen reader sessions? Something else?&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>digitalaccessibility</category>
      <category>a11ydetector</category>
      <category>wcag</category>
    </item>
  </channel>
</rss>
