CSS Almanac

Home » CSS Almanac » Properties » A » animation

animation

The animation property is used to call and control an @keyframe animation. Like this:

.element-to-animate {
  animation: NAME-YOUR-ANIMATION 5s infinite;
}

Which refers to a keyframe like this:

@keyframes NAME-YOUR-ANIMATION {
	0%   { opacity: 0; }
	100% { opacity: 1; }
}

You'll need vendor prefixes to get good browser support:

@-webkit-keyframes NAME-YOUR-ANIMATION {
	0%   { opacity: 0; }
	100% { opacity: 1; }
}
@-moz-keyframes NAME-YOUR-ANIMATION {
	0%   { opacity: 0; }
	100% { opacity: 1; }
}
@-ms-keyframes NAME-YOUR-ANIMATION {
	0%   { opacity: 0; }
	100% { opacity: 1; }
}
#box {
     -webkit-animation: NAME-YOUR-ANIMATION 5s infinite;
     -moz-animation:    NAME-YOUR-ANIMATION 5s infinite;
     -ms-animation:     NAME-YOUR-ANIMATION 5s infinite;
}

At the time of this writing the three vendor prefixes used above are the only ones implemented. At this point it's likely that the non-prefixed version will start to get implemented soon without major changes, so you may want to consider using non-prefixed versions as well.

For the sake of brevity the rest of the code on this page will only use -webkit-, but real world usage should use all the vendor prefixes.

Multiple steps

@-webkit-keyframes fontbulger {
	0% {
		font-size: 10px;
	}
	30% {
		font-size: 15px;
	}
	100% {
		font-size: 12px;
	}
}

#box {
     -webkit-animation: fontbulger 2s infinite;
}

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

@-webkit-keyframes fontbulger {
	0%, 100% {
		font-size: 10px;
	}
	50% {
		font-size: 12px;
	}
}

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

#box {
 -webkit-animation-name: bounce;
 -webkit-animation-duration: 4s;
 -webkit-animation-iteration-count: 10;
 -webkit-animation-direction: alternate;
 -webkit-animation-timing-function: ease-out;
 -webkit-animation-fill-mode: forwards;
 -webkit-animation-delay: 2s;
}
timing-function ease, ease-out, ease-in, ease-in-out, linear, cubic-bezier(x1, y1, x2, y2) (e.g. cubic-bezier(0.5, 0.2, 0.3, 1.0))
duration & delay Xs or Xms
duration-count X
fill-mode forwards, backwards, both, none
animation-direction normal, alternate

Animation Shorthand

Just space-separate all the individual values. 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.

-webkit-animation: test 1s 2s 3 alternate backwards

Combine transform and animation

@-webkit-keyframes infinite-spinning {
  from {
    -webkit-transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(360deg);
  }
}

Multiple animations

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

.animate-this {
   -webkit-animation:
      first-animation 2s infinite,
      another-animation 1s;
}

More Resources

Browser Support

Chrome Safari Firefox Opera IE Android iOS
6+ 5+ 5+ Not yet 10+ TBD 4+

Subscribe to The Thread

  1. THIS IS SO COOL THANKS

  2. Thank you for this explanation. Great Almanac!

  3. egasimus

    Hey,

    as far as I know, Opera has also implemented animations using the -o- -prefix. Maybe this calls for an update?

    Also, using the -webkit- prefix in your examples could possibly promote the bad practice of using -webkit- only. Maybe such examples need to be changed to the prefix-free version instead?

    Best regards,
    Adam Avramov

Speak, my friend

At this moment, you have an awesome opportunity* to be the person your mother always wanted you to be: kind, helpful, and smart. Do that, and we'll give you a big ol' gold star for the day (literally).

Posting tips:
  • You can use basic HTML
  • When posting code, please turn all
    < characters into &lt;
  • If the code is multi-line, use
    <pre><code></code></pre>
Thank you,
~ The Management ~