Назад

Свойство CSS animation. Создание анимаций

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

Что такое свойство CSS Animation?

CSS Animation — это мощный модуль каскадных таблиц стилей, который позволяет анимировать переходы между различными стилями элемента. По сути, вы создаете сценарий (ключевые кадры, или @keyframes), в котором описываете, как должны меняться CSS-свойства элемента в определенные моменты времени, а затем с помощью набора свойств animation-* настраиваете этот сценарий: задаете его длительность, количество повторений, направление и характер движения. Это дает практически безграничные возможности для оживления интерфейсов: от плавного появления кнопок и вращения логотипов до сложных интерактивных баннеров и имитации физических взаимодействий.

Ключевые кадры — @keyframes

Помимо основных свойств, стоит знать о правиле @keyframes. Это фундаментальное правило, в котором и определяется сама анимация. Здесь вы описываете, какие стили должен иметь элемент в определенные моменты времени.

Вы используете проценты для обозначения прогресса анимации: 0% — начало, 100% — конец. Также можно использовать ключевые слова from (эквивалентно 0%) и to (эквивалентно 100%). Внутри каждого ключевого кадра вы перечисля CSS-свойства, которые хотите анимировать.

@keyframes color {
    0% { background-color: red; }
    50% { background-color: blue; }
    100% { background-color: yellow; }
}

Детальный разбор всех свойств CSS Animation

Рассмотрим каждое свойство анимации максимально подробно, чтобы у вас не осталось вопросов о их применении.

animation-name — название анимации

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

Имя анимации вы придумываете сами, руководствуясь смыслом анимации (например, fadeIn, bounce, slideFromLeft). Оно должно состоять из букв, цифр, дефисов или подчеркиваний и не может начинаться с цифры. В коде это имя, указанное в animation-name, должно в точности совпадать с именем, используемым в правиле @keyframes. Можно применять несколько анимаций к одному элементу, перечисляя их названия через запятую.

div {
    animation-name: square;
}
@keyframes square {
    from { background-color: red; }
    to { background-color: blue; }
}

animation-duration — продолжительность анимации

Свойство animation-duration - определяет, сколько времени должен занимать один полный цикл анимации — от начала и до конца. Оно задает "скорость" проигрывания вашего сценария.

Значение указывается в секундах (s) или миллисекундах (ms). Например, 2s или 500ms. Если значение не задано, анимация не произойдет, так как по умолчанию оно равно 0s. Очень важно подбирать длительность анимации вдумчиво: слишком быстрая анимация может остаться незамеченной, а слишком медленная — раздражать пользователя и создавать ощущение "заторможенности" интерфейса. Стандартная длительность для большинства микровзаимодействий лежит в диапазоне от 200 до 500 миллисекунд.

0s
500ms
5s
10s
Значение по умолчанию 0s, это означает, что никакой анимации нет
Одна итерация анимации осуществится в течении 0.5 секунды
Одна итерация анимации осуществится в течении 5s секунды
Одна итерация анимации осуществится в течении 10s секунд
div {
    animation-name: square;
    animation-duration: 0s;
}
@keyframes square {
    0% { 
        left: 20px;
        background-color: red;
    }
    100% { 
        left: calc(100% - 170px);
        background-color: blue;
    }
}

animation-iteration-count — количество повторений анимации

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

Можно задать конкретное целое число (например, 1, 3) или ключевое слово infinite для бесконечного повторения. Значение по умолчанию — 1, что означает однократное проигрывание. Это свойство незаменимо для создания постоянных индикаторов загрузки (infinite), циклических уведомлений или повторяющихся фоновых эффектов. Для тонкого, ненавязчивого привлечения внимания иногда достаточно 2-3 повторений.

1
3
infinite
Значение по умолчанию - 1. Анимация проигрывается один раз
Анимация проиграится 3 раза
Анимация будет проигрываться бесконечно
div {
    animation-name: square;
    animation-duration: 5s;
    animation-iteration-count: 1;
}
@keyframes square {
    0% { 
        left: 20px;
        background-color: red;
        }
    100% { 
        left: calc(100% - 170px);
        background-color: blue;
    }
}

animation-timing-function — скорость изменения анимации

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

ease
ease-in
ease-out
ease-in-out
linear
steps(3)
cubic-bezier(0.1, 0.4, 0.8, 0.1)
Значение по умолчанию. Анимация начинается медленно, разгоняется быстро и замедляется в конце. Наиболее распространенный и естественный вариант.
Анимация начинается медленно, а затем плавно ускоряется в конце
Анимация начинается быстро и плавно замедляется в конце
Медленный старт и медленный конец, похоже на ease, но с более симметричным ускорением.
Анимация происходит равномерно на протяжении всего времени, без колебаний в скорости. Идеально для вращения или линейного движения.
Делит анимацию на n резких, дискретных шагов, а не на плавный переход. Идеально для создания sprite-анимации или эффекта "кадрирования".
Позволяет вручную задать сложную функцию скорости с помощью координат контрольных точек кривой Безье. Это дает максимальный контроль над характером движения.
div {
    animation-name: square;
    animation-duration: 5s;
    animation-iteration-count: infinite;
    animation-timing-function: ease;
}
@keyframes square {
    0% { 
        left: 20px;
        background-color: red;
        }
    100% { 
        left: calc(100% - 170px);
        background-color: blue;
    }
}

