# CSS-анимации Все современные браузеры, кроме IE9- поддерживают CSS transitions и CSS animations, которые позволяют реализовать анимацию средствами CSS, без привлечения JavaScript. Однако, как мы увидим далее, для более тонкого контроля анимации JavaScript вовсе не будет лишним. [cut] ## CSS transitions [#css-transition] Идея проста. Мы указываем, что некоторое свойство будет анимироваться при помощи специальных CSS-правил. Далее, при изменении этого свойства, браузер сам обработает анимацию. Например, CSS, представленный ниже, 3 секунды анимирует свойство `background-color`. ```css .animated { transition-property: background-color; transition-duration: 3s; } ``` Теперь любое изменение фонового цвета будет анимироваться в течение 3х секунд. При клике на эту кнопку происходит анимация её фона: ```html ``` Есть всего 5 свойств, задающих анимацию: Далее мы изучим их все, пока лишь заметим, что общее свойство `transition` может перечислять их все, в порядке: `property duration timing-function delay`, а также задавать анимацию нескольких свойств сразу. Например, при клике на эту кнопку анимируются одновременно цвет и размер шрифта: ```html ``` Далее мы рассмотрим свойства анимации по отдельности. ## transition-property Список свойств, которые будут анимироваться, например: `left`, `margin-left`, `height`, `color`. Анимировать можно не все свойства, но [многие](http://www.w3.org/TR/css3-transitions/#animatable-properties-). Значение `all` означает "анимировать все свойства". ## transition-duration Продолжительность анимации, задаётся в формате [CSS time](http://www.w3.org/TR/css3-values/#time), то есть в секундах `s` или `ms`. ## transition-delay Задержка до анимации. Например, если `transition-delay: 1s`, то анимация начнётся через 1 секунду после смены свойства. Возможны отрицательные значения, при этом анимация начнётся с середины. Например, вот анимация цифр от `0` до `9`: [codetabs src="digits"] Она осуществляется сменой `margin-left` у элемента с цифрами, примерно так: ```css #stripe.animate { margin-left: -174px; transition-property: margin-left; transition-duration: 9s; } ``` В примере выше JavaScript просто добавляет элементу класс -- и анимация стартует: ```js digit.classList.add('animate'); ``` Можно стартовать её "с середины", с нужной цифры, например соответствующей текущей секунде, при помощи отрицательного `transition-delay`. В примере ниже при клике на цифру она начнёт двигаться с текущей секунды: [codetabs src="digits-negative-delay"] В JavaScript это делается дополнительной строкой: ```js stripe.onclick = function() { var sec = new Date().getSeconds() % 10; *!* // например, значение -3s начнёт анимацию с 3й секунды stripe.style.transitionDelay = '-' + sec + 's'; */!* stripe.classList.add('animate'); }; ``` ## transition-timing-function Временнáя функция, которая задаёт, как процесс анимации будет распределён во времени, например начнётся ли анимация медленно, чтобы потом ускориться или наоборот. Самое сложное, но при небольшом изучении -- вполне очевидное свойство. У него есть два основных вида значения: кривая Безье и по шагам. Начнём с первого. ### Кривая Безье В качестве временной функции можно выбрать любую [кривую Безье](/bezier) с 4 опорными точками, удовлетворяющую условиям:
  1. Начальная точка `(0,0)`.
  2. Конечная точка `(1,1)`.
  3. Для промежуточных точек значения `x` должны быть в интервале `0..1`, `y` -- любыми.
Синтаксис для задания кривой Безье в CSS: `cubic-bezier(x2, y2, x3, y3)`. В нём указываются координаты только двух точек: второй и третьей, так как первая и последняя фиксированы. Она указывает, как быстро развивается процесс анимации во времени.