Skip to content
easeweb
Search topics

Autoplaying sound with no way to stop it

A hero video starts with its soundtrack on, and the page has no control that pauses or mutes it.

WCAG 2.2
SC 1.4.2A
Required by
Section 508 · EN 301 549 (EU)
Broken <video src="our-story.mp4" autoplay loop>
The accessibility problem illustrated: Sound starts. Nothing stops it.
01

The problem

Screen reader users can't hear their screen reader over the soundtrack, so they can't find a way to stop it.

02

Try it

Play the short film, then try to stop it with the keyboard.

Try with sound stands in for the film starting with its sound on, since this page never plays sound by itself. Then Tab through the page and watch the screen reader preview. Apply a fix to find the film’s own buttons.

Broken Can you fix this?

Fresh from our roastery

Roasted in small batches

Shop the beans

Screen reader preview (simulated)

Tab to a link or a button.

A recreated demo. The broken version is intentionally inaccessible.

03

The fix

Let people start the sound: the film waits for Play, or starts muted with a button to turn the sound on.

  1. 1Only sound the visitor started plays for more than three seconds.
  2. 2Turn sound off with a control on the page, never by asking people to lower the system volume.
  3. 3Put the muted attribute in the HTML of every video that plays by itself.
Before A film that starts with its sound on
<section class="hero">  <video src="our-story.mp4" autoplay loop playsinline></video>  <h1>Roasted in small batches</h1></section>
After

The film waits for Play

<section class="hero">  <video id="film" src="our-story.mp4" poster="our-story.jpg"    loop playsinline aria-hidden="true"></video>  <h1>Roasted in small batches</h1>  <button type="button" id="play" class="film-button">    <svg aria-hidden="true" focusable="false"><use href="#icon-play"></use></svg>    <span class="visually-hidden">Play film</span>  </button></section><script>  const film = document.getElementById('film');  const play = document.getElementById('play');  // The icon and the hidden name change together.  const set = (button, icon, name) => {    button.querySelector('use').setAttribute('href', icon);    button.querySelector('.visually-hidden').textContent = name;  };  play.addEventListener('click', () => (film.paused ? film.play() : film.pause()));  const show = () => set(play, film.paused ? '#icon-play' : '#icon-pause',    film.paused ? 'Play film' : 'Pause film');  ['play', 'pause'].forEach((type) => film.addEventListener(type, show));</script>

Fixing this with an AI coding assistant? Get this guide as Markdown

04

Verify the fix

5 checks, no mouse.

Test with: Keyboard, Screen reader, Autoplay settings

0 of 5 checked

Record the OS, browser and assistive-technology versions, the build, the date, and the actual result of each step. Repeat after the hero or any embedded player changes.

Limits

This is a starting pattern, not a guarantee for every application. Browsers change their autoplay rules, so a page that is silent today in one browser may not be tomorrow in another. Test the complete journey with your target browsers and assistive technology.

This is a recreated teaching example, not a finding about a named client. The code is a starting pattern: test it in your own product. No completed assistive-technology test is claimed here.

Keep this fixed as your code changes.

Turn guides like this into rules your coding agents and CI follow, then have the result retested with a keyboard and screen readers.

How retests work