animation-direction — направление анимации

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

normal
reverse
alternate
alternate-reverse
Значение по умолчанию. Анимация воспроизводится вперед, от from (0%) к to (100%). После завершения цикла возвращается к исходному состоянию
Анимация воспроизводится в обратном направлении, от to (100%) к from (0%). После завершения цикла возвращается к исходному состоянию
Анимация сначала воспроизводится вперед (normal), а затем назад (reverse). На нечетных циклах — normal, на четных — reverse.
Анимация сначала воспроизводится назад (reverse), а затем вперед (normal). На нечетных циклах — reverse, на четных — normal.
div {
    animation-name: square;
    animation-duration: 5s;
    animation-iteration-count: infinite;
    animation-direction: normal;
}
@keyframes square {
    0% { 
        left: 20px;
        background-color: red;
        }
    100% { 
        left: calc(100% - 170px);
        background-color: blue;
    }
}

animation-delay — задержка перед началом анимации

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

Как и duration, задержка задается в секундах (s) или миллисекундах (ms). Можно использовать отрицательные значения. Если задержка положительная (2s), анимация начнется через 2 секунды. Если отрицательная (-2s), анимация начнется сразу, но как будто она уже шла 2 секунды, то есть с середины цикла. Это полезно для создания каскадных эффектов, когда несколько элементов начинают анимацию с небольшим смещением во времени.

0s
500ms
2s
Значение по умолчанию - 0s. Запускает анимацию без задержки
Анмация запустится через 0.5 секунды
Анмация запустится через 2 секунды
div {
    animation-name: square;
    animation-duration: 5s;
    animation-delay: 0s;
}
@keyframes square {
    0% { 
        left: 20px;
        background-color: red;
        }
    100% { 
        left: calc(100% - 170px);
        background-color: blue;
    }
}

animation-fill-mode — поведение после завершения анимации

Сложное, но критически важное свойство, которое определяет, какие стили применяются к элементу ДО начала анимации и ПОСЛЕ ее завершения. По умолчанию, после завершения анимация "сбрасывается", и элемент возвращается к исходным стилям. animation-fill-mode позволяет это изменить.

none
forwards
backwards
both
Значение по умолчанию. К элементу не применяются какие-либо стили. Элемент сохраняет свои исходные стили до и после анимации. Анимация не применяет стили до ее начала (animation-delay) и после завершения.
После завершения анимации элемент сохраняет стили последнего ключевого кадра (тот, который соответствует 100% или to). Это самый частый случай использования.
В течение периода задержки (animation-delay) элемент сразу же принимает стили первого ключевого кадра (0% или from). Анимация "заполняет" стили назад, до своего начала.
Применяет правила как forwards, так и backwards. Стили применяются до начала анимации (как backwards) и сохраняются после ее завершения (как forwards).
div {
    background-color: orange;
    animation-name: square;
    animation-duration: 5s;
    animation-delay: 1s;
    animation-fill-mode: none;
}
@keyframes square {
    0% { 
        left: 20px;
        background-color: red;
        }
    100% { 
        left: calc(100% - 170px);
        background-color: blue;
    }
}

animation-play-state — состояние воспроизведения

Позволяет приостанавливать и возобновлять воспроизведение анимации. Это свойство часто используется в JavaScript для динамического управления анимацией. Например, можно установить animation-play-state: paused при наведении курсора (:hover), чтобы анимация останавливалась, привлекая внимание пользователя к элементу.

running
paused
Значение по умолчанию. Анимация воспроизводится
Поставить анимацию на паузу
div {
    animation-name: square;
    animation-duration: 5s;
    animation-iteration-count: infinite;
    animation-play-state: running;
}
@keyframes square {
    0% { 
        left: 20px;
        background-color: red;
        }
    100% { 
        left: calc(100% - 170px);
        background-color: blue;
    }
}

animation — универсальное свойство (шорткат)

Это сокращенное свойство, которое позволяет записать все вышеперечисленные свойства в одной строке, что делает код чище и удобнее для чтения.

Порядок значений имеет значение. Первыми должны идти name и duration. Остальные значения можно указывать в любом порядке, но два значения времени (duration и delay) всегда интерпретируются так: первое — это duration, второе — delay.

div {
    animation: [name] [duration] [timing-function] [delay] [iteration-count] [direction] [fill-mode] [play-state];
}
@keyframes square {
    from { background-color: red; }
    to {  background-color: blue; }
}

Заключение

Свойство CSS Animation — это не просто инструмент для "украшательства". Это мощная система, которая, при грамотном использовании, значительно повышает юзабилити и визуальную привлекательность вашего веб-продукта. Комбинируя различные свойства, описанные выше, вы сможете создавать не просто движения, а целые истории и логичные, приятные глазу взаимодействия, которые выделят ваш сайт на фоне конкурентов. Начните экспериментировать, и вы откроете для себя весь творческий потенциал, который скрывает в себе CSS.