You can’t animate gradient colors in CSS. No, really. There are a lot of animatable properties, but the one used for gradients, background-image
, is not on the list.
Fortunately, if you were looking to animate a simple light-to-dark gradient fade, then there’s a decent workaround. Use background-size
to stretch your gradient to be taller than the element it’s on. Now you can animate background-position
to slide the visible portion of your gradient up and down. The end result is an element with a smoothly animated gradient background that gets lighter and darker.
Here’s the (simplified) code. Don’t forget your vendor prefixes!
button {
background-image: linear-gradient(#5187c4, #1c2f45);
background-size: auto 200%;
background-position: 0 100%;
transition: background-position 0.5s;
/* ...and various other button styles */
}
button:hover {
background-position: 0 0;
}
And here’s a demo. Actual implementation on left, visual explanation on right. Hover over the gray box to see the animation.
See the Pen Gradient Animation Trick by Will Boyd (@lonekorean) on CodePen.
Update: I’ve received a lot of feedback (here and elsewhere). Very much appreciated! Just wanted to give a quick update with more info. The CodePen has some extra markup for the sake of the demo, but all you need is the single <button>
and the CSS for it and its hover state. Chrome, Safari, and Opera have since added support to animate background-image
. Check out this dancing banana to see. However, it only works with images. Gradient backgrounds are still not animatable.