JS властивість Event.volumechange


Загальний опис

Подія volumechange виникає, коли змінюється рівень гучності аудіо або відео елемента, або коли звук вимикається чи вмикається (mute/unmute). Ця подія може бути корисною для реалізації динамічних елементів інтерфейсу, наприклад, оновлення візуальних індикаторів гучності або для зберігання налаштувань користувача.

Щоб відстежити подію volumechange, використовується метод addEventListener, приклад:

const videoElement = document.querySelector('video');
videoElement.addEventListener('volumechange', (event) => {
  console.log('Гучність змінилася:', videoElement.volume);
});

У цьому прикладі, коли гучність змінюється, у консоль виводиться нове значення рівня гучності. Рівень гучності можна отримати через властивість volume елемента, яка знаходиться у діапазоні від 0.0 (мінімум, без звуку) до 1.0 (максимум). Якщо звук повністю вимкнено, властивість muted буде дорівнювати true.

Окрім прослуховування зміни гучності, можна також програмно змінювати гучність за допомогою властивості volume:

videoElement.volume = 0.5; // встановлення гучності на 50%

Також можна ввімкнути або вимкнути звук за допомогою властивості muted:

videoElement.muted = true; // вимкнення звуку

Подія volumechange спрацьовує як при зміні рівня гучності користувачем, так і при програмних змінах через код. Це дозволяє забезпечити зручну синхронізацію між інтерфейсом користувача та внутрішньою логікою програми.

Зазвичай ця подія використовується для оновлення елементів управління звуком у програвачах відео та аудіо, де потрібно динамічно відображати рівень гучності або зміну стану звуку.

автор: Bond

Порада

Можна додати власні контроли для гучності і вимкнення звуку, використовуючи прості повзунки або перемикачі, а подію volumechange — для синхронізації між цими контролями та поведінкою елемента.

автор: Bond
Порада

Важливо враховувати, що гучність може змінюватися поступово (через затримку між кліками або перетягуванням повзунка), тому реакцію на подію варто оптимізувати, щоб уникнути частого виклику важких операцій.

автор: Bond
Порада

Для збереження налаштувань гучності користувача після оновлення сторінки можна використовувати локальне сховище (localStorage). При кожній події volumechange зберігайте поточне значення, а при завантаженні сторінки використовуйте його для налаштування елемента.

автор: Bond

Синтаксис

element.addEventListener('volumechange', function(event) {
  // Дії після зміни гучності
});

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
3 6 3.1 ≤12.1 12 9
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4.4 18 6 3

Приклади

+ запропонувати свій приклад у пісочниці

HTML

<video id="videoElement" width="320" height="180" controls poster="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='180' viewBox='0 0 320 180'%3E%3Crect width='320' height='180' fill='%23264653'/%3E%3Cpath d='M138 62 192 90 138 118Z' fill='%23e9c46a'/%3E%3Ctext x='160' y='138' font-family='sans-serif' font-size='15' text-anchor='middle' fill='%23e9c46a'%3Eлише звук%3C/text%3E%3C/svg%3E">
    Ваш браузер не відтворює відео.
</video>

JS

const videoElement = document.getElementById('videoElement');

videoElement.src = silentWav(30);

// Зберігаємо налаштування гучності користувача в localStorage
videoElement.addEventListener('volumechange', () => {
  const userVolume = {
    volume: videoElement.volume,
    muted: videoElement.muted,
  };
  try {
    localStorage.setItem('userVolume', JSON.stringify(userVolume));
  } catch (error) {
    // у рамці прикладу сховище недоступне — воно тут і не головне
    console.log(`Сховище недоступне (${error.name})`);
  }
});

// Встановлюємо збережені налаштування при завантаженні сторінки
let savedVolume = null;
try {
  savedVolume = JSON.parse(localStorage.getItem('userVolume'));
} catch (error) {
  // у рамці прикладу сховища немає — просто нічого не відновлюємо
}

if (savedVolume) {
  videoElement.volume = savedVolume.volume;
  videoElement.muted = savedVolume.muted;
}

// — службове: беззвучний WAV замість медіафайла, збирається просто тут —
function silentWav(seconds = 3, rate = 8000) {
  const size = seconds * rate;  // 8-бітний моно PCM: один байт на семпл
  const le = (value, bytes) => String.fromCharCode(...Array.from({ length: bytes }, (_, i) => value >> 8 * i & 255));
  const head = `RIFF${le(36 + size, 4)}WAVEfmt ${le(16, 4)}${le(1, 2)}${le(1, 2)}${le(rate, 4)}${le(rate, 4)}${le(1, 2)}${le(8, 2)}data${le(size, 4)}`;

  return `data:audio/wav;base64,${btoa(head + '\u0080'.repeat(size))}`;
}
автор: Bond

HTML

<div id="volume-indicator">Гучність поки не змінювали</div>
<video id="videoElement" width="320" height="180" controls poster="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='180' viewBox='0 0 320 180'%3E%3Crect width='320' height='180' fill='%23264653'/%3E%3Cpath d='M138 62 192 90 138 118Z' fill='%23e9c46a'/%3E%3Ctext x='160' y='138' font-family='sans-serif' font-size='15' text-anchor='middle' fill='%23e9c46a'%3Eлише звук%3C/text%3E%3C/svg%3E">
    Ваш браузер не відтворює відео.
</video>

JS

const videoElement = document.getElementById('videoElement');
const volumeIndicator = document.getElementById('volume-indicator');

