Простая CSS анимация с помощью @keyframes

Содержание материала:

HTML\CSS → Анимации и keyframes

СSS-анимация состоит из двух частей: набора ключевых кадров keyframes и параметров самой анимации. Анимация описывает, как будет меняться стиль блока от начальной до конечной точки.

Пример описания и применения анимации:

В данном примере мы назначили анимацию my_animationэлементам с классом .btn. В результате работы анимации элемент плавно прокрутится по своей оси за 1 секунду. Одному элементу могут быть одновременно назначены несколько анимаций.

@keyframes задает название анимации, а также описывает ключевые кадры — начальный и конечный, которые задаются с помощью зарезервированных слов from и to или значений 0% и 100% . Если не задан начальный ключевой кадр, то анимация будет проигрываться из исходного стилевого состояния элемента к ближайшему шагу из перечисленных в keyframes и далее. Если не задан конечный кадр, то после достижения последнего шага, анимация проиграется в обратном направлении до достижения изначального состояния элемента.

Пример использования анимации на CSS:

Свойство animation-name указывает название анимации.

Свойство animation-duration указывает длительностьанимации, задается в секундах s или миллисекундах ms .

Свойство animation-delay указывает задержку начала анимации, задается в секундах s или миллисекундах ms .

Свойство animation-iteration-count определять сколько раз будет повторяться анимация. Значение 0 означает, что анимация не будет выполнена, в остальных случаях она повторится указанное число раз. Значение infinite означает, что анимация будет выполняться бесконечно.

Свойство animation-direction указывает направление анимации. Значения:
normal — прямое направление воспроизведения (по умолчанию);
reverse — проигрывание начинается с конца и идет к началу (обраное);
alternate — нечетные проигрывания будут выполняться в прямом направлении, а четные — в обратном (на основе значения animation-iteration-count);
alternate-reverse — нечетные проигрывания наоборот будут выполняться в обратном направлении, а четные — в прямом.

Свойство animation-fill-mode определяет, сохранит ли свое состояние объект, когда анимация уже закончилась. Значения:
forwards — элемент сохранит свое состояние после завершения анимации;
backwards — элемент примет начальное состояние до начала анимации;
both — до начала анимации элемент примет состояние первого ключевого кадра, а после завершения — конечное состояние.

Свойство animation-play-state позволяет остановить или продолжить анимацию (возобновить с места остановки). Значения:
running — начинает или возобновляет анимацию (по умолчанию);
paused — приостанавливает анимацию.

Свойство animation-timing-function определяет, как будет происходить анимация: с какой скоростью и ускорением (динамикой или “формулой”). Значения:
ease — плавная анимация, начинается медленно затем ускоряется и к концу движения опять замедляется (по умолчанию);
linear — равномерная анимация, без ускорений и замедлений;
ease-in — анимация медленно начинается, а к концу ускоряется;
ease-out — анимация начинается быстро, а к концу замедляется;
ease-in-out — анимация начинается и заканчивается медленно, но происходит это интенсивнее (похоже на ease).
Задавать свои функции (формы) анимации можно с помощью функции cubic-bezier (кубических кривых Безье). А также с помощью steps — «ступенек», по которым будет идти переход. steps принимает в аргументах число_шагов и направление. При заданном направлеии start — первый шаг выполняется одновременно с началом анимации, а в случае c end — последний шаг будет выполнен вместе с завершением анимации.

Краткая запись свойства animation имеет синтаксис: animation: name duration timing-function delay iteration-count direction fill-mode play-state; . Пример:

30 примеров CSS анимации

Крутые CSS анимации

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

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

Создан на чистом CSS, без использования каких либо скриптов на JS.

Анимированный персонаж 404 от With An Es
Классный пример для 404 страницы, где разработчик работает на ошибками.

Высадка на марс от mgitch
Приземление на Марс. Сделано на CSS.

See the Pen CSS Mars Landing by Mathew Gitchell (@mgitch) on CodePen.

Мстители от mariosmaselli
Герои-Мстители на CSS прямо на вашем сайте. Круто, не правда ли?

See the Pen CSS The Avengers by mario sanchez maselli (@mariosmaselli) on CodePen.

Переключатель День/Ночь от jsndks
Теперь вы можете переключать день и ночь с CSS. Гениальная идея.

Анимация Google Now приложений от codecalm
Сторонние приложения от Google Now, теперь анимированы.

See the Pen clo clo by Judith Neumann (@judag) on CodePen.

Анимированная иконка меню от mariusbalaj
Простая идея анимированной иконки, которая меняется при прокрутке страницы.

Кнопка отправки от auginator
Кликните для потдверждения, и кнопка анимируется с загрузкой процесса, с показом результата.

Эластичный SVG сайдбар в стиле Material Design от suez
Перетащите белую полосу вправо, чтобы увидеть эластичный эффект боковой панели.

Кнопка с частицами от igcorreia
Удивительный эффект при наведении на кнопку.

Вращающаяся кнопка от hakimel
Кнопка с эффектом модального окна.

See the Pen Flipside by Hakim El Hattab (@hakimel) on CodePen.

Мотоцикл от yy
Посмотрите на движущийся мотоцикл.

