Кастомный audio-плеер
Есть вот такой код:
<button class="audio-player" type="button">
<svg class="audio-player__icon" width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.625 18.75H1.875V41.25H5.625V18.75Z" fill="white"/>
<path d="M47.8125 18.75H44.0625V41.25H47.8125V18.75Z" fill="white"/>
<path d="M15.9375 10.3125H12.1875V48.75H15.9375V10.3125Z" fill="white"/>
<path d="M37.5 11.25H33.75V48.75H37.5V11.25Z" fill="white"/>
<path d="M58.125 11.25H54.375V48.75H58.125V11.25Z" fill="white"/>
<path d="M26.25 1.875H22.5V58.125H26.25V1.875Z" fill="white"/>
</svg>
<span class="audio-player__text">On</span>
</button>
Суть такая, что по нажатию на кнопку audio-player, должен меняться текст on/off, а также должен прыгать при воспроизведении audio хотя бы просто хаотично анализатор спектра (т.е. svg линии - audio-player__icon).
Ответы (1 шт):
Автор решения: UModeL
→ Ссылка
Если не требуется визуализация на основе реальных частот, а всего лишь декоративный элемент, то кода будет немного. При каждом запуске, animation-duration и animation-delay для каждой полоски устанавливается случайным образом, что практически исключает повторы:
let btn = document.querySelector('.audio-player');
let btnTxt = document.querySelector('.audio-player__text');
btn.addEventListener('click', function () {
let active = this.classList.contains('active');
this.classList.toggle('active', !active);
this.querySelector('.audio-player__text').textContent = !active ? 'On' : 'Off';
[...this.querySelectorAll('.audio-player__icon path')].forEach((el) => {
el.style.animation = !active ? `peak ${Math.random() * 100 + 400}ms cubic-bezier(.25,1.02,.36,.27) ${Math.random() * 200}ms infinite` : '';
});
});
.audio-player {
display: flex;
justify-content: center;
align-items: center;
background-color: #000;
}
.audio-player__text {
font: bold 22px/1em sans-serif;
color: #fff;
}
.audio-player__icon path {
transform-origin: center center;
transform: scaleY(.01);
}
@keyframes peak { 50% { transform: scaleY(1); } }
<button class="audio-player" type="button">
<svg class="audio-player__icon" width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.625,1.875h-3.75v56.25h3.75v-56.25z" fill="red"/>
<path d="M15.9375,1.875h-3.75v56.25h3.75v-56.25z" fill="orange"/>
<path d="M26.25,1.875h-3.75v56.25h3.75v-56.25z" fill="yellow"/>
<path d="M37.5,1.875h-3.75v56.25h3.75v-56.25z" fill="lime"/>
<path d="M47.8125,1.875h-3.75v56.25h3.75v-56.25z" fill="cyan"/>
<path d="M58.125,1.875h-3.75v56.25h3.75v-56.25z" fill="blue"/>
</svg>
<span class="audio-player__text">Off</span>
</button>