Статьи

Синхронизация CSS-анимации с HTML5-аудио

CSS и HTML открыли богатое игровое поле для добавления мультимедийного контента на веб-страницу, в веб-приложение и проекты электронных книг. Одним из инновационных способов объединения этих двух технологий является добавление звуковых эффектов к вашим CSS-анимациям с использованием элементов <audio> и запуск их с помощью небольшого количества JavaScript.

Хотя звук в Интернете не всегда приветствуется, бывают случаи, когда он может обогатить взаимодействие с пользователем, не вызывая ненужного раздражения. Примерами являются сайты художников и игр или контент для детей. В некоторых случаях звук может быть полезен для посетителей с ограниченными возможностями.

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

Строить Сердце

Первый ингредиент, который нам нужен, — это сердце, которое мы хотим оживить. Мы создадим один, используя CSS псевдоэлементы . Его построение в HTML, а не с использованием изображения, даже если только с помощью псевдоэлементов, дает нам возможность анимировать различные свойства CSS для создания более интересной анимации.

Мы часто можем найти более одного способа создания фигуры таким образом, но если мы планируем анимировать ее, стоит подумать о геометрии и о том, как различные структурные решения влияют на движение и упрощают код ключевых кадров.

В этом случае самый простой метод — использовать два вертикальных прямоугольника, закругленных сверху, повернутых и расположенных так, чтобы они перекрывали друг друга, чтобы сформировать форму сердца. Их размер задается в процентах, и они абсолютно позиционированы с учетом геометрии, поэтому легко масштабировать исходную форму, изменяя размер контейнера. Прямоугольники поворачиваются на 45 градусов по часовой стрелке и против часовой стрелки, образуя левую и правую части сердца.

Строить Сердце

 .heart::before, .heart::after { background-color: red; content: ""; height: 80%; left: 25%; position: absolute; top: 2%; transform: translateZ(0) rotate(-45deg); width: 50%; } .heart::after { transform: translateZ(0) rotate(45deg); } того .heart::before, .heart::after { background-color: red; content: ""; height: 80%; left: 25%; position: absolute; top: 2%; transform: translateZ(0) rotate(-45deg); width: 50%; } .heart::after { transform: translateZ(0) rotate(45deg); } 

Закругленные стороны устанавливаются с двумя значениями радиусов, чтобы получить эллиптическую, а не круглую кривую и, следовательно, более естественную форму сердца. Поскольку длина сторон прямоугольника имеет отношение 5/8, радиусы эллипса рассчитывают на 50% / 37,5%, чтобы округлить только те углы, которые не перекрываются.

 .heart::before, .heart::after { border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } того .heart::before, .heart::after { border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } 

Теперь осталось отрегулировать исходную точку трансформации для прямоугольников, чтобы точки располагались в центре квадратной области, где прямоугольники перекрываются. Тот же самый взгляд может быть достигнут путем корректировки объявлений абсолютной позиции вместо использования подхода transform-origin . Но это позже усложнит код ключевых кадров, потому что это заставит нас контролировать положение более детально, а не полагаться на функцию масштабирования transform которая сделает всю работу за нас.

Точка transform-origin должна быть рассчитана с учетом системы координат до применения любых преобразований (поскольку преобразования могут влиять на систему координат, например, функция rotate() поворачивает систему координат вместе с элементом, к которому она применяется). Опять же, отношение длины сторон определяет положение этой точки: легко увидеть, что позиция X находится на уровне 50%, в центре прямоугольников, но позиция Y рассчитана на 68,75% от высоты прямоугольника, измеренной сверху. (55 * 100% / 80 = 68,75%). Движение с особым подходом симметрии также окупается, так как оба прямоугольника имеют одинаковое положение точки transform-origin .

 .heart::before, .heart::after { transform-origin: 50% 68.75% 0; } того .heart::before, .heart::after { transform-origin: 50% 68.75% 0; } 

И теперь у нас прекрасная симметричная форма сердца. Мы можем добавить вставку box-shadow , различную для каждого прямоугольника, чтобы сделать все это пухлым и трехмерным.

 .heart::before { box-shadow: -8px -14px 10px 0 black inset; } .heart::after { box-shadow: -15px 10px 14px 0 black inset; } 

Звук Сердца

Чтобы добавить аудио на страницу, мы используем элемент <audio> с путем к аудио файлу и без атрибута controls потому что мы не хотим, чтобы появился встроенный аудиопроигрыватель браузера (подробнее см. Использование аудио и видео HTML5 на MDN). ).

 <audio id="heartbeat" src="heartbeat.mp3" preload="auto"> Your browser does not support the <code>audio</code> element. </audio> 

Вместо элементов управления мы используем JavaScript для управления воспроизведением. В этом примере используются кнопки для запуска и сброса трека, но с немного большей работой мы могли бы обойтись без кнопок, а также для запуска и сброса звука, когда элемент сердца щелкается или зависает.

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

Согните эту мышцу

Чтобы заставить наше сердце биться, нам нужно изменить его форму от исходного, покоящегося сердца, до состояния, когда мышцы согнуты. Чтобы изогнуть сердце, мы немного уменьшим его и изменим его форму с border-radius .

CSS Heart расслаблено и согнуто

Вот как будут выглядеть согнутые стили, если бы мы нуждались в их статичности вне анимации:

 .heart::before, .heart::after { background-color: orange; transform: rotate(-45deg) scale(0.8); border-radius: 70% 70% 70% 0 / 70% 70% 10% 0; } .heart::after { transform: rotate(-45deg) scale(0.8); } того .heart::before, .heart::after { background-color: orange; transform: rotate(-45deg) scale(0.8); border-radius: 70% 70% 70% 0 / 70% 70% 10% 0; } .heart::after { transform: rotate(-45deg) scale(0.8); } 