See the Pen Cruisin’ by Yusuf (@yy) on CodePen.

See the Pen 3d css cube wave by Kai Waddington (@waddington) on CodePen.

Эффект написания текста от drygiel
Вот подпись которая реализована не на GIF формате, а PNG анимации с CSS3.

Подобие GIF анимации от jascha
Посмотрите как фото появляется из пикселей.

See the Pen Gif Style CSS3 Animation by Jascha Goltermann (@jascha) on CodePen.

Анимация для формы от fluxus
Анимированный карандаш появляется, когда текстовая форма в фокусе.

Разноцветный треугольник от felpedefarias
Невероятная оптическая иллюзия, реализованная на CSS3.

Анимированный динозавр Google Chrome от nickspiel
Помните того динозаврика, которого вы можете увидеть когда соединение отсутствует в популярном браузере?

CSS тряска от elrumordelaliz
Наведите курсор, чтобы посмотреть эффект тряски на объектах.

Шагающий робот от P233
Этот робот идет, и идет, и идет…

See the Pen 3D walking robot by Peiwen Lu (@P233) on CodePen.

Все о CSS анимациях

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

Это позволяет вам создавать всевозможные классные штуки, например, заставлять объекты двигаться, исчезать и появляться, изменять цвет и т.п.

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

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

Создание простой анимации

Самый простой (и самый веселый) способ узнать о CSS анимациях – просто взять готовый кусок работающего кода и потом разобраться, как все это работает. Итак, двигаемся дальше. Создаем новый HTML документ и добавляем следующий HTML и CSS код:

Если вы сделаете предварительный просмотр, то увидите чуть менее захватывающую версию примера, которого вы видели ранее.

Вы увидите отдельное, смещенное от центра облако, стоящее совершенно неподвижно:

Давайте продолжим и добавим анимацию, чтобы не умереть со скуки. Добавление анимации CSS выполняется в два шага. Первый шаг – это назначить свойство animation, а второй – установить ключевые кадры, которые определяют, что именно будет анимировано .

В созданной разметке найдите правило стиля #bigCloud и добавьте следующую выделенную строку:

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

Идем дальше и добавляем следующее правило стиля @keyframes :

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

Что это было

То, что вы только что сделали, было добавлением CSS анимации, заставившей ваше облако скакать. CSS анимация предельно проста. Она позволяет вам определить начальное состояние, несколько промежуточных состояний (они же ключевые кадры) и конечное состояние свойств того элемента, который вы желаете оживить. Движение нашего облака очень простое, поэтому изучение того, как оно « оживает », является отличным пунктом для отправления.

Первое, на что мы обратим внимание, само свойство animation:
animation: bobble 2s infinite ;

Свойство animation ответственно за установку вашей анимации. В сокращенном варианте, который вы будете обычно использовать, вы будете указывать следующие 3 величины:

  • имя вашей анимации;
  • продолжительность;
  • количество повторений анимации.

Объявление нашей анимации ничем не отличается. Имя анимации – bobble , продолжительность – 2 секунды, и она зациклена на бесконечное выполнение.

А что насчет вендорных префиксов?

Свойство animation довольно новое, поэтому многие браузеры требуют использовать с ним вендорный префикс, чтобы данное свойство работало надлежащим образом. Не захламляйте этим вашу разметку. Вместо этого пользуйтесь чем-нибудь вроде -prefix- free library , как в нашем примере, чтобы сохранить вашу разметку простой и в то же время позволить устаревшим браузерам воспроизводить вашу анимацию.

Как вы можете увидеть, объявление анимации не содержит много деталей о том, что же будет анимировано. Оно устанавливает высокоуровневое определение того, что ваша анимация будет делать, но сущность самой CSS анимации заключена в ее правиле @keyframes .

Давайте взглянем на наше правило @keyframes для более глубокого понимания:

Первая деталь, которая сразу же бросается в глаза, это структура правила. Снаружи правило содержит объявление @keyframes со следующим далее именем:

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

Эти правила стиля ключевых кадров значат намного больше, чем вы могли бы себе представить. Они содержат только такие CSS свойства как transform и animation-timing-function , значения которых будут применены, когда правило станет активным. Мы еще вернемся к этому вопросу, а пока есть одна важная деталь о правилах стиля ключевых кадров, с которой вас нужно познакомить.

Итак, все, что я объяснял до этого, было легким для понимания. А теперь обсудим кое-что, в чем немудрено запутаться. Несмотря на то, что свойство animation было объявлено в одном правиле стиля, а ваши ключевые кадры – в правиле @keyframes , они очень тесно связаны друг с другом, и один не функционирует в отсутствие другого.

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

Давайте сначала рассмотрим, как свойство animation и правило @keyframes связаны друг с другом.
Имя

Имя, которое вы дали правилу @keyframes , выступает в роли идентификатора, которым пользуется свойство animation, чтобы знать, где находятся ключевые кадры:

Это вовсе не совпадение, что наше свойство animation ссылается на bobble и имя правила @keyframes тоже bobble . Если есть какое-либо несовпадение в именах, ваша анимация не будет работать.

Продолжительность и ключевые кадры

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

