Every product image must have descriptive alt text that a blind user can use to understand what's being sold:
<!-- BAD --> <img src="product-123.jpg" alt="product"> <!-- GOOD --> <img src="product-123.jpg" alt="Classic leather messenger bag in brown, 15-inch laptop compatible">
When the entire card is a link, the link text must be descriptive:
See how 321 websites scored →
View the 2026 Report<!-- BAD: "Shop Now" × 12 is meaningless to screen readers --> <a href="/products/123">Shop Now</a> <!-- GOOD --> <a href="/products/123">Classic Leather Messenger Bag — $89</a> <!-- GOOD: visually shows product name, with sr-only context for AT --> <a href="/products/123" aria-label="View Classic Leather Messenger Bag, $89"> Shop Now </a>
Color swatches that are only visual (colored squares with no text) are inaccessible:
<!-- BAD: color-only swatches -->
<button style="background: #8B4513;"></button>
<button style="background: #000000;"></button>
<!-- GOOD: ARIA label conveys color name -->
<button aria-label="Color: Brown" aria-pressed="true"
style="background: #8B4513;">
<span class="sr-only">Brown</span>
</button>
<!-- GOOD: Native radio buttons, styled -->
<input type="radio" id="color-brown" name="color" value="brown">
<label for="color-brown">Brown</label>
<label for="qty">Quantity</label>
<input type="number"
id="qty"
name="qty"
value="1"
min="1"
max="99"
aria-label="Quantity">
<button aria-label="Decrease quantity">−</button>
<button aria-label="Increase quantity">+</button>
When a user adds to cart, the update must be announced to screen readers:
<div role="status" aria-live="polite" id="cart-notification"></div>
<script>
function addToCart(product) {
cart.add(product);
document.getElementById('cart-notification').textContent =
`${product.name} added to cart. ${cart.count} items in cart.`;
}
</script>
Faceted filters (category, price range, rating) are complex interactive components. Key requirements:
<fieldset> <legend>Filter by Category</legend> <label><input type="checkbox" name="category" value="bags"> Bags</label> <label><input type="checkbox" name="category" value="wallets"> Wallets</label> </fieldset> <!-- Announce result updates --> <p role="status" id="results-count">24 products found</p>
The checkout flow is the most critical path to remediate. Common failures:
<!-- Multi-step checkout progress -->
<nav aria-label="Checkout progress">
<ol>
<li aria-current="step">Shipping</li>
<li>Payment</li>
<li>Review</li>
</ol>
</nav>
<!-- Payment form with autocomplete -->
<label for="cc-name">Name on card</label>
<input id="cc-name" type="text" autocomplete="cc-name">
<label for="cc-number">Card number</label>
<input id="cc-number" type="text" autocomplete="cc-number"
inputmode="numeric" pattern="[0-9\s]*">
<label for="cc-exp">Expiration date (MM/YY)</label>
<input id="cc-exp" type="text" autocomplete="cc-exp" placeholder="MM/YY">
<label for="cc-csc">Security code</label>
<input id="cc-csc" type="text" autocomplete="cc-csc">
<search>
<label for="product-search">Search products</label>
<input type="search"
id="product-search"
role="combobox"
aria-autocomplete="list"
aria-expanded="false"
aria-controls="search-suggestions"
autocomplete="off">
<ul id="search-suggestions" role="listbox" hidden>
<!-- suggestions rendered here -->
</ul>
<button type="submit">Search</button>
</search>
Accessalyze scans your product pages and checkout flow for WCAG violations. Free, instant results.
Scan Your E-Commerce Site →← Back to Accessalyze · ← ADA Lawsuit Triggers
See real website accessibility scores: Browse 244+ free accessibility audits →
Try it yourself
Enter your website URL to get a free accessibility score.