Newsroom

Stay ahead with updates on our latest tools and services, and the ideas shaping 3D & AR for e-commerce.

3D for e-commerce6 min read

Making a 3D product viewer accessible: keyboard, screen readers and reduced motion

What WCAG actually requires from a 3D viewer and AR button, which model-viewer attributes help, and the parts of AR that cannot be made accessible.

By CharpstAR · 4 Oct 2023 · Updated 22 Sept 2026

OCT2023
Making a 3D product viewer accessible: keyboard, screen readers and reduced motion

A 3D product viewer is a canvas that responds to dragging. That is a difficult starting point for accessibility, and a lot of implementations simply ignore the problem: no text alternative, no keyboard control, an auto-rotating model that will not stop, and an AR button that a screen reader announces as "button".

This article is the technical version. What the relevant WCAG success criteria require, what you can do about each one, and which parts of AR genuinely cannot be made accessible so that you plan a fallback instead of pretending.

The criteria that apply

Four of them do most of the work.

1.1.1 Non-text Content (Level A). All non-text content presented to the user has a text alternative that serves the equivalent purpose. A 3D model is non-text content. It needs a description.

2.1.1 Keyboard (Level A). All functionality of the content is operable through a keyboard interface. If a sighted mouse user can rotate the model, a keyboard user must be able to rotate it too.

2.1.2 No Keyboard Trap (Level A). If focus can be moved into a component with the keyboard, it must be possible to move focus away again using only the keyboard. Canvas-based viewers that capture arrow keys are the classic offender.

2.2.2 Pause, Stop, Hide (Level A). Automatically moving content that starts by itself and runs for more than a few seconds needs a mechanism to pause or stop it. An auto-rotating product model is exactly this.

Worth knowing about too: 2.3.3 Animation from Interactions (Level AA), which concerns motion animation triggered by interaction, and 2.5.4 Motion Actuation (Level A), which concerns functionality operated by device motion.

Text alternatives that are actually useful

The `alt` attribute on `` is documented as custom text used to describe the model to viewers who use a screen reader or otherwise depend on additional semantic context. So the mechanism exists. The problem is what most teams put in it.

"3D model of chair" is compliant and useless. The equivalent purpose of a 3D viewer is to convey shape, proportion, material and scale. So write that:

"Oak dining chair, 45 cm wide, 52 cm deep, 82 cm tall, seat height 46 cm. Solid oak frame with a natural matt finish, four tapered legs, curved backrest in three vertical slats, woven paper cord seat in light grey."

That paragraph gives a screen reader user the information a sighted user gets from spinning the model. It takes two minutes per product to write and it is the single highest-value accessibility action on the list. If you generate it from your product data, fine, as long as somebody checks that the result reads like a description and not like a spec dump.

Keyboard control

`camera-controls` in model-viewer enables controls via mouse and touch, and the component supports keyboard interaction when the element is focusable. The things to verify yourself, because they are easy to get wrong in a custom wrapper:

  • The viewer receives focus in the normal tab order and shows a visible focus ring.
  • Arrow keys rotate the model once it has focus, and do not scroll the page at the same time.
  • Tab moves focus out again. This is criterion 2.1.2 and it is the one that fails most often.
  • Zoom has a keyboard path, or zoom is disabled with `disable-zoom` so nothing is keyboard-only inaccessible.
  • The AR button is a real button element with a label like "View this chair in your room", not an icon with no accessible name.

The `touch-action` attribute matters here too. Its default of `pan-y` lets touch users scroll the page vertically past the viewer, which prevents the model from trapping the scroll on mobile. That is the touch equivalent of a keyboard trap and it annoys everybody, not only assistive technology users.

Motion

Auto-rotation is the default setting people reach for because it signals that the model is interactive. It also violates 2.2.2 if it runs for more than five seconds with no way to stop it, and it is uncomfortable for people with vestibular conditions.

The fix is straightforward. Respect the operating system setting through the `prefers-reduced-motion` media feature, which detects if a user has enabled a setting on their device to minimise non-essential motion. Its values are `no-preference` and `reduce`, and it maps to the reduce motion settings in Windows, macOS, iOS, Android and Linux.

```css
@media (prefers-reduced-motion: reduce) {
model-viewer { --auto-rotate: none; }
}
```

In practice: do not set `auto-rotate` when the user has asked for reduced motion, and give everyone a visible pause control if you do use it. The `interaction-prompt` attribute, which controls the visual and auditory prompt that appears after a threshold, can be disabled too if the prompt animation is itself a problem.

Loading and fallbacks

The `poster` attribute displays an image instead of the model, useful for showing the user something before a model is loaded and ready to render. Pair it with `loading`, which takes `auto`, `lazy` or `eager`, and with `reveal`, which controls when the model is shown.

For accessibility this matters because the poster is the fallback state. On a slow connection, an old device, or a browser where WebGL is unavailable, the poster image with a proper `alt` on the surrounding content is what the user gets. Make sure that state is a usable product page rather than a grey box, and make sure the page never depends on the 3D viewer to convey information that appears nowhere else. Dimensions, materials and colours belong in the page text as well as in the model.

The part you cannot fix

AR placement requires a camera, a device with motion tracking, and the physical ability to hold a phone and move it around a room. There is no accessible equivalent of that experience, and no amount of markup changes it.

So treat AR as an enhancement, never as the only route to a piece of information. Everything AR communicates, which is essentially real-world size in context, must also be available as written dimensions, as a scale drawing or as a photograph of the product next to a known reference object. If a shopper can only learn that the sofa is too wide by placing it in AR, the page has failed for a large group of people.

A short test you can run today

CheckHowCriterion
Description exists and is specificRead the `alt` text aloud. Could you picture the product1.1.1
Keyboard rotateTab to the viewer, press arrow keys2.1.1
Keyboard escapePress Tab again. Does focus leave2.1.2
Motion stoppableIs there a pause, and does reduce motion turn it off2.2.2
AR button namedScreen reader announces a meaningful label1.1.1
No WebGL fallbackDisable WebGL. Is the page still usableGeneral
Dimensions in textAre sizes readable without the 3D viewerGeneral

Seven checks, about fifteen minutes per template. Run them once and you will be ahead of most e-commerce sites carrying 3D.

We build models and viewers for furniture and home brands and we ship the descriptions with them, because a model without a text alternative is an unfinished model. Sweef, Contura and MELIMELI all run this setup.

If you want to see the standard we work to, we will build one model for your catalogue for free, description included. Send us a product, or read solutions and prices.

Sources

Try it with your product

Send us one product and we build it as a web-ready 3D model with AR, free, for your own product page.

Get your free sample
Ready Phone

Ready When You Are!

Let's build something that moves.

Whether you're exploring 3D for the first time or ready to roll out WebAR across your entire catalog, we can help.

Fill in the contact form and we'll get back to you.