Как вы помните, когда мы определяем правила стиля ключевых кадров внутри @keyframes , селектор не выражен в реальной временной величине. Это либо процентное значение, либо ключевое слово from или to :

Топ-пост этого месяца:  Правила верстки сайтов – что нужно знать

В нашем примере, процентные величины для селекторов ключевых кадров – это 0%, 50% и 100%. Они представляют собой процент завершенной анимации. Когда анимация только началась, у вас выполнено 0% от анимации. Ключевой кадр «0%» станет активным. Когда анимация достигает середины, ключевой кадр « 50% » становится активным. И наконец, в конце анимации, активизируется ключевой кадр « 100% ».

О селекторе from/to

Вместо определения 0% в роли селектора, вы можете использовать эквивалентное ключевое слово from. Для 100% есть ключевое слово to, которое тоже можно использовать как селектор. На самом деле, я не знаю, почему кто-либо захочет воспользоваться этим, но эти ключевые слова существуют, и если вы решили разобраться во всех дебрях, вам полезно знать об их существовании.

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

Значение продолжительности, которое вы определяете для свойства animation, кроме установки общего времени воспроизведения анимации, еще и помогает вам сопоставить процентные величины с действительными отрезками времени. Так обычно и делается.

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

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

В любом случае, мы посмотрели достаточно подробно, как работает простая CSS анимация. Вы узнали все о том, как объявить анимацию с помощью свойства animation, и как выглядит правило @keyframes вместе с правилами стиля ключевых кадров. Также мы посвятили немного времени пониманию того, как отдельные части кода взаимосвязаны друг с другом.

Но мы еще не закончили. Есть еще, о чем поговорить более детально. Поэтому сделайте небольшой перерыв, чтобы быть в отличном состоянии для дальнейшего изучения CSS анимаций!

Детальный взгляд на CSS свойство animation

У свойства animation есть намного больше особенностей, чем вы только что видели. Теперь, когда вы уже « запачкали руки » в создании анимации, давайте сделаем что-нибудь менее захватывающее и узнаем все о свойстве animation. Для начала расширим наше сокращенное свойство и рассмотрим его в развернутом виде. Наша сокращенная версия выглядит так:

Три свойства нашей сокращенной версии развернулись в animation-name , animation-duration и animation-iteration-count . То, что эти свойства делают, к этому времени уже должно прочно укорениться в вашем мозгу. Поэтому давайте двигаться дальше и перейдем к задачам, использующим те свойства, которые мы еще не рассматривали, а именно: animation-play-state , animation-delay , animation-direction , animation-fill-mode и animation-timing-function .

Пауза и возобновление анимации

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

Каждый желтый прямоугольник представляет собой 1 итерацию вашей анимации. Если вы поместите каждую итерацию анимации рядом с другой, то получите примерно то же самое, что я привел выше.

Если ваша анимация началась, она не остановится, пока не достигнет конца. Если ваша анимация зациклена, она просто продолжит выполняться с начала, как только достигнет конца. Этот цикл и показан в виде отдельного желтого прямоугольника.

Наша bobble анимация – живое подтверждение такого поведения.

Возможно, иногда вам не захочется, чтобы анимация вела себя подобным образом. Если вы хотите, чтобы ваша анимация не начиналась непосредственно после того, как правило стиля, содержащее определение вашей анимации, стало активным, или если вы хотите остановить вашу анимацию посередине, вы можете поколдовать со свойством animation-play-state. Это свойство позволяет переключать вашу анимацию на воспроизведение или паузу, посредством воздействия на значение running или значение paused.

По умолчанию свойство animation-play-state установлено в состояние running (воспроизведения). Вы можете установить значение paused, чтобы приостановить выполнение:

Когда анимация остановлена, она сохраняет самую последнюю вычисленную величину:

Почти как будто время остановилось. Вы можете возобновить его, установив свойство animation-play-state назад в running. При этом не произойдет внезапного перезапуска, как если бы анимация вернулась обратно в отметку 0% перед возобновлением:

Ваша анимация плавно продолжится с того места, где она была приостановлена – подобно тому, что бы вы ожидали, используя функции Play и Pause в медиаплеере.

Задержка и смещение анимации

Если вы хотите, чтобы анимация воспроизводилась, но не делала ничего в течение некоторого периода времени, то вы захотите познакомиться со свойством animation-delay . Это свойство позволяет определить, сколько секунд пройдет перед началом воспроизведения анимации.

Задержка — это не тот случай, когда задействуется ключевой кадр 0%, и затем вы ждете 5 секунд. Задержка происходит еще до того, как будет достигнут ключевой кадр 0% вашей первой итерации:

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

Есть еще кое-что, что можно сделать с этим свойством. Вместо определения положительной величины времени для animation-delay, вы можете задать с тем же успехом и отрицательное значение:

Когда вы задаете отрицательное значение, ваша анимация начинается без задержки, но со смещением длительностью, которую вы установили. Вот как будет выглядеть animation-delay со значением -.25 с:

Отрицательный знак играет роль сигнала для браузера, говоря ему о необходимости воспринимать эту величину как смещение, а не задержку. Да, это немного странно, особенно, если брать во внимание, что свойство по-прежнему называется animation-delay, но, как говорится, за что купил, за то и продаю.

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

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

