Опыты с CSS: колебания

0
393
views
verstka logo

Хочешь знать больше про веб?

Подпишись на наш телеграм-канал TechRocks WEB-разработка?

×

Колебания — это визуальное представление волн любого типа, например, звуковых. В нашем примере мы не будем привязывать колебания к каким-то настоящим данным, но вы при желании можете попробовать это сделать при помощи 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».