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

Примечание: в этой статье мы разберем только основные моменты, а внизу я дам ссылку на код всего проекта.
Создаем основу
Для начала нам нужно создать несколько блоков div, обернутых в section. У каждого div будет уникальный класс.
<section>
<div class="wave0">
</div>
<div class="wave1">
</div>
<div class="wave2">
</div>
<div class="wave3">
</div>
<div class="wave4">
</div>
<div class="wave5">
</div>
<div class="wave6">
</div>
</section>
Можете назвать эти классы, как вам угодно, я ограничился простыми wave0-wave6, чтобы все было понятнее.
Для создания макета мы используем flexbox. Также мы применим селектор * для стилизации всех классов сразу. Так нам не придется дублировать селекторы или правила.
section:
section {
display: flex;
gap: 15px;
margin-top: 5vw;
}
div:
[class*='wave'] {
aspect-ratio: .125/1;
background-color: white;
border-radius: 15px;
width: .5vw;
}
Это даст нам следующий результат (кроме названия, конечно):

Анимация
Создаем кейфреймы
Мы создаем описание анимации, используя @keyframes с именем waveform.
@keyframes waveform {
0% {
transform: scaleY(.5);
}
50% {
transform: scaleY(1.5);
}
100% {
transform: scaleY(.5);
}
}
При применении к любому элементу эта анимация будет приводить к изменению размера элемента по оси Y:
- при 0% — до половины размера по вертикали (т. е. высоты)
- при 50% — до 1,5 высоты
- при 100% — обратно до половины высоты
Примечание. Если бы мы применили поворот на 90 градусов, ось Y соответствовала бы размеру по горизонтали. Об этом важно помнить, работая с более сложными анимациями.
Чтобы применить нашу анимацию, мы изменим набор правил для [class*='wave'], включив в него объявление animation.
[class*='wave'] {
aspect-ratio: .125/1;
/*This can all be written on one line:*/
animation: waveform var(--wavefreq)
ease-in-out infinite
forwards;
background-color: white;
border-radius: 15px;
width: .5vw;
}
Здесь мы видим свойство animation и несколько значений, соответствующих другим свойствам, таким как animation-name, animation-duration, animation-timing-function. Я не буду здесь расписывать, что означает каждое из них, это можно прочесть в документации.
А как насчет var()?
Вы наверняка заметили, что я включил в animation пользовательское свойство (их также часто называют CSS-переменными). Это важно, потому что позволит нам изменять значение скорости анимации (animation-duration), не объявляя заново анимацию для каждого из наших классов.
Объявление переменной
Добавьте этот отрывок кода вверху вашего CSS-файла:
:root {
--m: 17.5;
--wavefreq: calc(100ms * var(--m));
}
Этот код велит браузеру создать два пользовательских свойства: —m, которое работает как константа, и —wavefreq, которое вычисляет тайминг нашей анимации при помощи функции calc().
Наконец, проставляем тайминг для каждого класса отдельно
Тут у нас несколько повторов, так что если ваш редактор кода поддерживает дублирование, самое время использовать эту функцию. Ну, или можно просто делать копипаст этого кусочка кода.
.wave1 {
--wavefreq: calc(200ms * var(--m));
}
.wave2 {
--wavefreq: calc(300ms * var(--m));
}
.wave3 {
--wavefreq: calc(400ms * var(--m));
}
.wave4 {
--wavefreq: calc(500ms * var(--m));
}
.wave5 {
--wavefreq: calc(600ms * var(--m));
}
.wave6 {
--wavefreq: calc(700ms * var(--m));
}
Результат
Немного поиграв со значениями («константой», количеством миллисекунд в функции calc() для каждой волны), можно добиться интересных результатов.
Исходный код + Пример
Я создал эти колебания как отдельный проект. Вы можете свободно взять его с моей gumroad-страницы. Проект включает слайдер и соответствующий JS-код, позволяющий менять скорость анимации.
Перевод статьи «CSS Funstuff: Animated Waveforms».
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]