Сохраняйте свойства ключевых кадров, пожалуйста!

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

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

Давайте исследуем два немного специфичных случая и затем посмотрим, как изменить такое поведение по умолчанию.

Ожидание начала

Первый случай имеет место, когда вы имеете дело с установкой animation-delay. Например, предположим, что вы определили 5-секундную задержку:

В течение 5 секунд ожидания ключевые кадры находятся в неактивном состоянии. Любые свойства, содержащиеся в первом ключевом кадре, не будут применены, пока задержка активна.

Анимация завершена

Второй случай – это, когда ваша анимация завершилась. Скажем, вы задали 3 повтора для вашей анимации:

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

Знакомимся с animation-fill-mode

Если вы хотите, чтобы свойства начального ключевого кадра были применены уже во время задержки, или свойства последнего ключевого кадра сохранились по завершению анимации, вы можете установить свойство animation-fill-mode . Вы можете задать такие значения:

  • none
    Все остается по-прежнему. Если вы хотите применить значения свойств ключевого кадра, этот ключевой кадр должен быть активен;
  • forwards
    После того, как анимация завершится, любые значения свойств, имевшиеся в конце анимации, будут сохранены;
  • backwards
    Анимация применит значения для свойств из начального ключевого кадра, даже если кадр еще не активен;
  • both .

Это комплексное решение. Ваша анимация и применит значения к свойствам первого ключевого кадра в начале, и сохранит значения свойств последнего ключевого кадра в конце.

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

Вот почему я никогда не проводил ночей напролет, беспокоясь об этом, поэтому и вы не должны чувствовать себя обязанными объявлять свойство animation-fill-mode, если вы не хотите этого.

Реверс анимации (или перемена направлений)

Теперь давайте разберемся в одном немного странном свойстве. Анимация воспроизводится по умолчанию непрерывно от 0% до 100%. У вас есть возможность поменять такой порядок, установив свойство animation-direction в одно из следующих состояний: normal , reverse , alternate или alternate-reverse .

То, что делают normal и reverse, должно быть и так понятно, давайте рассмотрим более интересные значения: alternate и alternate-reverse.

Когда вы устанавливаете значение alternate-reverse для свойства animation-direction, ваша анимация начинается как обычно. Начиная со второй итерации, она меняет направление на противоположное, что повторяется для каждой последующей итерации:

Установка animation-direction в просто alternate даст похожее с небольшим отличием поведение:

Ваша анимация начнется с реверса, а затем будет менять направление между нормальным и противоположным.

Вольно, солдат!

Последнее свойство, связанное с анимацией, которые мы обсудим, это animation-timing-function. Эта функция позволит вам определить, как ваша анимация будет интерполировать значения свойств на отрезке времени между началом и концом. Я описал функции смягчения намного более детально в уроке Easing Functions in CSS3 (Функции смягчения в CSS3), поэтому за подробной информацией обращайтесь туда.

Сокращение анимации

То, что мы рассматривали до сих пор, является расширенным списком свойств для объявления анимации:

Кто-то, возможно, предпочтет использовать сокращенную версию свойств, когда все свойства и их значения определяются внутри самого свойства animation. Фактически, как вы помните, наша анимация bobble представлена в сокращенной форме:

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

Просто подставляем соответствующую величину для свойства, заключенного в угловые скобки. Заметьте, что свойство animation-play-state не может быть записано в сокращенном варианте. Вам нужно будет явно записать это свойство и его значение.

Так или иначе, заменив наш расширенный вариант на сокращенный, мы получим следующее:

Сокращенная версия выглядит более компактно, чем эквивалентная ей расширенная версия? Безусловно! Она более понятна? А вот на этот вопрос сложнее найти ответ. Все зависит от ваших (или вашей команды) предпочтений.

В большинстве случаев мне нравится пользоваться сокращенной версией для определения свойств animation-name , animation-duration и animation-timing-function , которые мне легко запомнить. Как только я выхожу за пределы значений этих трех свойств, мне приходится обращаться к документации, чтобы узнать, на что ссылаются дополнительные величины.

Ваш разбег в объявлении свойств может варьироваться с учетом ваших взглядов на форму записи (сокращенная или расширенная), так что используйте то, с чем вы чувствуете себя комфортно. И…блестяще уяснив эту часть, самое время попрощаться с детальным разбором свойства animation и сосредоточиться на других достопримечательностях нашего нескончаемого живописного путешествия по стране анимации.

Взглянем на ключевые кадры

Большую часть времени мы провели, разбираясь в свойстве animation, и в том, как оно влияет на анимацию. А настоящие герои CSS анимации – это ключевые кадры. Поэтому давайте уделим им максимум внимания в этой секции.

Скажем привет (снова) ключевым кадрам bobble:

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

Это не такая уж плохая новость, я уверен, что свойства, которые вы хотели использовать в вашем ключевом кадре, входят в список разрешенных для анимации. Вы можете посмотреть полный список « анимируемых » свойств здесь и несколько дополнительных здесь (обратите внимание на значение в колонке, помеченной как Anim.)