Переход между состояниями покоя и сгибания, а затем обратно в исходную форму покоя заставляет одно сердце биться. Наши проценты ключевых кадров эффективно объявляют поочередно стили покоя и сгибания. Но чтобы синхронизировать его со звуком, нам нужно точно знать, как долго должна проигрываться анимация и какой процент ключевых кадров использовать для какого состояния сердца. Некоторое полезное звуковое программное обеспечение может помочь нам проанализировать звук и записать информацию о синхронизации, которая нам нужна для наших ключевых кадров.

Анализ аудиосигнала с помощью Audacity

Audacity® — это кроссплатформенное программное обеспечение с открытым исходным кодом для записи и редактирования звуков. Он прост в использовании, и даже если у вас нет опыта работы с подобным программным обеспечением для редактирования аудио или видео, вам не потребуется много усилий для получения необходимой информации.

Audacity Interface

Откройте ваш аудиосигнал в Audacity, и он автоматически покажет вам звуковую форму. В большинстве случаев этого будет достаточно, чтобы вы могли определить, где начинаются и заканчиваются определенные части звука, глядя на форму сигнала. Редко мы получаем сигнал, в котором лучше помогает какой-то другой режим просмотра спектрограммы, но в этом случае мы можем переключаться между различными режимами через выпадающее меню рядом со спектрограммой.

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

В нашем случае сердцебиения у нас есть 4 разных сердцебиения, и это легко распознать, посмотрев на форму волны. Нам нужно записывать каждое сердцебиение, когда оно начинается, заканчивается и когда оно находится в согнутом состоянии. Чтобы упростить эту задачу, мы используем приложение для работы с электронными таблицами, в котором мы фиксируем сердцебиения и их время в секундах.

Перевод аудио синхронизации в ключевые кадры

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

Расчет ключевых кадров электронной таблицы

Из этой таблицы мы можем создать проценты ключевых кадров и заполнить их стилями, связанными с каждым из них. В дополнение к масштабированию сердца и border-radius мы также меняем цвет сердца, чтобы подчеркнуть анимацию немного больше. Поскольку мы используем transform для масштабирования прямоугольников сердца, и каждый прямоугольник также имеет свое значение поворота, мы должны создать две разные анимации, по одной для каждого прямоугольника.

Вот код @keyframes для левого прямоугольника (анимация правого прямоугольника отличается только значениями ориентации вращения и положением border-radius ):

 @keyframes heartbeats-before { 3% { background-color: red; transform: rotate(-45deg) scale(1); border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } 8.2% { background-color: orange; transform: rotate(-45deg) scale(0.8); border-radius: 70% 70% 70% 0 / 70% 70% 10% 0; } 13.7% { background-color: red; transform: rotate(-45deg) scale(1); border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } 25% { background-color: red; transform: rotate(-45deg) scale(1); border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } 30% { background-color: orange; transform: rotate(-45deg) scale(0.8); border-radius: 70% 70% 70% 0 / 70% 70% 10% 0; } 36% { background-color: red; transform: rotate(-45deg) scale(1); border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } 44.4% { background-color: red; transform: rotate(-45deg) scale(1); border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } 49.6% { background-color: orange; transform: rotate(-45deg) scale(0.8); border-radius: 70% 70% 70% 0 / 70% 70% 10% 0; } 56.4% { background-color: red; transform: rotate(-45deg) scale(1); border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } 66.7% { background-color: red; transform: rotate(-45deg) scale(1); border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } 71.8% { background-color: orange; transform: rotate(-45deg) scale(0.8); border-radius: 70% 70% 70% 0 / 70% 70% 10% 0; } 77% { background-color: red; transform: rotate(-45deg) scale(1); border-radius: 50% 50% 0 0 / 37.5% 37.5% 0 0; } } 

Наконец, мы назначаем соответствующие анимации прямоугольникам. Мы устанавливаем общую длину анимации равной длине звука пульса, настраиваем ее на воспроизведение только один раз, с линейной функцией синхронизации и без задержки. Использование функции синхронизации, отличной от линейной, может испортить синхронизацию между анимацией и звуком, поэтому всегда не забывайте использовать функцию линейной синхронизации при синхронизации с внешним ресурсом.

 .heart.active::before { animation: heartbeats-before 5.85s linear 0 1; } 

Анимация назначается специальному классу, который мы добавляем к элементу сердца с помощью JavaScript, в то же время мы запускаем воспроизведение аудио. Таким образом мы обеспечиваем одновременный запуск анимации и звука, и вся работа по синхронизации окупается.

И это все для анимации сердцебиения, которую вы можете увидеть в демонстрации ниже.

Больше звуковых анимаций CSS!

Хотите узнать больше об CSS вкусностях, которые вы можете услышать и наблюдать? Вот еще несколько примеров, которые вы можете разобрать и извлечь уроки:

Ниже приведен список источников для медиа-ресурсов, используемых в этой статье:

Последние мысли

Я надеюсь, что эта статья вдохновит вас рассмотреть возможность использования звуков в ваших проектах, где это уместно, и побудит вас придумать творческие способы сочетания визуального и звукового сопровождения.

А что насчет тебя? Вы успешно использовали звуки с анимацией? Есть ли какой-то конкретный случай CSS-анимации, который вы хотели бы увидеть? Расскажите нам все об этом в комментариях!