Воспроизведение звуков с помощью CSS

Эта статья рассказывает о способе, который позволяет воспроизводить звук на веб-странице с помощью CSS. Но я не рекомендую использовать его там, где проигрывание звукового контента можно реализовать с помощью <audio> и JavaScript.

Реализация

Воспроизведение звуков с помощью CSS основано на вставке аудиофайла в HTML-код в виде скрытого объекта и его проигрывании:

<style>
  embed { display: none; }
  button:active + embed { display: block; }
</style>

<button>Play Sound</button>
<embed src="path-to-audio-file.mp3" />

Приведенный выше код использует тег <embed>. Но также можно применять <object>:

<object data="path-to-audio-file.mp3"></object>

Используя эту технику, около года назад я создал пианино на чистом HTML / CSS. Оно отлично работало, но сейчас оно больше не работает на CodePen.

В примере использует embed или object вместо audio, поэтому импортированный файл подвергается более строгим проверкам безопасности.

Согласно нормам политики контроля доступа к сторонним источникам (CORS) аудиофайл должен использовать тот же протокол и домен, что и страница, на которую он импортирован. Даже перевод звука в base64 больше не поможет. А чтобы его услышать, пользователям нужно разрешить воспроизведение звука на веб-странице в настройках браузера. Кроме этого теперь браузеры воспроизводят звуки только один раз.

Ограничения CORS можно обойти, если у вас есть контроль над серверами и файлами.

Почему так?

Теорию, лежащую в основе подобного поведения можно найти в определении тега <embed>. Если этот элемент становится потенциально активным, пользовательский агент должен поставить его задачу в очередь и выполнить ее.

По крайней мере, так должны вести себя все браузеры. Но они этого не делают.

Поддержка браузерами

Это работает в Opera и Google Chrome. Тем не менее, этот подход не будет работать в других браузерах на базе движка Chromium. В Safari, Internet Explorer или Microsoft Edge для Windows данная реализация также работать не будет. Браузер Firefox будет воспроизводить все звуки одновременно только при загрузке страницы.

В целом, это лишь забавный CSS-трюк. Но он не годится для практического применения.