Последнее, что нам нужно посмотреть, это свойство animation-timing-function , которое вы также можете задать в ключевом кадре.

Это свойство определяет переход из текущего ключевого кадра в следующий. Обращаясь к нашему примеру, в ключевом кадре 0% animation-timing-function установлено в значение в ease-in:

Эта функция времени будет активна, когда анимация перейдет от 0% к следующему ключевому кадру с отметкой 50%. Более того, animation-timing-function, объявленная в ключевом кадре 50%, станет активной при переходе от 50% к 100%. С учетом того, что функция времени работает между текущим ключевым кадром и следующим, объявление временной функции в ключевом кадре 100% не имеет смысла.

Топ-пост этого месяца:  Откройте свои данные ботам с помощью микроданных

Повторное использование ключевых кадров

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

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

В ваш текущий HTML документ, содержащий только одно покачивающееся облако, добавьте выделенные строки:

Как только вы добавили и выделенное правило стиля #smallCloud , и второй элемент img, сделайте предварительный просмотр страницы. Если все было сделано правильно, вы увидите два счастливо покачивающихся облачка, похожих на те, что вы видели в примере в начала этого урока.

Теперь, когда ваш пример работает, давайте посмотрим, как же нам это удалось. Хитрость заключается в объявлении animation в нашем правиле стиля #smallCloud :

Заметьте, что мы ссылаемся точно то же правило @keyframes по имени bobble. Единственным отличием между этим объявлением анимации и объявлением в правиле стиля #bigCloud является продолжительность. Продолжительность анимации, применяемой к маленькому облаку, – 4 секунды, в 2 раза больше, чем к большому облаку:

Это значит, что свойства, которые вы определили в ключевых кадрах bobble, будут применены к обоим нашим облакам. Разница только в том, что в одной анимации эти ключевые кадры воспроизводится в течение 2 секунд, а в другой – в течение 4 секунд:

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

Объявление нескольких анимаций

И последняя вещь (да-да, правда, последняя), которую мы по-быстрому разберем – как объявить несколько анимаций в одном свойстве animation. В сокращенной форме объявления мы просто перечисляем каждую анимацию через запятую, вот так:

Заметьте, что каждая анимация указывает на разное правило @keyframes . Если по какой-то причине вы решите указывать на одно и то же правило @keyframes из одного объявления свойства animation, то согласно порядку приоритетов в CSS, в силу вступит самое последнее объявление.

Объявляя анимацию в расширенной версии, вы бы сделали следующее:

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

Свойство animation в CSS – это очень важное свойство, о котором нужно знать больше, особенно, если вы хотите оживить ваш контент.

Данная публикация представляет собой перевод статьи « All About CSS Animations » , подготовленной дружной командой проекта Интернет-технологии.ру

Простые анимации с помощью @keyframes

Сегодня для вас подробный набор туториалов о том как легко можно делать CSS анимации с помощью @keyframes , а также про анимации в целом.

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Поиск

uWebDesign настоятельно рекомендует!

Темы к ближайшему подкасту (6 комментариев)

Предлагайте свои темы для выпуска #214 в комментариях!

Animating keyframes with transition for rotation in CSS3

I’m trying out a simple example of continuous spin animation (infinite) using steps, but I cannot seem to make a smooth transition between states. So what I’m trying is to animate the rotation (infinite) of a textbox from 0 to 360 degrees, with pause between each step: demo jsfiddle. But jump is instant, I cannot make them transition smooth from one to another. How can I achieve this, using only CSS?

My code so far is:

2 Answers 2

The effect that you are trying to achieve is not something that can be achieved with steps() function as far as I am aware because the steps function works like a stair-case with one sharp jump between each step of the animation.

You’d need to manually write the keyframes such that there is a smooth movement between the start and end points of a step which is then followed by a pause till the next step starts. The below snippet does this and this is how:

  • At 0%, the rotation is specified as 0 degree and at 1.66% of the animation’s duration, the rotation is specified as 12 degree (1/30th). This means there is a smooth rotation from 0deg to 12deg.
  • For both 1.66% and 3.33%, the rotation is specified as 12 degree. So there is no rotation between these two states (the pause).
  • Then at 4.99%, the rotation is specified as 24 degree. So between 3.33% and 4.99% the element rotates gradually from 12 deg to 24 deg. Then till 6.65%, it stays in same position and so on.

I have chosen the keyframe selectors (the percentage values) based on the no. of steps. There must be a total of 30 steps and so each step (the rotate + the pause) should be over 3.33% span. Then I’ve given equal time for the rotate and the pause, so 1.66% is when rotation completes and 3.33% is when pause completes.

If say you need 40 steps the the rotation should be increments of 9 degrees and each steps should be over 2.5% of animation’s duration. So the rotate ends at 1.25% and pause ends at 2.5% (then the next step’s rotate ends 3.75% and it’s pause ends at 5% and so on).

@keyframes

Правило @keyframes устанавливает ключевые кадры при анимации элемента. Ключевой кадр это свойства элемента (прозрачность, цвет, положение и др.), которые должны применяться к элементу в заданный момент времени. Таким образом, анимация представляет собой плавный переход стилевых свойств от одного ключевого кадра к другому. Вычисление промежуточных значений между такими кадрами берёт на себя браузер.

