CSS Animations
Больше вкусностей найдешь на моем канале - https://t.me/emotional_robotЧеловеческий мозг запрограммирован обращать внимание на движущиеся объекты. Из-за этого естественного рефлекса, добавление анимации на ваш сайт или приложение является мощным способом привлечь внимание пользователей к важным областям вашего продукта и добавить интерес к вашему интерфейсу.
Когда все сделано хорошо, анимация может добавить ценные взаимодействия и обратную связь, а также усилить эмоциональный опыт, вызвать восторг и добавить индивидуальность вашему интерфейсу. Иначе говоря, одушевить, воплотить в жизнь.
CSS анимация состоит из двух основных строительных блоков:
- Ключевые кадры - определяют этапы и стили анимации.
- Свойство animation - назначьте @keyframes конкретному элементу CSS и определите, как он анимируется.
Ключевые кадры
Ключевые кадры (@keyframes) являются основой CSS анимации. Они определяют, как выглядит анимация на каждом этапе временной шкалы анимации. Каждый @keyframes состоит из:
- Имя анимации. Имя, которое описывает анимацию, например bounceIn.
- Этапы анимации. Каждый этап анимации представлен в процентах. 0% представляет начальное состояние анимации, 100% - конечное состояние анимации. Между ними можно добавить несколько промежуточных состояний.
- Свойства CSS. Свойства, определенные для каждого этапа временной шкалы анимации.
Давайте разберем следующий пример:
@keyframes имеет три этапа. На первом этапе (0%) элемент имеет непрозрачность 0 (ноль, то бишь его не видно) и уменьшен до 10 процентов от размера по умолчанию, используя масштаб преобразования CSS (подробно про свойство transform здесь). На втором этапе (60%) элемент становится полностью непрозрачным и увеличивается до 120 процентов от размера по умолчанию. На последнем этапе (100%) он немного уменьшается и возвращается к размеру по умолчанию.
С помощью @keyframes описывается анимация, но чтобы её запустить, нам нужно присвоить имя @keyframes свойству любого блока, которое называется animation-name:
#animation {
animation-name: bounceIn
}
Однако, в нашем примере указано другое свойство - animation. Это сокращение (как обычно, в CSS любят сокращения) многих свойств, определяющих имя анимации и то, как именно анимация будет осуществляться. В нашем случае указаны имя анимации (animation-name) и продолжительность (animation-duration). Еще раз, наш код:
#animation {
animation: bounceIn 2s;
}
Эквивалентен коду
#animation {
animation-duration: 2s;
animation-name: bounceIn;
}
Эти два свойства являются обязательными для запуска анимации. Можете проверить в браузере, что у нас получилось.
Кроме обязательных свойств, есть опциональные, которые помогут более тонко настроить анимацию.
Свойства анимации
Каждое свойство анимации может быть определено индивидуально, но для более чистого и быстрого кода рекомендуется использовать сокращение. Все свойства анимации добавляются к одному и тому же animation свойству в следующем порядке:
animation: [animation-name] [animation-duration] [animation-timing-function]
[animation-delay] [animation-iteration-count] [animation-direction]
[animation-fill-mode] [animation-play-state];
Как я уже написал выше, обязательными из них являются только первые два: имя @keyframes и длительность (указывается в секундах и миллисекундах). Все остальные свойства необязательные, но весьма полезные:
1) animation-timing-function. Определяет кривую скорости или темп анимации. Вы можете задать синхронизацию со следующими предопределенными параметрами: ease, linear, ease-in, ease-out, ease-in-out, initial, inherit. Этот параметр аналогичен параметру в transition, то есть для более подробного понимания этой функции придется вникать в математику. Поэтому рекомендую аналогично присвоить нашей анимации одно из значений ease, linear, ease-in, ease-out, ease-in-out и посмотреть в браузере, как ведет себя анимация при этих значениях.
Пример CSS кода для этого свойства (кстати, ease является значением по умолчанию):
animation-timing-function: ease-in-out;
Или в сокращенном варианте:
animation: [animation-name] [animation-duration] [animation-timing-function];
animation: bounceIn 2s ease-in-out;
2) animation-delay. Позволяет определить , когда анимация (или кусочки анимации) начнется. Значение определяется в секундах (s) или миллисекундах (ms). Положительное значение (например, 2s) запустит анимацию через 2 секунды после ее запуска. Элемент останется без анимации до этого времени. Отрицательное значение (например, -2s) запустит анимацию сразу, но от длительности анимации отщипнет указанную задержку. Например, в данном коде:
animation: bounceIn 4s ease-in-out -2s;
Анимация запустится сразу и на середине, так как от длительности 4 секунды мы отняли двухсекундную задержку.
В общем виде данное свойство может быть указано как
animation-delay: 5s;
Или в сокращенном варианте
animation: [animation-name] [animation-duration] [animation-timing-function]
[animation-delay];
animation: bounceIn 2s ease-in-out 3s;
3) animation-iteration-count. Определяет, сколько раз анимация будет повторяться. Возможные значения:
- Число - определенное количество итераций (по умолчанию 1).
- infinite - анимация повторяется бесконечно.
- initial - устанавливает счетчик итераций в значение по умолчанию.
- inherit - наследует значение от родителя.
Синтаксис CSS:
animation-iteration-count: 2;
Или в сокращенном варианте:
animation: [animation-name] [animation-duration] [animation-timing-function]
[animation-delay] [animation-iteration-count];
animation: bounceIn 2s ease-in-out 3s 2;
4) animation-direction. Данное свойство определяет, в каком направлении анимация будет двигаться: вперед, назад или в альтернативных циклах:
- normal (по умолчанию) - анимация воспроизводится вперед. На каждом цикле анимация сбрасывается в начальное состояние (0%) и снова воспроизводится вперед (до 100%).
- reverse - анимация воспроизводится задом наперед. На каждом цикле анимация сбрасывается до конечного состояния (100%) и воспроизводится в обратном направлении (до 0%).
- alternate - анимация меняет направление каждый цикл. На каждом нечетном цикле анимация воспроизводится вперед (от 0% до 100%). На каждом четном цикле анимация воспроизводится в обратном направлении (от 100% до 0%).
- alternate-reverse - анимация меняет направление каждый цикл. В каждом нечетном цикле анимация воспроизводится в обратном порядке (от 100% до 0%). На каждом четном цикле анимация воспроизводится вперед (0% или 100%).
Синтаксис CSS:
animation-direction: alternate;
Или в сокращенном варианте:
animation: [animation-name] [animation-duration] [animation-timing-function]
[animation-delay] [animation-iteration-count] [animation-direction];
animation: bounceIn 2s ease-in-out 3s 3 alternate;
5) animation-fill-mode. Определяет, какие стили анимации будут видны по окончанию анимации: до или после воспроизведения анимации. По умолчанию анимация не влияет на стили элемента до начала анимации (если есть задержка анимации) или после ее завершения. animation-fill-mode свойство может переопределить это поведение со следующими возможными значениями:
- backwards - перед анимацией (во время задержки анимации) к элементу применяются стили исходного ключевого кадра (0%).
- forwards - после завершения анимации, стили, определенные в конечном ключевом кадре (100%), сохраняются.
- both - анимация будет следовать правилам как вперед, так и назад, расширяя свойства анимации до и после анимации.
- normal (по умолчанию) - анимация не применяет никаких стилей к элементу, до или после анимации.
Чтобы лучше понять смысл этого свойства, просто задайте его элементу из нашего примера и проверьте, как он ведет себя в браузере. Если совсем просто: с помощью этого свойства вы можете указать, стили какого из ключевых кадров сохранятся по окончанию анимации.
Синтаксис CSS:
animation-fill-mode: forwards;
Или в сокращенном варианте:
animation: [animation-name] [animation-duration] [animation-timing-function]
[animation-delay] [animation-iteration-count] [animation-direction]
[animation-fill-mode];
animation: bounceIn 2s ease-in-out 3s 3 normal forwards;
6) animation-play-state. Определяет состояние анимации: воспроизведена или остановлена. Возобновление приостановленной анимации запускает анимацию с того места, где она была остановлена. Возможные значения:
- playing - анимация в данный момент запущена.
- paused - анимация в данный момент приостановлена.
Например, при наведении курсора на элемент с запущенной анимацией мы можем её остановить:
.div:hover {
animation-play-state: paused;
}
Если курсор увести с элемента, анимация продолжится с того места, где она остановилась при наведении курсора.
Как и в случае с transition, мы можем задать сразу несколько анимаций:
.div {
animation: slideIn 2s, rotate 1.75s;
}
Собственно, это и есть вся CSS анимация. Чтобы лучше запомнить все перечисленные свойства, просто добавляйте их к элементам и проверяйте работу в браузере. Можно делать любые трансформации (transform), менять цвета фона, текста, прозрачность. Объединяйте несколько анимаций. Пробуйте и запоминайте - CSS Animations весьма увлекательное мероприятие.
Итого
Мы разобрали такие интересные инструменты, как CSS Transitions и CSS Animations. Они помогают нам "оживить" интерфейс, сделать его более привлекательным и интересным для пользователя. Однако, не увлекайтесь этим сильно - слишком много анимаций будут раздражать пользователей. Не забывайте, что главная цель посетителя вашего сайта - удовлетворить возникшую потребность в чем-либо. Если анимация будет мешать ему сделать это быстро, он уйдет с сайта. Поэтому, будьте осторожны, ищите баланс между удобством и "вауэффектностью".
За сим я объявляю цикл статей по верстке оконченным. Понятно, что я прошелся по верхушкам и не погружался досконально в некоторые вещи, но в этом нет смысла - вам нужна практика, только через практику вы сможете понять все нюансы. И я как раз в процессе разработки курса по верстке - следите за обновлениями на канале, скоро я сделаю анонс.