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!
background-image: linear-gradient(#5187c4, #1c2f45);
background-size: auto 200%;
background-position: 0 100%;
transition: background-position 0.5s;
/* ...and various other button styles */
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.
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.