Самый простой вариант, когда у нас есть только два ключевых кадра — исходное и конечное состояние (рис. 1).

Рис. 1. Перемещение элемента

В таком случае @keyframes запишется в следующем виде:

В данном случае мы даём нашему набору имя box , оно затем будет задействовано в свойстве animation и определяем, что элемент будет изменять значение свойства left от 0 до 300 пикселей. Вместо ключевых слов from и to можно использовать, соответственно, 0% и 100%.

Ключевые кадры не обязательно должны начинаться с 0% и заканчиваться 100%. Анимация тогда будет происходить не сразу.

ez code

Просто о сложном.

8 простых, но эффектных примеров CSS3 анимации

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

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

В этой статье мы напишем несколько простых, но очень интересных эффектов анимации на чистом CSS3.

Все эффекты управляются CSS свойством transition, поэтому разметка для примера очень проста:

Теперь зададим высоту, ширину, цвет фона (чтобы видеть, что происходит) и свойство перехода (transition):

Свойство transition имеет три параметра: свойство к которому применяется (в нашем случае все), скорость перехода (у нас — 0.3 сек) и применяемый эффект (ease). Все это означает, что все изменения, происходящие с нашим элементом будут выполняться плавно (в течение 0.3 сек).

Осталось только изменить внешний вид элемента и анимация будет сделана за нас.

1. Fade in

Fade эффекты очень популярны, это хороший способ привлечь внимание к чему-либо.
Этот эффект реализуется в два этапа: первое, устанавливается начальное значение прозрачности; далее — изменение состояния, например, при наведении курсора:

Не забудьте присвоить класс «fade» вашему div’у.

2. Изменение цвета

Изменение цвета раньше было непростой задачей, с применением сложных математических хитростей для вычисления отдельных RGB значений и их комбинаций. Сейчас, достаточно задать соответствующий цвет с помощью CSS и плавная анимация будет сделана за нас:

3. Расширение и сужение

Для расширения элемента раньше нужно было изменять ширину (width), высоту (height) или отступы (padding), но сейчас мы можем использовать CSS свойство transform для увеличения.

Примените класс «grow» к вашему элементу и добавьте следующий код к вашим стилям:

Уменьшить элемент можно так же просто как и увеличить. Для увеличения используйте значение параметра больше 1, для уменьшения — меньше 1:

4. Вращение

CSS свойство transform имеет множество вариантов применений, один из лучших — вращение элемента. Класс «rotate»:

5. Сглаживание углов

Очень популярный эффект анимации — переход от квадратного элемента к круглому и наоборот. Этот эффект очень легко реализовать с помощью CSS: надо всего-лишь изменить свойство border-radius.
Класс «circle»:

6. 3D тень

Этот эффект достигается с помощью добавления свойства box-shadow и перемещения элемента вдоль оси x с помощью свойств transform и translate. Таким образом создается эффект поднятия элемента.
Класс «threed»:

7. Покачивание

Не все эффекты создаются с помощью свойства transition. Мы также можем создавать сложные эффекты анимации с помощью свойств @keyframes, animation и animation-iteration.

Для этого сначала надо создать анимацию в ваших стилях. Обратите внимание, что для совместимости необходимо использовать @-webkit-keyframes одновременно с @keyframes:

Эта анимация просто передвигает элемент справа налево, осталось только применить её:

8. Inset border

Один из популярных видов кнопок — кнопки без фона, но с массивными рамками. Конечно, рамки можно реализовать просто добавив свойство border, но это изменит размеры самого элемента. Это можно исправить с помощью свойства box-sizing, но легче использовать для анимации рамок свойство box-shadow.

CSS правило @keyframes

Определение и применение

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

Чтобы использовать ключевые кадры, создается правило @keyframes с произвольным именем, которое впоследствии используется в свойстве animation-name , либо в универсальном свойстве animation для добавления списка ключевых кадров в анимацию.

Каждое правило @keyframes должно содержать список стилей для селекторов ключевых кадров, каждый из которых задаёт процент для анимации, при котором происходит ключевой кадр. Указать, когда происходит смена стиля необходимо в процентах ( 0% — это начало анимации, 100% — это когда анимация завершена), или с помощью ключевых слов «from» и «to» , которые соответствуют, как 0% и 100% . Для корректного проигрывания анимации, ключевые кадры должны содержать начало цикла и его конец (значения 0% | from и 100% | to ).

Допускается перечислять ключевые кадры в любом порядке, так как браузер их обрабатывает не в порядке размещения, а в зависимости от значения процента (от меньшего значения к большему). Если анимация имеет те же начальные и конечные свойства, то вы можете перечислить их через запятую: 0%, 100% <> .

Если по какой-то причине вы решили включить в правило свойства, которые не могут быть анимированы, то они будут проигнорированы браузером, а свойства, которые могут быть анимированы будут включены в анимацию.

Свойства, указанные в ключевом кадре со значением !important игнорируются. Ознакомиться, как происходит отмена значимости стилей ( !important ) вы можете в статье «Каскадность в CSS» (раздел «Нюансы конфликтов»).

