Una nueva forma de hacerlo ha estado disponible desde hace algún tiempo en los navegadores modernos.
background-blend-mode le permite obtener algunos efectos interesantes, y uno de ellos es la conversión en escala de grises
El valor de luminosidad , establecido sobre un fondo blanco, lo permite. (pase el cursor para verlo en gris)
.test {
width: 300px;
height: 200px;
background: url("http://placekitten.com/1000/750"), white;
background-size: cover;
}
.test:hover {
background-blend-mode: luminosity;
}
<div class="test"></div>
La luminosidad se toma de la imagen, el color se toma del fondo. Como siempre es blanco, no hay color.
Pero permite mucho más.
Puede animar el efecto configurando 3 capas. La primera será la imagen, y la segunda será un degradado blanco-negro. Si aplica un modo de mezcla múltiple en esto, obtendrá un resultado blanco como antes en la parte blanca, pero la imagen original en la parte negra (multiplicar por blanco da blanco, multiplicar por negro no tiene efecto).
En la parte blanca del gradiente, obtienes el mismo efecto que antes. En la parte negra del gradiente, está mezclando la imagen sobre sí misma, y el resultado es la imagen no modificada.
Ahora, todo lo que se necesita es mover el gradiente para obtener este efecto dinámico: (pase el mouse para verlo en color)
div {
width: 600px;
height: 400px;
}
.test {
background: url("http://placekitten.com/1000/750"),
linear-gradient(0deg, white 33%, black 66%), url("http://placekitten.com/1000/750");
background-position: 0px 0px, 0px 0%, 0px 0px;
background-size: cover, 100% 300%, cover;
background-blend-mode: luminosity, multiply;
transition: all 2s;
}
.test:hover {
background-position: 0px 0px, 0px 66%, 0px 0px;
}
<div class="test"></div>
referencia
matriz de compatibilidad