Image without an alt attribute
WCAG 2.2 1.1.1 Non-text content, Level A
85 occurrences, found on: Home page, Collection page, Product page, Cart page
- Why it matters for shoppers
- A screen reader skips the image or reads out its file name, so a blind shopper does not learn what the product photo shows.
- Where it usually lives in a Shopify theme
- Product card and product media snippets, image banners, slideshow and image-with-text sections, and sometimes the logo in the header.
- Direction for a fix
- Output the alt text stored with the image, fall back to the product or section title, and give purely decorative images an empty alt="".
- Examples from the demo store
imgimg.lazy-loading-image--mainimg.lazy-loading-image--placeholder
Button without a name
WCAG 2.2 4.1.2 Name, role, value, Level A
38 occurrences, found on: Home page, Collection page, Product page, Cart page
- Why it matters for shoppers
- The shopper hears “button” with no hint whether it closes a drawer, adds to cart or opens the menu.
- Where it usually lives in a Shopify theme
- Icon-only buttons: drawer close, slider arrows, quantity plus and minus, menu and search toggles.
- Direction for a fix
- Put an aria-label or visually hidden text on the button and hide the icon inside it with aria-hidden="true".
- Examples from the demo store
button.splide__arrowbutton.search-dropdown-close
Form field without a label
WCAG 2.2 1.3.1 Info and relationships, Level A
15 occurrences, found on: Home page, Collection page, Product page, Cart page
- Why it matters for shoppers
- Without a label a screen reader only says “edit text”, so the shopper cannot tell whether the field is for an e-mail address, a quantity or a discount code.
- Where it usually lives in a Shopify theme
- Newsletter sign-up in the footer, the search field in the header, quantity fields in the cart, price range filters on collections.
- Direction for a fix
- Connect every field to a label element with for and id (it may be visually hidden) or give it an aria-label. A placeholder is not a label.
- Examples from the demo store
input (type="search")input#ProductOption-00 (type="radio")input#ProductOption-01 (type="radio")
Link without a name
WCAG 2.2 2.4.4 Link purpose (in context), Level A
4 occurrences, found on: Home page, Collection page, Product page, Cart page
- Why it matters for shoppers
- A screen reader announces “link” and nothing else, so the shopper cannot tell where it leads.
- Where it usually lives in a Shopify theme
- Icon links in the header (account, cart), social media icons in the footer, image-only links on product cards and collection tiles.
- Direction for a fix
- Add visually hidden text or an aria-label to icon links, for example “Cart” or “Instagram”. For an image link, give the image an alt text.
- Examples from the demo store
a.section-header-icons__account--login
Dropdown without a label
WCAG 2.2 1.3.1 Info and relationships, Level A
2 occurrences, found on: Collection page, Product page
- Why it matters for shoppers
- A shopper who cannot see the page does not know whether the dropdown chooses a size, a colour, a sort order or a country.
- Where it usually lives in a Shopify theme
- Variant pickers on the product page, the sort menu on collections, country and language selectors.
- Direction for a fix
- Name each dropdown with a label element (for and id) or an aria-label such as “Size” or “Sort by”.
- Examples from the demo store
select#SortByselect.product-variants-selector-select
The same id is used more than once
WCAG 2.2 4.1.2 Name, role, value, Level A
12 occurrences, found on: Home page, Collection page, Product page, Cart page
- Why it matters for shoppers
- Labels, error messages and aria references can point at the wrong element, so a field or control may lose its name.
- Where it usually lives in a Shopify theme
- Sections rendered twice on one page, such as desktop and mobile headers, cart drawer and cart page, or country and language selectors in both header and footer.
- Direction for a fix
- Make generated ids unique, for example by adding the section id to them.
- Examples from the demo store
"predictive-search", 2×"predictive-search-results", 2×"localization_form", 3×
Heading levels skip a step
WCAG 2.2 1.3.1 Info and relationships, Level A
4 occurrences, found on: Home page, Collection page, Product page, Cart page
- Why it matters for shoppers
- People who move through a page by headings expect the levels to nest. A jump from h2 to h4 suggests a missing part.
- Where it usually lives in a Shopify theme
- Section headings, product card titles and footer column headings, where the level is chosen for its font size.
- Direction for a fix
- Choose heading levels from the structure of the page and set the size with a class.
- Examples from the demo store
No skip link
WCAG 2.2 2.4.1 Bypass blocks, Level A
4 occurrences, found on: Home page, Collection page, Product page, Cart page
- Why it matters for shoppers
- A keyboard user has to tab through the whole header and menu on every page before reaching the content.
- Where it usually lives in a Shopify theme
- Right after the opening body tag in layout/theme.liquid.
- Direction for a fix
- Make “Skip to content” the first focusable link, pointing at the main element, and show it when it receives focus.
Page without an h1 heading
WCAG 2.2 1.3.1 Info and relationships, Level A
3 occurrences, found on: Home page, Collection page, Cart page
- Why it matters for shoppers
- Screen reader users often jump to the first-level heading to learn what a page is about.
- Where it usually lives in a Shopify theme
- The main title of a template: collection banner, product title in the main product section, cart title. Some templates style the title as a heading without using an h1.
- Direction for a fix
- Render the main title of every template as one h1.
aria-labelledby or aria-describedby points to a missing element
WCAG 2.2 4.1.2 Name, role, value, Level A
1 occurrence, found on: Collection page
- Why it matters for shoppers
- The element was meant to take its name or description from another element that is not on the page, so the screen reader has nothing to read.
- Where it usually lives in a Shopify theme
- Product cards that point at sale or sold-out badges which are only rendered in some cases, form error messages, dialogs.
- Direction for a fix
- Output the reference only when the target element is rendered, or always render the target.
- Examples from the demo store
aria-describedby → "a11y-refresh-page-message"
Icon without a text alternative or a decorative mark
WCAG 2.2 1.1.1 Non-text content, Level A
101 occurrences, found on: Home page, Collection page, Product page, Cart page
- Why it matters for shoppers
- If the icon carries meaning, such as a payment method or “free shipping”, a screen reader user misses it. If it is decoration, it should be hidden from screen readers.
- Where it usually lives in a Shopify theme
- Icon snippets, payment icons in the footer, trust and feature icons.
- Direction for a fix
- Hide decorative icons with aria-hidden="true". Give meaningful icons role="img" and an aria-label or a title element.
- What the test can see
- The test cannot tell a decorative icon from a meaningful one, so each of these needs a quick look.
- Examples from the demo store
Focus moves when the page loads
WCAG 2.2 3.2.1 On focus, Level A
4 occurrences, found on: Home page, Collection page, Product page, Cart page
- Why it matters for shoppers
- Screen reader users start somewhere unexpected and miss the top of the page.
- Where it usually lives in a Shopify theme
- Search fields and pop-ups with the autofocus attribute.
- Direction for a fix
- Remove autofocus and move focus only after the shopper opens something.
- Examples from the demo store