Keyframe Animation Syntax

Easily manage projects with monday.com

Basic Declaration & Usage

For the sake of brevity the rest of the code on this page will not use any prefixes, but real world usage should use all the vendor prefixes from above

Multiple steps

If an animation has the same starting and ending properties, one way to do that is to comma-separate the 0% and 100% values:

Or, you could always tell the animation to run twice (or any even number of times) and tell the direction to alternate .

Calling keyframe animation with separate properties

Animation Shorthand

Just space-separate all the indiv >

Топ-пост этого месяца:  Как закрыть страницу архива автора (тема 2, продолжение)

Combine transform and animation

Multiple animations

You can comma-separate the values to declare multiple animations on a selector.

Steps()

The steps() function controls exactly how many keyframes will render in the animation timeframe. Let’s say you declare:

If you use steps(10) in your animation, it will make sure only 10 keyframes happen in the allotted time.

The math works out nicely there. Every one second, the element will move 10px to the left and 10px down, until the end of the animation, and then again in reverse forever.

This can be great for spritesheet animation like this demo by simurai.

Browser Support

This browser support data is from Caniuse, which has more detail. A number indicates that browser supports the feature at that version and up.

Desktop

Chrome Opera Firefox IE Edge Safari
4* 12* 5* 10 12 5.1*

Mobile / Tablet

iOS Safari Opera Mobile Opera Mini Android Android Chrome Android Firefox
6.0-6.1* 12.1 No 4* 78 68

More Resources

Comments

is from & to equal to using 0% and 100%?

great information i really enjoy it thankx so much

If you use 0%, 50%, and 100% you can have in-betweens.
(ex. 0% nothing 25% grow 50% skew 75% change color 100% shrink)

Hello Chris Coyier,
The tips and tricks are nice, but if you include the demo link then it would be much helpful. For audience to view the effect live and you too to increase potential returning traffic.

Guys – this is the snippets section! It’s literally the only section of the site that doesn’t have demos/tutorials, it’s purely the grab-n-go snippets… As described!

Trust me, there is no better way to learn this stuff than to try and build your own demo.

This is even more true with JavaScript frameworks, and JSFiddle is an invaluable tool to throw down quick and dirty code to figure pieces out.

hi Adam, doesn’t the inability to do what Spence is looking for sort of defeats the purpose of animating in this way?
I’m encountering exactly the same problem. Any further thoughts on how to resolve it without hover approach?

I agree with Hiren. A demo attached to the snippets (whenever possible) would be very nice.

Agreed on the demo attached to snippets. Just something super-simple.

Hi Chris, you can use -webkit-animation-delay to delay the effects.

you can also use shorthand to set multiple declarations in one step:
http://css-infos.net/property/-webkit-animation

Just experimenting, I found the webkit delay syntax is:

Hi and many thanks for the code snippet. Can anyone please help me with the following opacity animation:

The div layer starts invisible it then animates to fully visible (after a 2second delay) and remains in that state.

Currently with the code above (including the delay code) I can only get the following:
The div layer starts visible it then animates (flashes invisible then animates) to fully visible (after a 2second delay) and remains in that state.

If I put an opacity: 0; on the div then the following occurs:
The div layer starts invisible it then animates to fully visible (after a 2second delay) and then returns to invisible.

Is what I am attempting even possible or am I just being a Muppet?

I think what you’re looking for is only possible on hover/state change. This is how you do it:

1. Put your animate attributes on the element(s) you want to animate, ie:

.box <
-webkit-transition: all 0.2s ease-in-out;
>

.box:hover <
background: red;
>

That’s it! Change as necessary.

Adam, doesn’t the inability to do what Spence is looking for sort of defeats the purpose of animating in this way?
I’m encountering exactly the same problem. Any further thoughts on how to resolve it without hover approach?

I was just scratching my head about the same question and came across this page:

I think this is what you’re looking for, you want to use forwards to make the last keyframe of your animation persist so you can make it look as if something has appeared

I also discovered if you use from and to, this behaviour is the default but it you want to use several keyframed states then it will default back to its original state unless you state the fill-mode

Just use -webkit-animation-iteration-count: 1;

cool tut
thank you

Hey Chris! Really informative snippet! You’re blog just keeps getting better and better =)

Anyway, you mistakenly repeated ‘has the same’ in “has the same starting…”

Hi there all!
I’m new to CSS and a bit stuck! I have “2” images 70px By 70px I want “1” to stay still and “2” to rotate. image “2” has just a little dot and image “1” has an inner circle and an outer circle.. So I want the little dot to rotate between the inner and outer circle.. So far I’ve done it but the dot makes a big rotation off the screen!! I don’t no if it’s the stage of my rotation or not using margin’s the right way or the perspective origin not being there or non of the above. Thanks for any help in advance and hope someone knows what I’m going on about