// Відображаємо рівень гучності на індикаторі
videoElement.addEventListener('volumechange', () => {
  const volumePercent = Math.round(videoElement.volume * 100);
  volumeIndicator.textContent = `Гучність: ${volumePercent}%`;

  if (videoElement.muted) {
    volumeIndicator.textContent = 'Звук вимкнено';
  }
});

videoElement.src = silentWav(30);

// — службове: беззвучний WAV замість медіафайла, збирається просто тут —
function silentWav(seconds = 3, rate = 8000) {
  const size = seconds * rate;  // 8-бітний моно PCM: один байт на семпл
  const le = (value, bytes) => String.fromCharCode(...Array.from({ length: bytes }, (_, i) => value >> 8 * i & 255));
  const head = `RIFF${le(36 + size, 4)}WAVEfmt ${le(16, 4)}${le(1, 2)}${le(1, 2)}${le(rate, 4)}${le(rate, 4)}${le(1, 2)}${le(8, 2)}data${le(size, 4)}`;

  return `data:audio/wav;base64,${btoa(head + '\u0080'.repeat(size))}`;
}
автор: Bond

HTML

<header>
  <h2 class="title">volumechange</h2>
  <p class="description">Відслідковує зміни гучності та вимкнення звуку для відео елемента</p>
</header>
<main>
  <div class="result">
    <!-- Відео елемент -->
    <video id="videoElement" controls width="400" poster="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='180' viewBox='0 0 320 180'%3E%3Crect width='320' height='180' fill='%23264653'/%3E%3Cpath d='M138 62 192 90 138 118Z' fill='%23e9c46a'/%3E%3Ctext x='160' y='138' font-family='sans-serif' font-size='15' text-anchor='middle' fill='%23e9c46a'%3Eлише звук%3C/text%3E%3C/svg%3E">
      Ваш браузер не підтримує відтворення відео.
    </video>

    <!-- Повзунок для регулювання гучності -->
    <div>
      <label for="volumeSlider">Гучність:</label>
      <input type="range" id="volumeSlider" min="0" max="100" value="50">
    </div>

    <!-- Кнопка для вимкнення/ввімкнення звуку -->
    <div>
      <button id="muteButton">Вимкнути звук</button>
    </div>

    <!-- Текстовий індикатор гучності -->
    <p id="volumeDisplay">Поточна гучність: 50%</p>
  </div>
</main>

CSS

body {
  font-size: 16px;
  line-height: 1.5;
  font-family: monospace;
}

header {
  background-color: #f1f1f1;
  margin-bottom: 25px;
  padding: 15px;
  -webkit-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  -moz-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

header h2.title {
  padding-bottom: 15px;
  border-bottom: 1px solid #999;
}

header p.description {
  font-style: italic;
  color: #222;
}

.result {
  background-color: #f8f8f8;
  padding: 15px;
  -webkit-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  -moz-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

video {
  display: block;
  margin-bottom: 15px;
}

input[type="range"] {
  width: 100%;
  max-width: 300px;
  margin-top: 10px;
}

button {
  margin-top: 10px;
  padding: 8px 16px;
  background-color: #4CAF50;
  color: white;
  border: none;
  cursor: pointer;
}

button:hover {
  background-color: #45a049;
}

#volumeDisplay {
  margin-top: 15px;
  color: #333;
}

JS

const videoElement = document.getElementById('videoElement');
const volumeSlider = document.getElementById('volumeSlider');
const muteButton = document.getElementById('muteButton');
const volumeDisplay = document.getElementById('volumeDisplay');

// Джерело: беззвучний WAV, зібраний тут-таки (див. silentWav нижче)
videoElement.src = silentWav(30);

// Встановлюємо початкову гучність для відео
videoElement.volume = 0.5;

// Обробник події зміни гучності через повзунок
volumeSlider.addEventListener('input', () => {
  const volumeValue = volumeSlider.value / 100;
  videoElement.volume = volumeValue;
});

// Обробник події для вимкнення/ввімкнення звуку
muteButton.addEventListener('click', () => {
  videoElement.muted = !videoElement.muted;
  muteButton.textContent = videoElement.muted ? 'Увімкнути звук' : 'Вимкнути звук';
});

// Обробник події 'volumechange' для відстеження змін гучності або статусу звуку
videoElement.addEventListener('volumechange', () => {
  if (videoElement.muted) {
    volumeDisplay.textContent = 'Звук вимкнено';
    volumeSlider.value = 0;
  } else {
    const volumePercent = Math.round(videoElement.volume * 100);
    volumeDisplay.textContent = `Поточна гучність: ${volumePercent}%`;
    volumeSlider.value = volumePercent;
  }
});

// — службове: беззвучний WAV замість медіафайла, збирається просто тут —
function silentWav(seconds = 3, rate = 8000) {
  const size = seconds * rate;  // 8-бітний моно PCM: один байт на семпл
  const le = (value, bytes) => String.fromCharCode(...Array.from({ length: bytes }, (_, i) => value >> 8 * i & 255));
  const head = `RIFF${le(36 + size, 4)}WAVEfmt ${le(16, 4)}${le(1, 2)}${le(1, 2)}${le(rate, 4)}${le(rate, 4)}${le(1, 2)}${le(8, 2)}data${le(size, 4)}`;

  return `data:audio/wav;base64,${btoa(head + '\u0080'.repeat(size))}`;
}
автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід