Why store locators fail accessibility, and why nobody notices until someone has to use one.
Most locator widgets ship as a search box, a map, and a list. That sounds simple, until you try to use it without a mouse. Locators concentrate four of the hardest accessibility patterns into one screen: a form, a dynamic list, a custom map control, and content that updates without a page reload. Each one is a place teams quietly cut corners.
The result is widgets that look fine in a screenshot but lock out anyone navigating with a keyboard, a screen reader, voice control, or a low-contrast display. The failures rarely surface in QA because most test plans use a mouse on a high-contrast monitor.
A gallery of common locator failures: what to do instead.
These four patterns show up in roughly four out of five locator widgets we audit. None of them are exotic. All four are repeatedly fixable in an afternoon if the build is set up to allow it.
Placeholder text used as the only label
The placeholder disappears the moment the user starts typing. Screen readers may read it as a value, then announce nothing once focus enters. A user who blanks out mid-form has no way to recover the question.
Use a persistent <label> tied to the input via for/id. Keep placeholder text only for example formats (e.g. “94110”), not for the field’s purpose.
Active filter signalled by colour alone
For a user who is colourblind, viewing in greyscale, or in bright sunlight, every chip looks the same. Screen readers also need a programmatic signal. A different background colour is invisible to them.
Pair colour with shape, weight, an icon, or an inline checkmark. Mark the toggle with aria-pressed="true" so assistive tech announces the state.
Map widget swallows keyboard focus
The user tabs into a map embed, then can never tab out. Focus cycles through dozens of internal targets. Many users never reach the page footer or the rest of the locator.
Treat the map as a non-essential visual aid. Make the list the primary way to choose a location. Provide a “skip the map” link, and keep map controls outside the iframe.
Result list updates without announcing
A user types a zip and waits, but the screen reader never says “3 locations found.” They have no way of knowing the search succeeded, especially if the visual list is below the fold.
Keep an aria-live="polite"region near the search input that updates with “Showing 3 locations near 94110.” For zero results, say so explicitly.
Keyboard navigation: the eight checks every locator should pass.
If you can't complete a search and choose a location using only the Tab, Shift+Tab, Enter, Space, Escape, and arrow keys, the locator is not accessible. Full stop. This is the cheapest test you can run, and it surfaces most locator defects.
- Tab order is logical Search input, then filters, then results, then map controls. Avoid skipping around the visual layout.
- Every interactive element is reachable Pins, expand toggles, “Get directions” links. If you can click it, you can tab to it.
- Focus is always visible Never
outline: nonewithout an obvious replacement (2 px outline + offset is standard). - Filters use the right keys Single-select chips behave like radios; multi-select chips behave like checkboxes; segmented groups respond to ←→.
- The map can be skipped Provide a “skip to results” link, or never let the map become a tab stop unless the user opts in.
- Modals close on Escape “Get directions,” “Hours of operation,” and any flyout returns focus to the trigger when dismissed.
- Hit targets are at least 24×24 CSS pixels (WCAG 2.2 SC 2.5.8). Pin clusters and chip rows are common offenders.
- No keyboard-only dead ends Every focused element has a way back. If autocomplete opens, Escape must close it without losing the input.
Search
Filters
Results
Screen-reader and semantic checklist.
A keyboard-navigable locator is not automatically a screen-reader-friendly locator. The next layer is what the page tells assistive tech: roles, names, structure, and announcements when state changes.
- Wrap the widget in a landmark Use
<section aria-label="Find a location">or<search>when supported. - Use real heading hierarchy The locator’s heading is an
<h2>on most pages; result group labels are<h3>. - Results are a list Use semantic
<ul><li>. A screen reader will say “list with 3 items.” - Status messages are announced Announce “3 locations found” via
aria-live="polite"when results change. - Maps have an accessible name Use
aria-label="Map showing 3 locations", with a textual list nearby that does the actual work. - Inputs have associated labels Use
<label for="zip">matched toid="zip". Placeholders are not labels. - Errors are tied to fields Connect the input to the error text via
aria-describedby. “Invalid zip” by itself, somewhere on the page, is not enough.
Sample markup
<div class="locator"> <input type="text" placeholder="Enter zip"/> <div class="results"> <div>Mission Branch</div> <div>Bernal Heights</div> </div> </div>
<section aria-labelledby="loc-h"> <h2 id="loc-h">Find a location</h2> <label for="zip">Zip or city</label> <input id="zip" type="text"/> <p role="status">3 locations near 94110</p> <ul> <li>…</li> </ul> </section>
Colour contrast and focus states.
Contrast is the failure most often caught by automated scanners. It's also the one most often re-introduced when a brand colour gets re-tinted late in the project. Pin down the contrast targets early so brand decisions don't corner the engineering team.
WCAG 2.2 AA contrast targets
| What you’re measuring | Minimum ratio | Where it shows up in a locator |
|---|---|---|
| Body text under 18 px (or under 14 px bold) | 4.5 : 1 | Result list addresses, filter labels, helper text |
| Large text: 18 px regular or 14 px bold | 3 : 1 | Section headings, location names |
| UI components & non-text graphics | 3 : 1 | Input borders, focus rings, icon strokes, map pins |
| Focus indicators | 3 : 1 | Against the focused element and against adjacent surfaces |
Pass / fail in the brand palette
Sample combinations from the dropafinder palette, with the same brand swatches in different roles. The cyan accent passes against navy as a UI accent, but not against white as text.
Focus indicators: do and don’t
Map and list interaction concerns.
The single biggest design decision in an accessible locator is which surface is primary. Maps are a visual aid; the list is the source of truth. Build the list first, then enhance with a map.
List is primary, map is supporting
If the map disappears, the locator should still work. Build the result list first; layer the map on top for visual users.
Map is decorative for screen readers
Mark the map container with aria-hidden="true" and rely on the textual list, or expose only a short summary like “Map of 3 locations.”
Avoid focus traps
Don’t let third-party map embeds capture Tab forever. Either keep the map out of the tab sequence or provide a "skip the map" bypass.
Selection should sync both ways
Clicking a pin should focus the matching list card, and selecting a card should highlight (not zoom hard into) the pin. Don’t make the user track two states.
Status messages, not page reloads
When the list changes, announce it with aria-live="polite". Don’t re-render the whole region. Keep the heading stable so the screen-reader user’s position doesn’t reset.
Respect motion preferences
Map pan, zoom-to-fit, and result-card transitions all need a prefers-reduced-motion branch. “Snap, don’t glide” is the rule.
WCAG 2.2 AA criteria, mapped to locator patterns.
These are the success criteria a locator audit comes back to most often. Use this as a punch list. Every row is something you can verify with a 5-minute manual check.
| Criterion | Name | How it shows up in a locator |
|---|---|---|
| 1.3.1 | Info & relationships | Result lists are real <ul> elements; field labels are real <label> elements; section headings nest correctly. |
| 1.4.3 | Contrast (minimum) | 4.5:1 for body text, 3:1 for large text. Brand-tinted helper text often fails this. Re-check after re-skinning. |
| 1.4.11 | Non-text contrast | Input borders, chip outlines, focus rings, and pin strokes all need 3:1 against their adjacent surfaces. |
| 2.1.1 | Keyboard | Search, filters, results, and any modals are operable with Tab + Enter + Esc + arrow keys. |
| 2.4.3 | Focus order | Tab moves through the locator in the order a sighted user would scan: search → filters → list → map. |
| 2.4.7 | Focus visible | Every focusable target has a visible ring. Never outline: none without an alternative. |
| 2.4.11 | Focus not obscured (2.2 / AA) | Sticky headers, cookie banners, and overlay map controls must not cover the focused element. |
| 2.5.5 | Target size | Filter chips, list cards, pins, all at least 24×24 CSS px (44 px is more comfortable on touch). |
| 3.3.1 | Error identification | “Enter a valid US zip” is shown in text and tied to the input via aria-describedby. |
| 3.3.2 | Labels or instructions | Persistent <label> on every input. Format hints (“e.g. 94110”) live in helper text, not the placeholder. |
| 4.1.2 | Name, role, value | Filters expose aria-pressed or aria-selected; the active filter is programmatically discoverable. |
| 4.1.3 | Status messages | Result-count changes announce via aria-live="polite" or role="status". |
Built so the accessibility work is already done before the brand work starts.
dropafinder is a hosted locator platform. The keyboard, focus, and semantic patterns above are part of the product foundation, not something the agency or client has to remember to check. Brand colours, fields, and copy layer on top of an a11y-conformant base.
WCAG-compliant themes by default
Brand colour pickers run a contrast check before they'll save. You can't configure a finder that fails text contrast.
Keyboard-first navigation
Search → filters → results → details all reachable with Tab, with visible focus rings, escape-to-close modals, and arrow-key chip groups.
Semantic results, announced changes
Real list semantics, real headings, and a polite live region that announces "3 locations near 94110" as the user searches and filters.
Map as the supporting view
The list is the source of truth. The map is decorative for assistive tech, with sync between pin and card so nothing is map-only.
Important: Not legal advice
This guide is informational. It is not legal advice and does not substitute for an audit by a qualified accessibility consultant or counsel. ADA, Section 508, EAA (European Accessibility Act, in force June 2025), and other regional obligations vary by industry, jurisdiction, and the specific use of your locator. Validate any production locator against your own legal and procurement requirements.