Hi Lee,
It looks like you have to define a different center for the rotation. When you use -webkit-transform: rotate(), you can define the center point for both 2D and 3D rotation with -webkit-transform-origin (http://css-infos.net/property/-webkit-transform-origin)

This is really nice! Thanks guys for sharing this. I’m going to try it now 🙂

I’ve lost count how many times I’ve come back to this page. A great, simple writeup.

Hello everybody!
What about overriding a @keyframe animation set? I can’t figure out if it’s possible (using chrome).
I explain myself:
I made a webapp with several CSS3 features and @keyframes named sets for UI to interact beautifully. My app is customizable by different connected users. The customization is made by importing a css file that override some colors and layouts. I want people how knows CSS3 awesomness to be able to override my standard animations (triggered via javascript). But it looks like if you write a second @keyframes with the same name than first’s, the second definition is ignored.
Any help with this?

nice content but boring site colors, Older site is much better in terms of colors

thank u chris. love it.

I can not load this page in ie8. The loading time take more…

Hi Jack
I realise in web design terms it’s a lifetime since you made your comment here but I was wondering whether you found a solution. I’ve had this problem for over a week and cannot find an answer.
Through much trial and error it appears IE8 simply will not ignore keyframes and as a result just gives up and freezes.
I’ve tried hiding the animations in a conditional comment and only serving them to IE9 + and all other browsers. Which works as expected, only as you probably know, IE10 does not support conditional comments!
Any help would be greatly appreciated…

Hi guys I want to be able to control the “frames” so I have 5 frames inside of one CSS sprite. They represent each state. I want them to play out over a specified amount of time with out the even motion in between I just want it to go from one frame to another over a specified amount of time. It’s hard for me to explain but flash has a way to do this rather easily.

Hey Chris, I think you want to use the step-start property. I used it on this animation (http://codepen.io/ScottJH/full/IAyEp). I realize this comment is over a year old, but hey, thought I’d contribute if I could.

I found your website very helpful. I learnt & implemented lot of new ideas from your site.

I was thrilled when I learnt this specific animation trick – usage of keyframes. I have implemented this to highlight the Archives on my site ABAP Help when people hover on it.

Thanks again so much for all these tutorials.

Regards,
Naimesh Patel

I have a question about combining animations – when I try the below I get either ‘leaffall’ OR ‘drop’ randomly on refresh. I was expecting both to happen simultaneously.

Anyone seen this problem?

Thank you so much for this snippet, Chris.

Regards from Brazil!

This is great! I was staying away from CSS3 animations because I thought the syntax was too difficult, but you’ve made it pretty simple to understand. Thanks.

For the infinite loop you could change the “to” value to 359deg to prevent it stopping

Its awesome, very easy to understand and a great thank for giving such a wonderful tutorial. I want to know if i want an animation (eg: text animation -fading) on sentance after another how can I achieve it. We do similar kind of text animation when we create presentations.

“The order doesn’t matter except when using both duration and delay, they need to be in that order. In the example below 1s = duration, 2s = delay, 3 = iterations.”

This doesn’t work, if you set the number of iterations to infinite.
Instead infinite has to be at the end, hasn’t it?

Thanks for this useful snippets! 🙂

It should be noted that the keyframe sequence is effectively “reset” if the element is altered via jQuery or some other thing. Keyframes for cycling through border colors for a play button on a player gets reset everytime the button switches from “play” to “pause”. For instance:

@keyframes change_border
<
0%
25%
75%
100%
>
div#player_control <
animation: change_border 66s infinite;
animation-direction:alternate;
-moz-animation: change_border 66s infinite;
-moz-animation-direction:alternate;
-webkit-animation: change_border 66s infinite;
-webkit-animation-direction:alternate;
>

This “infinite” sequence of color changing would be interrupted every time the #player_control layer was altered. This is undesirable when other things are also tied to this animation sequence, but aren’t subject to the interruption. Could also simply be undesirable.

Анимация CSS: примеры

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

В статье постараемся подробнее ознакомиться с возможностями анимации и ее применениями. А также приведем несколько интересных примеров с различными эффектами.

Поддержка браузеров.

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

Браузер Explorer Chrome Firefox Safari Opera
Версия 10.0 4.0 16.0 4.0 15.0
animation -webkit- -moz- -webkit- -webkit-

Internet Explorer 10 поддерживает без префикса. Браузер Опера распознает префикс –webkit поэтому значение -o- можно не применять.

Начальный кадр анимации.

С помощью свойства @keyframes создается начальный кадр анимации, который необходимо привязать к определенному селектору. Затем указать по крайней мере два действия:

— название анимации
— продолжительность анимации

Пример.

HTML

CSS

Примечание: Если не указана продолжительность анимации, то никаких действий не произойдёт поскольку по умолчание она равна нулю.

Как работает CSS анимация?

Анимация дает возможность переходить с одного стиля на другой при этом плавно их меняя. Изменить можно многие элементы, а главное – неоднократно, столько раз сколько нужно. Переход анимации указывается в процентах от 0% до 100% или же ключевыми словами от «from» до «to».

Пример.

HTML

CSS

Примеры анимации в логотипе.

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

Другие примеры анимации

Где еще можно применить анимацию? Да где угодно, анимация способна двигать многие веб-элементы: меню, ссылки, обычный текст и т.д. Действия практически неограниченные, даже с помощью анимации возможно заменить некоторые javascript`ы.

Добавить комментарий